1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Git】誤ってgit stash popで消してしまった変更を復元

1
Posted at

はじめに

実装中に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が消えてしまうとパニックになってしまいますが落ち着いて対処しましょう!
今回の手順が困っている方の助けになったら幸いです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?