はじめに
実装中にgit stash applyを実行したつもりが、誤ってgit stash popしてしまいました。
削除してしまった変更を復元することができたため、手順を記します!
事象
誤って以下を実行してしまい、stashが削除された。
$ git stash pop
git stash listを見ても、何も表示されない。。。
前提
- Gitでローカルリポジトリを使用している
- stashの内容をコミットしていなかった
-
.gitフォルダが削除されていない
解決法
1. Git内部の浮いているコミットを探す
まず、Gitの内部でまだ保持されている可能性のあるデータを確認します。
$ git fsck --no-reflogs | grep stash
結果が出ない場合は、より広く「dangling commit(浮いたコミット)」を探します
$ git fsck --no-reflog | awk '/dangling commit/ {print $3}'
2. コメントから目的のstashを特定する
すべてのコミットの中から、stashに設定したコメントを含むものを探します。
$ for c in $(git fsck --no-reflog | awk '/dangling commit/ {print $3}'); do
git show -s --format="%h %s" $c;
done | grep "テストコメント"
結果例:
b93280b7 On feature/now: テストコメント
このハッシュ(b93280b7)が、削除されたstashの実体。
3. stash の中身を確認
$ git show b93280b7
diff --git ... が出ていれば、その中身が自分のstashの変更。
4. 復元用のブランチを作る
いきなり作業ブランチに適用せず、安全のため別ブランチに展開します。
$ git checkout -b recover-stash b93280b7
これで、recover-stash ブランチに削除された stash の内容が復元されます。
5. 元のブランチに戻してマージ(通常の復元)
もしこの変更を作業ブランチに統合したい場合は、以下を実行。
元のブランチに戻る
$ git checkout feature/now
復元ブランチをマージ
$ git merge --no-ff recover-stash -m "復元: テストコメント"
これで履歴上に「復元: テストコメント」というコミットが追加され、完全復元です。
コミットしたくない場合(変更だけ残す)
- 直前のコミット(復元コミット)を取り消して変更を残す
$ git reset --soft HEAD~1
- 復元が完了したら、一時的に作った recover-stashブランチを削除
$ git branch -d recover-stash
まとめ
stashが消えてしまうとパニックになってしまいますが落ち着いて対処しましょう!
今回の手順が困っている方の助けになったら幸いです。