man ページには、log はコミット ログを表示し、reflog は reflog 情報を管理すると書かれています。正確には reflog 情報とは何ですか? また、ログには含まれていないものは何ですか? ログははるかに詳細に見えます。
7 に答える
git log
現在の HEAD とその祖先を示します。つまり、HEAD が指すコミットを出力し、次にその親、その親などを出力します。各コミットの親を再帰的に検索することにより、リポジトリの祖先をトラバースします。
(実際には、一部のコミットには複数の親があります。より代表的なログを表示するには、のようなコマンドを使用しますgit log --oneline --graph --decorate
。)
git reflog
HEAD の祖先をまったく横断しません。reflog は、HEAD が指しているコミットの順序付けられたリストです。これは、リポジトリの取り消し履歴です。reflog はリポジトリ自体の一部ではなく (コミット自体とは別に保存されます)、プッシュ、フェッチ、またはクローンには含まれません。それは純粋にローカルです。
余談ですが、reflog を理解するということは、リポジトリがコミットされると、リポジトリから実際にデータを失うことはないということです。誤って古いコミットにリセットしたり、誤ってリベースしたり、コミットを視覚的に「削除」するその他の操作を行ったりした場合は、reflog を使用して以前の場所を確認git reset --hard
し、その ref に戻って以前の状態を復元できます。ref はコミットだけでなく、その背後にあるすべての履歴を意味することを忘れないでください。
git log
参照 (ヘッド、タグ、リモート) からアクセス可能なコミット ログを表示します。git reflog
いつでもリポジトリで参照されている、または参照されていたすべてのコミットの記録です。
そのため、「破壊的な」操作 (ブランチの削除など) を実行すると、そのブランチによって参照された SHA1 を取り戻すために (デフォルトで 90 日後にプルーニングさgit reflog
れるローカル記録) が使用されます。
参照git config
:
gc.reflogexpire
gc.<pattern>.reflogexpire
git reflog
expire は、この時間より古い reflog エントリを削除します。デフォルトは 90 日です。
真ん中に"<pattern>
" (例: "refs/stash
") があると、設定は に一致する参照にのみ適用されます<pattern>
。
git reflog
多くの場合、「あなたのセーフティネット」と呼ばれます
問題が発生した場合、探しているものが git log に表示されない場合の一般的なアドバイスは次のとおりです。
繰り返しますが、reflog は SHA1 のローカル記録です。
対照的に、リポジトリを上流のリポジトリgit log
にプッシュすると、同じ結果が表示されますが、必ずしも同じとは限りません。git log
git reflog
Pro Git bookの説明はreflog
次のとおりです。
作業中に Git がバックグラウンドで行うことの 1 つは、reflog を保持することです。これは、HEAD とブランチの参照が過去数か月間どこにあったかを示すログです。
次を使用して、reflog を表示できます
git 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 から削除したり、エントリを期限切れにしたりすることもできます。の公式 Linux カーネル Git ドキュメントからreflog
:
このサブコマンド
expire
は、古い reflog エントリを整理するために使用されます。reflog から単一のエントリを削除するには、サブコマンドを使用し
delete
て正確なエントリを指定します (例:git reflog delete master@{2}
)。
私もこれについて興味があったので、少し詳しく説明して要約したいと思います。
git log
現在のブランチのすべてのコミットの履歴を表示します。別のブランチをチェックアウトすると、別のコミット履歴が表示されます。すべてのブランチのコミット履歴を見たい場合は、 と入力しgit log --all
ます。git reflog
カップケーキが言ったように、参照の記録を示します。コミットまたはチェックアウトが行われるたびにエントリがあります。git checkout
チェックアウトのたびにand runを使用して、2 つのブランチ間を数回切り替えてみてくださいgit reflog
。「チェックアウト」エントリとして毎回更新される一番上のエントリが表示されます。では、これらのタイプのエントリは表示されませんgit log
。
参考文献: http://www.lornajane.net/posts/2014/git-log-all-branches