201

man ページには、log はコミット ログを表示し、reflog は reflog 情報を管理すると書かれています。正確には reflog 情報とは何ですか? また、ログには含まれていないものは何ですか? ログははるかに詳細に見えます。

4

7 に答える 7

265

git log現在の HEAD とその祖先を示します。つまり、HEAD が指すコミットを出力し、次にその親、その親などを出力します。各コミットの親を再帰的に検索することにより、リポジトリの祖先をトラバースします。

(実際には、一部のコミットには複数の親があります。より代表的なログを表示するには、のようなコマンドを使用しますgit log --oneline --graph --decorate。)

git reflogHEAD の祖先をまったく横断しません。reflog は、HEAD が指しているコミットの順序付けられたリストです。これは、リポジトリの取り消し履歴です。reflog はリポジトリ自体の一部ではなく (コミット自体とは別に保存されます)、プッシュ、フェッチ、またはクローンには含まれません。それは純粋にローカルです。

余談ですが、reflog を理解するということは、リポジトリがコミットされると、リポジトリから実際にデータを失うことはないということです。誤って古いコミットにリセットしたり、誤ってリベースしたり、コミットを視覚的に「削除」するその他の操作を行ったりした場合は、reflog を使用して以前の場所を確認git reset --hardし、その ref に戻って以前の状態を復元できます。ref はコミットだけでなく、その背後にあるすべての履歴を意味することを忘れないでください。

于 2013-07-25T14:01:13.077 に答える
80
  • git log参照 (ヘッド、タグ、リモート) からアクセス可能なコミット ログを表示します。
  • git reflogいつでもリポジトリで参照されている、または参照されていたすべてのコミットの記録です。

そのため、「破壊的な」操作 (ブランチの削除など) を実行すると、そのブランチによって参照された SHA1 を取り戻すために (デフォルトで 90 日後にプルーニングさgit reflogれるローカル記録) が使用されます。
参照git config:

gc.reflogexpire
gc.<pattern>.reflogexpire

git reflogexpire は、この時間より古い reflog エントリを削除します。デフォルトは 90 日です。
真ん中に" <pattern>" (例: " refs/stash") があると、設定は に一致する参照にのみ適用されます<pattern>

安全網

git reflog多くの場合、「あなたのセーフティネット」と呼ばれます

問題が発生した場合、探しているものが git log に表示されない場合の一般的なアドバイスは次のとおりです。

落ち着いて使えgit reflog

冷静さを保つ

繰り返しますが、reflog は SHA1 のローカル記録です。
対照的に、リポジトリを上流のリポジトリgit logにプッシュすると、同じ結果が表示されますが、必ずしも同じとは限りません。git loggit reflog

于 2013-07-25T13:47:47.877 に答える
19

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})。

于 2013-07-25T12:33:54.487 に答える
12

私もこれについて興味があったので、少し詳しく説明して要約したいと思います。

  1. git log現在のブランチのすべてのコミットの履歴を表示します。別のブランチをチェックアウトすると、別のコミット履歴が表示されます。すべてのブランチのコミット履歴を見たい場合は、 と入力しgit log --allます。

  2. git reflogカップケーキが言ったように、参照の記録を示します。コミットまたはチェックアウトが行われるたびにエントリがあります。git checkoutチェックアウトのたびにand runを使用して、2 つのブランチ間を数回切り替えてみてくださいgit reflog。「チェックアウト」エントリとして毎回更新される一番上のエントリが表示されます。では、これらのタイプのエントリは表示されませんgit log

参考文献: http://www.lornajane.net/posts/2014/git-log-all-branches

于 2015-08-19T09:46:17.387 に答える