私は自分のブランチにいくつかの変更を加えましたが、そのブランチに必要な他の変更を隠していたことを忘れていたことに気付きました。私が欲しいのは、隠した変更を現在の変更とマージする方法です。
これを行う方法はありますか?
便宜上、私は最終的にあきらめて、最初に現在の変更をコミットし、次に隠した変更をコミットしましたが、一挙にそれらを取得することを好みました。
実行中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 つのコミットを押しつぶすことができますが、それは価値のあるより多くの問題になる可能性があります。
私が欲しいのは、隠した変更を現在の変更とマージする方法です
これを行う別のオプションを次に示します。
git stash show -p|git apply
git stash drop
git stash show -p
最後に保存されたスタッシュのパッチが表示されます。git apply
適用します。マージが完了したら、マージされた stash を でドロップできますgit stash drop
。
@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^
。
別のオプションは、ローカルのコミットされていない変更の別の「git stash」を実行してから、2 つの git stash を結合することです。残念ながら、git には 2 つの stash を簡単に結合する方法がないようです。したがって、1 つのオプションは、2 つの .diff ファイルを作成し、両方を適用することです。