web-dev-qa-db-ja.com

git reflogとlogの違いは何ですか?

マニュアルページには、ログにはコミットログが表示され、reflogはreflog情報を管理すると書かれています。 reflog情報とは何ですか?また、ログにはないものは何ですか?ログははるかに詳細に見えます。

142
Noich

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

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

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

それ以外に:reflogを理解することは、コミットされたリポジトリからデータを実際に失うことができないことを意味します。 reflogを使用して以前の場所を確認し、その参照にgit reset --hard戻って以前の状態を復元できます。参照はコミットだけでなく、その背後にある履歴全体を意味します。

191
ben_h
  • 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>に一致する参照にのみ適用されます。

safety net

git reflogは、「 あなたのセーフティネット 」として参照されることがよくあります。

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

落ち着いてgit reflog を使用」

keep calm

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

51
VonC

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

13
user456814

私もこれに興味があり、少し詳しく説明したいと思います。

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

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

参照: http://www.lornajane.net/posts/2014/git-log-all-branches

5
mitch

実際、reflogはのエイリアスです

 git log -g --abbrev-commit --pretty=oneline

答えは次のとおりです。特定のケースです。

0
user10028634