219

私は自分のブランチにいくつかの変更を加えましたが、そのブランチに必要な他の変更を隠していたことを忘れていたことに気付きました。私が欲しいのは、隠した変更を現在の変更とマージする方法です。

これを行う方法はありますか?

便宜上、私は最終的にあきらめて、最初に現在の変更をコミットし、次に隠した変更をコミットしましたが、一挙にそれらを取得することを好みました。

4

8 に答える 8

74

実行中git stash popまたはgit stash apply本質的にマージです。stash で変更されたファイルが作業コピーでも変更されていない限り、現在の変更をコミットする必要はありません。その場合、次のエラー メッセージが表示されます。

error: Your local changes to the following files would be overwritten by merge:
       file.txt
Please, commit your changes or stash them before you can merge.
Aborting

その場合、stash を現在の変更に 1 つのステップで適用することはできません。変更をコミットし、スタッシュを適用し、再度コミットし、2 つのコミットgit rebaseが本当に必要ない場合は、これらの 2 つのコミットを押しつぶすことができますが、それは価値のあるより多くの問題になる可能性があります。

于 2012-07-26T18:45:13.540 に答える
29

私が欲しいのは、隠した変更を現在の変更とマージする方法です

これを行う別のオプションを次に示します。

git stash show -p|git apply
git stash drop

git stash show -p最後に保存されたスタッシュのパッチが表示されます。git apply適用します。マージが完了したら、マージされた stash を でドロップできますgit stash drop

于 2016-12-29T15:22:17.130 に答える
0

@Brandan で提案されているように、回避するために必要なことは次のとおりです。

error: Your local changes to the following files would be overwritten by merge:
       file.txt
Please, commit your changes or stash them before you can merge.
Aborting

次のプロセスに従います。

git status  # local changes to `file`
git stash list  # further changes to `file` we want to merge
git commit -m "WIP" file
git stash pop
git commit -m "WIP2" file
git rebase -i HEAD^^  # I always use interactive rebase -- I'm sure you could do this in a single command with the simplicity of this process -- basically squash HEAD into HEAD^
# mark the second commit to squash into the first using your EDITOR
git reset HEAD^

に完全にマージされたローカルの変更が残り、fileさらなる作業/クリーンアップを行うか、単一の適切なコミットを行う準備が整います。または、 のマージされた内容fileが正しいことがわかっている場合は、適切なメッセージを書いて をスキップできますgit reset HEAD^

于 2016-01-13T16:15:59.223 に答える
-1

別のオプションは、ローカルのコミットされていない変更の別の「git stash」を実行してから、2 つの git stash を結合することです。残念ながら、git には 2 つの stash を簡単に結合する方法がないようです。したがって、1 つのオプションは、2 つの .diff ファイルを作成し、両方を適用することです。

方法: https://stackoverflow.com/a/9658688/32453

于 2016-05-13T20:52:23.040 に答える