削除した Git スタッシュを復元する

削除した Git スタッシュを復元する

ドロップした Git スタッシュは、ガベージコレクションで削除されるまで復元できます。ダングリングコミットを見つけ、変更を復元する方法を解説します。

Takahiro Iwasa
3 min read

Git のスタッシュは、内部ではコミットとして実装されています。そのため、スタッシュをドロップしても、参照先のオブジェクトがすぐに削除されるわけではありません。ガベージコレクションが実行されるまではダングリングコミットとしてリポジトリ内に残るため、多くの場合は復元できます。

ダングリングコミットの一覧

リポジトリ内のダングリングコミットは、以下のコマンドで洗い出せます。

Terminal window
git fsck | awk '/dangling commit/ {print $3}' >> commit_list.txt

出力は次のようになります。

dangling commit bfebf68feeebf07a86d7e3e4da77962de67c14ee
dangling commit 86f4aec78bd51c80b0fd2d5d83963a2259dc72b4
dangling commit 48fd9f8f97a577bc8a87b133f6e1dd789a692bd0
dangling commit 64ff8c33fb878afb8bf5c99c1b8d8fdfaa1b1f3c
dangling commit bdff88e13803e6c7737691aa1fb6f1e038321966

候補コミットの確認

各候補コミットの詳細は、以下のスクリプトで確認できます。

#!/bin/bash
while read line
do
git show $line
done < ./commit_list.txt

これにより、ダングリングコミットの概要が表示されます。

commit bfebf68feeebf07a86d7e3e4da77962de67c14ee
Merge: b046240 5ee731a
Author: Takahiro Iwasa <[email protected]>
Date: Fri Feb 12 22:01:47 2016 +0900
On develop: 0212

選択したコミットの復元

コミットの概要を確認し、日時とコミットメッセージを手がかりに復元対象のコミットを特定します。

対象を特定できたら、git cherry-pick を使って変更を復元します。

Terminal window
git cherry-pick -n -m1 <YOUR_COMMIT_ID>

まとめ

ドロップしたスタッシュを復元するには、ダングリングコミットを一覧表示し、候補を確認して、正しいコミットを cherry-pick します。git fsck | awk '/dangling commit/ {print $3}' を実行すると、確認対象となるコミット ID を絞り込めます。Git はスタッシュをドロップした時点ではオブジェクト自体を削除せず、そのオブジェクトを指す参照だけを削除するためです。

各候補に対して git show を実行し、作成者、日時、メッセージを確認すれば、事前にハッシュ値を知らなくても対象のコミットを特定できます。git cherry-pick -n -m1 を使うと、新しいコミットを作成せずに変更内容を作業ツリーへ再適用できます。

ただし、この方法を使えるのは、ガベージコレクションによって到達不能なオブジェクトが削除されるまでです。git gc の実行後は復元できない場合があります。

About the author

Takahiro Iwasa

Takahiro Iwasa

Software Developer

This blog shares technical notes from hands-on projects—architecture, implementation, and AWS service integrations.