Gitの操作ミスなら、復旧できる...
git reflogで...
git reflog vs git log
git log、git status等は知っているけどgit reflogは何ですか?
logはブランチのコミットの履歴
git logは、現在のブランチに対するrefs(ヘッド、タグ、リモート)からアクセス可能なコミットの洗練された履歴を表示します。
別のブランチをチェックアウトすると、別のコミット履歴が表示されます。
※ すべてのブランチのコミット履歴を確認したい場合は、git log --allと入力します。
reflogはロカルリポシトリの履歴
git reflogは、ロカルリポジトリで指示された、または指示されているすべてのコミットのロカル記録です。
コミット又はチェックアウトが行われるたびにエントリがあります。
そのため、「破壊的な」操作(ブランチの削除など)を実行するときに、そのブランチによって指示されたSHA1のハッシュを取得するために、git reflog(デフォルトで90日後にプルーニングされるローカル記録)が使用されます。
セーフティネット
reflogは、修正した内容とリセットしたコミットを追跡するため、くれるコミットIDでコミットを戻って見つけることができます。リポジトリから古いコミットが削除されていなかったら、logに表示されなくなったアイテムを復活させることができます。不注意で失ったと思った何かを取り戻す必要があるとき、git reflogは時々命の恩人になります。
取り戻しの巻
昨日はコミットした後でリモートのプッシュの失敗に気付かなくて別なブランチに代わってハードリセットした後で仕事の一日分を失ったと思たら先輩から「Gitの操作ミスなら、復旧できるかもしれないですよ。 git reflog
で、コミットのハッシュを見つければcheckoutなどできるので...」と言われました。
下記のステップで失ったコードを取り戻しました:
1. reflogを表示
PS C:\Users\owner\My-project-root> git reflog
2. コミットに戻る
PS C:\Users\owner\My-project-root> git checkout x9xx99x
3. 新しいブランチ作成
PS C:\Users\owner\My-project-root> git switch -c feat-dev
4. リモートリポジトリにプッシュ
PS C:\Users\owner\My-project-root> git push -f origin feat-dev
5. 助かりました!
プルーニングの有効期限
プルーニングの有効期限は、構成設定gc.reflogExpireから取得され、デフォルトで90日になります。