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


158

manページには、ログにはコミットログが表示され、reflogはreflog情報を管理すると記載されています。正確にはreflog情報とは何であり、ログには何がないのですか?ログははるかに詳細なようです。

回答:


221

git log現在のHEADとその祖先を表示します。つまり、HEADが指すコミット、次にその親、その親などを出力します。各コミットの親を再帰的に調べることにより、リポジトリの祖先をさかのぼります。

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

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

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


26
注意:reflogエントリは永続的に保持されないため、データが失われることがあります-特定の条件で削除されます。この回答git-reflogおよびgit-gcのドキュメントを参照してください。一般に、破壊的な操作が2週間前でなかった場合は、おそらく安全です。
mcmlxxxvi 2015

@mcmlxxxvi同じリポジトリに2つのローカルフォルダーがあります。2つのフォルダーのreflogをマージできますか?
Tmx

@Tmx、私はあなたのケースを完全に理解していません- 同じリポジトリの2つのローカルフォルダーはどういう意味ですか?最新の同じリポジトリの2つのクローンがあり、それらの編集履歴を「マージ」する場合、.git/logs/refs/<branch>エントリの形式はになります<old_rev> <new_rev> [...] <timestamp> [...]。タイムスタンプによる連結とソートを試すことができます。ただし、一部の行new_revは次の行と一致しないold_rev場合があります。その場合、reflogが無効になると思われます。次に、シーケンスを「修正」するために偽のエントリを挿入してみることができますが、私にとっては面倒すぎるようです。
mcmlxxxvi 2018年

62
  • git log 参照(ヘッド、タグ、リモート)からアクセス可能なコミットログを表示します
  • git reflog記録されているか、いつでもあなたのレポで参照されたすべてのコミットのは。

そのため、git reflog(ブランチの削除などの)「破壊的な」操作を行うときに、そのブランチによって参照されていたSHA1を取り戻すために(デフォルトでは90日後に剪定されるローカルレコーディング)が使用されます。
を参照してください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 log、必ずしも同じではありませんgit reflog


14

Pro Gitブック説明はreflog次のとおりです。

作業中にGitがバックグラウンドで行うことの1つは、reflogを保持することです— 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に非常に慣れていないので、最初のOMGの前にいくつかの基本を知りたいと思います。
Noich 2013

2
Gitログはコミットの記録です。reflogは、Pro Gitブックで述べられているように、参照(基本的にはブランチポインターとHEADポインター)と、それらが参照しているコミットの記録です。それは理にかなっていますか?サイドノートでは、logまた、あなたが情報をREFLOG表示していますが、それへの引数として特別なオプションフラグを渡すことができます--walk-reflogs

3
また、あなたはGitの初心者なので、Pro Gitの本を読むことを強くお勧めします。この方法で、Gitについて学んだほとんどのことを学びました。1〜3章と6〜6.5章をお勧めします。また、対話式と非対話式の両方でリベースする方法を学ぶことを強くお勧めします。

8

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

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

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

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


1

git logとreflogの違いは、プライベートレコードとパブリックレコードの違いだと思っています。

プライベートvsパブリック

git reflogを使用すると、ローカルで行ったすべてのことを追跡できます。コミットしましたか?Reflogが追跡します。ハードリセットを行いましたか?Reflogが追跡します。コミット修正しましたかか?Reflogが追跡します。ローカルで行ったすべての処理が、reflogにあります。

これはログには当てはまりません。コミットを修正した場合、ログには新しいコミットのみが表示されます。リセットを行い、履歴内のいくつかのコミットをスキップすると、スキップしたコミットはログに表示されません。変更を別の開発者またはGitHubにプッシュするときなどにと、ログで追跡されたコンテンツのみが表示されます。別の開発者にとっては、リセットが行われなかったか、修正が行われなかったように見えます。

ログは磨かれています。reflogは細かいです。

ええ、私は「プライベートvsパブリック」のアナロジーが好きです。または多分より良いログ対reflog類似は、「洗練されたvs」です。reflogには、すべての試行錯誤が表示されます。ログには、作業履歴のクリーンで洗練されたバージョンが表示されるだけです。

ポイントを強調するためにこの画像を見てください。リポジトリの初期化以降、多くの修正とリセットが行われました。reflogにすべてが表示されます。しかし、logコマンドを使用すると、リポジトリに対してコミットが1回だけ行われたように見えます。

ログは洗練されています。 Reflogは細かいです。

「セーフティネット」の考え方に戻る

また、reflogは修正した内容とリセットしたコミットを追跡するので、コミットIDを取得できるため、前に戻ってそれらのコミットを見つけることができます。リポジトリから古いコミットが削除されていないと仮定すると、ログに表示されなくなったアイテムを復活させることができます。reflogは、誤って失ったと思ったものを取り戻す必要があるときに、誰かの皮膚を保存してしまうことがあります。


-6

実際、reflogは

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

だから答えは:それは特定のケースです。


9
ではgit log-gはの短縮形です--walk-reflogs。だから、それは何も説明しません。
エイドリアンW
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.