web-dev-qa-db-ja.com

偶発的なgit stash popを元に戻す

複雑なマージを行う前にいくつかのローカルの変更を隠し、マージを行った後、git stash popを実行する前に愚かなコミットを忘れていました。このポップにより、追跡が困難であることが判明しているいくつかの問題(大きなコードベースでの悪いメソッド呼び出し)が作成されました。 git stash showを実行したので、少なくともどのファイルが変更されたかはわかります。他に何もなければ、これはもっとコミットするためのレッスンだと思います。

私の質問:マージを元に戻すことなくスタッシュポップを元に戻すことは可能ですか?

172
nren

Gitでドロップしたスタッシュを復元する方法 を使用して、ポップしたスタッシュを見つけてみてください。 stashには常に2つのコミットがあると思います。これは、インデックスと作業コピーを保持するためです(インデックスコミットは空になることがよくあります)。次に、git showで差分を表示し、patch -Rを使用してそれらの適用を解除します。

66
Ben Jackson

git stash --helpから

Recovering stashes that were cleared/dropped erroneously
   If you mistakenly drop or clear stashes, they cannot be recovered through the normal safety mechanisms. However, you can try the
   following incantation to get a list of stashes that are still in your repository, but not reachable any more:

       git fsck --unreachable |
       grep commit | cut -d\  -f3 |
       xargs git log --merges --no-walk --grep=WIP

これは、同じシナリオで受け入れられた答えよりも私を助けました。

34
kachar

マージがそれほど複雑ではない場合、別のオプションは次のようになります。

  1. 「git stash」を使用して、マージ変更を含むすべての変更をstashに戻します
  2. マージを再度実行し、変更をコミットします(ドロップされたスタッシュからの変更なし)
  3. 「git stash pop」を実行します。ファイルは現在同一であるため、以前のマージからのすべての変更を無視します。

その後、ドロップしたスタッシュからの変更のみが残ります。

1
markus