普段はフロントエンドエンジニアとして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を復活させることが出来ます。
本日はここまでとなります。
■ 参考文献