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


186

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

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


2
あなたはgit stash pop最初にコミットすることなしに許可されることになっているわけではありません。それを達成するために何をしましたか?
Chris Jester-Young

正直なところ確信が持てません(これは昨日でした)。競合があったため、マージ自体はコミットしませんでした。その後、どういうわけかスタッシュポップを実行することができました。
nren

1
私はこれをgitバージョン1.7.9.msysgit.0を使用して知っていました。私はunstagedファイルを持っていたとstash popはただのすべてを統合しました。
PandaWood

git stash pop2.25.0.windows.1バージョンのgit
Artem Hevorhian

変更をインデックス化stash pop/applyし、コミットを行う前に実行したときにそれらを失った場合、を起動できますgit fsck --lost-found。このコマンドは、ステージングされたがどこにもコミットされていない(したがって、ぶら下がっている)ぶら下がっているblob(git用語に精通していない人のための実際のファイル)を反復処理し、.git / lost-found /ディレクトリの下に配置しgit showます。これらがあなたが探しているファイルである場合。
アルテムHevorhian

回答:


69

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


6
うわー、うまくいった。私はgit fsck --no-reflog | awk '/dangling commit/ {print $3}'(リンクから)stashコミットを見つけることができました、そしてその差分から手動で問題を見つけました。ありがとう!
nren

1
fsckは巨大なリストを出力します。すべてのSHA1をgit showするのは面倒です。これどうやってやるの ?
meson10 2013年

5
@ meson10:残念ながら、スタッシュはreflogに保存されます。これは、ポップされたスタッシュの履歴を確認するための明らかな方法です(実際のブランチの場合)。また、反対票を投じる+助けを求めるのは最善の戦略ではないことをお伝えします。
ベンジャクソン

2
それを正しくするのに少し手間がかかりました。これが私の仕事の結果です:git diff -p ${STACH_SHA1}~1 ${STASH_SHA1} | patch -R -p1; git show提案されたとおりに試してみましたが、その出力はパッチに適していませんでした。また、ファイルの前に配置されて-p1いるa/..およびb/..要素を削除するためにパッチを適用するオプションを提供する必要がありました。git diffそうしないと、リポジトリルートからのパスが解決されません。提案:パッチで遊ぶ前に、注意して、別のブランチで混乱をコミットしてください。
バシリコーデ2017

@BenJacksonあなたの答えで「常に」は両方stash popを意味しstash push、変更をインデックスと作業ディレクトリに保存するコミットをトリガーしますよね?
アルテムHevorhian

36

から 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

これは、同じシナリオで受け入れられた回答よりも優れています。


13
「WIP」の検索を含む多くのソリューションは、デフォルトのstashメッセージに依存していることに注意してください。stashに明示的なメッセージを与えると、WIPが含まれない場合があります。
ベンジャクソン

ありがとう。オプション--onelineをlogコマンドに追加して、読みやすさを向上させました。
basslo

これは、stashコミットのSHAを見つけるのに役立つだけです。しかし、受け入れられた回答(git diff SHA〜1 SHA | patch -R)からの@basilikodeコメントと統合すると、正常に動作します。最初にパス--dry-runを使用して確認することをお勧めします。
Jarek C

3

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

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

その後、あなたはあまりにも早く落としたスタッシュからの変更だけを残されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.