Git

Git stashをコミットせずに消してしまった時の対処法

マナビト
マナビト
こんにちはマナビトです。
普段はフロントエンドエンジニアとしてJavaScript/TypeScript/Aangular/GraphQLを
メインに開発業務を行なっています。

Git stashをして、pullなどをした後にそのstashを復活させることなく、消してしまった時の対処方法です。

git fsck

まずは、「git fsck」コマンドを打ち込んで、Git stashの経歴を確認します。

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

「git fsck」は、リポジトリの正当性をチェックするコマンドになります。

Verifies the connectivity and validity of the objects in the database

この「git fsck」はdanglingオブジェクトと呼ばれるテンポラリオブジェクトも一緒に検出します。このdanglingオブジェクトはリポジトリに変更を加える際に生成される中間ファイルのようなもので、git addやcommitなどでファイルに変更を加えた場合に残されるものです。「git fask」にdangling commitをパイプで付け加えることで、stashの経歴を確認、検証することが出来る様になります。

検索結果は以下の通りコミットIDの一覧が表示されます。

Checking object directories: 100% (256/256), done.
Checking objects: 100% (84588/84588), done.
ea5f80cb85054114fa15dc80df21806a1683473b
cd89b0b521e66dc8f3f9d86203dcfb70ac7a75bb
fbaee0e268b199f0180e1feb665237f0abf96f1b
・
・
・

git cat-file -p

これらの検索結果を元に、どのstashを削除してしまったか確認していきます。
「 git cat-file -p [hash値] 」で指定したオブジェクトの内容を出力することができます。

git cat-file -p ea5f80cb85054114fa15dc80df21806a1683473b

コミット実行者やチェクアウト時のコメントが返ってきます。

tree b868439a32ad75bea7ebab22dc9f1436519529de
parent 55a8434c694dbd693c87f5656d821009e811260c
parent 95cc7eaceb010f3a8429a1dee495d0cd4348d2a9
author  <--local> 1646881319 +0900
committer <--local> 1646881319 +0900
On #6618: 3月10日 12時 ステージングにチェックアウトするため% 

git cherry-pick

消してしまったGit stashを特定することが出来たら、 git cherry-pick [コミットID] 」を使用して、復活させることが出来ます。「 git cherry-pick 」は別のブランチから今いるブランチへ、必要なコミットだけをコピーできるコマンドです。

git cherry-pick -n -m1 ea5f80cb85054114fa15dc80df21806a1683473b

これで、消してしまったGit stashを復活させることが出来ます。
本日はここまでとなります。

■ 参考文献

COMMENT

メールアドレスが公開されることはありません。