マニュアルページには、ログにはコミットログが表示され、reflogはreflog情報を管理すると書かれています。 reflog情報とは何ですか?また、ログにはないものは何ですか?ログははるかに詳細に見えます。
git log
は、現在のHEADとその祖先を示します。つまり、HEADが指すコミットを出力し、次にその親、その親などを出力します。各コミットの親を再帰的に検索することにより、リポジトリの祖先を逆方向にたどります。
(実際には、一部のコミットには複数の親があります。より代表的なログを表示するには、git log --oneline --graph --decorate
。などのコマンドを使用します)
git reflog
はHEADの祖先をまったく横断しません。 reflogは、HEADが指しているコミットの順序付きリストです。これは、レポの取り消し履歴です。 reflogはリポジトリ自体の一部ではなく(コミット自体とは別に保存されます)、プッシュ、フェッチ、またはクローンには含まれません。それは純粋にローカルです。
それ以外に:reflogを理解することは、コミットされたリポジトリからデータを実際に失うことができないことを意味します。 reflogを使用して以前の場所を確認し、その参照にgit reset --hard
戻って以前の状態を復元できます。参照はコミットだけでなく、その背後にある履歴全体を意味します。
git log
は、ref(ヘッド、タグ、リモート)からアクセス可能なコミットログを示しますgit reflog
は、リポジトリでいつでも参照されているか参照されたすべてのコミットのrecordです。そのため、git reflog
(デフォルトで90日後に枝刈りされるlocal記録)は、「破壊的な」操作(ブランチの削除など)を行うときに使用されます。そのブランチによって参照されたSHA1をバックアップします。
参照 git config
:
gc.reflogexpire
gc.<pattern>.reflogexpire
git reflog
expireは、この時間より古いreflogエントリを削除します。デフォルトは90日です。
「<pattern>
」(例:「refs/stash
」)を使用すると、設定は<pattern>
に一致する参照にのみ適用されます。
git reflog
は、「 あなたのセーフティネット 」として参照されることがよくあります。
トラブルが発生した場合、git logで探しているものが表示されない場合の一般的なアドバイスは次のとおりです。
「 落ち着いて
git reflog
を使用」
繰り返しますが、reflogはSHA1のローカル記録です。git log
とは対照的に、レポジトリを アップストリームリポジトリ にプッシュすると、同じgit log
が表示されますが、必ずしも同じgit reflog
ではありません。
離れている間Gitがバックグラウンドで行うことの1つは、reflogを保持することです。これは、過去数か月間HEADおよびブランチの参照があった場所のログです。
git reflog
を使用すると、reflogを表示できます。$ git reflog 734713b... HEAD@{0}: commit: fixed refs handling, added gc auto, updated d921970... HEAD@{1}: merge phedders/rdocs: Merge made by recursive. 1c002dd... HEAD@{2}: commit: added some blame and merge stuff 1c36188... HEAD@{3}: rebase -i (squash): updating HEAD 95df984... HEAD@{4}: commit: # This is a combination of two commits. 1c36188... HEAD@{5}: rebase -i (squash): updating HEAD 7e05da5... HEAD@{6}: rebase -i (pick): updating HEAD
何らかの理由でブランチヒントが更新されるたびに、Gitはその一時的な履歴にその情報を保存します。また、このデータで古いコミットを指定することもできます。
reflog
コマンドを使用して、古いエントリをreflogから削除したり、エントリを期限切れにすることもできます。 reflog
の公式Linux Kernel Gitドキュメント から:
サブコマンド
expire
は、古いreflogエントリを整理するために使用されます。Reflogから単一のエントリを削除するには、サブコマンド
delete
を使用し、正確なエントリを指定します(例:git reflog delete master@{2}
)。
私もこれに興味があり、少し詳しく説明したいと思います。
git log
は、現在のブランチに対するすべてのコミットの履歴を表示します。別のブランチをチェックアウトすると、別のコミット履歴が表示されます。すべてのブランチの履歴をコミットしたい場合は、git log --all
と入力してください。
git reflog
は、カップケーキが言ったようにあなたの参照の記録を示します。コミットまたはチェックアウトが完了するたびにエントリがあります。 git checkout
を使用して2つのブランチを何度か切り替え、各チェックアウト後にgit reflog
を実行してみてください。一番上のエントリは、「チェックアウト」エントリとして毎回更新されます。 git log
にこれらのタイプのエントリは表示されません。
参照: http://www.lornajane.net/posts/2014/git-log-all-branches
実際、reflogはのエイリアスです
git log -g --abbrev-commit --pretty=oneline
答えは次のとおりです。特定のケースです。