1. ホーム
  2. git

[解決済み] Gitで落としたスタッシュを復元する方法とは?

2022-03-15 21:17:41

質問

をよく使います。 git stashgit stash pop を使用して、私の作業ツリーの変更を保存および復元します。昨日、私の作業ツリーにいくつかの変更をため込んでポンと置いたのですが、その後、さらに作業ツリーに変更を加えました。昨日の隠した変更を戻って確認したいのですが git stash pop は、関連するコミットへの参照をすべて削除しているように見えます。

を使用する場合、私はそれを知っています。 git stash では .git/refs/stash には は、stash を作成するために使用されたコミットの参照です。また .git/logs/refs/stash には以下のものが含まれます。 は、隠し場所全体です。しかし、これらのリファレンスは git stash pop . そのコミットがまだ私のリポジトリのどこかにあることは知っていますが、それが何であったかはわかりません。

昨日のstashのコミット参照を簡単に復元する方法はありますか?

なぜなら、私は毎日バックアップをとっており、昨日の作業ツリーに戻って自分の変更を取得することができるからです。もっと簡単な方法があるはずなので、質問させていただきました。

解決方法は?

落としたスタッシュコミットのハッシュが分かれば、それをスタッシュとして適用することができます。

git stash apply $stash_hash

あるいは、そのための別のブランチを

git branch recovered $stash_hash

あとは、通常のツールで好きなことをすればいい。終わったら、枝を吹き飛ばせばいいんです。

ハッシュを探す

ポチったばかりで、端末がまだ開いている場合は、以下のようになります。 で出力されるハッシュ値が残っています。 git stash pop 画面上 (Doldaさん、ありがとうございます)。

その他、Linux、Unixではこれを使って、WindowsではGit Bashを使って見つけることができます。

git fsck --no-reflog | awk '/dangling commit/ {print $3}'

...または、WindowsのPowershellを使用します。

git fsck --no-reflog | select-string 'dangling commit' | foreach { $_.ToString().Split(" ")[2] }

これは、コミットグラフの先端にある、どのブランチやタグからも参照されなくなったコミットをすべて表示します。これまでに作成したすべての stash コミットを含め、失われたコミットはこのグラフのどこかにあるはずです。

欲しいスタッシュコミットを見つける最も簡単な方法は、おそらくこのリストを gitk :

gitk --all $( git fsck --no-reflog | awk '/dangling commit/ {print $3}' )

...または、以下を参照してください。 エムラジンからの回答 Windows版Powershellを使用している場合。

リポジトリブラウザが起動し、次のように表示されます。 リポジトリにあるすべてのコミット 到達可能かどうかに関係なく。

を置き換えることができます。 gitk を次のように変更します。 git log --graph --oneline --decorate もし、別のGUIアプリよりもコンソール上の美しいグラフを好むなら。

stashコミットを見つけるには、このようなコミットメッセージを探してください。

        のWIP somebranch : commithash いくつかの古いコミットメッセージ

備考 : を実行したときにメッセージを指定しなかった場合、コミットメッセージはこの形式("WIP on"で始まる)にのみなります。 git stash .