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日になります。