回答:
git log
現在のHEADとその祖先を表示します。つまり、HEADが指すコミット、次にその親、その親などを出力します。各コミットの親を再帰的に調べることにより、リポジトリの祖先をさかのぼります。
(実際には、一部のコミットには複数の親があります。より代表的なログを表示するには、などのコマンドを使用しますgit log --oneline --graph --decorate
。)
git reflog
HEADの祖先をまったく走査しません。reflogは、HEADがポイントしたコミットの順序付きリストです。これは、リポジトリの取り消し履歴です。reflogはリポ自体の一部ではなく(コミット自体とは別に保存されます)、プッシュ、フェッチ、またはクローンには含まれません。それは純粋にローカルです。
余談ですが、reflogを理解することは、いったんコミットされたら、リポジトリから実際にデータを失うことができないことを意味します。誤って古いコミットにリセットしたり、誤ってリベースしたり、コミットを視覚的に「削除」するその他の操作を行ったりした場合は、reflogを使用して以前の場所を確認し、git reset --hard
そのrefに戻って以前の状態を復元できます。refはコミットだけでなく、その背後にあるすべての履歴を意味します。
.git/logs/refs/<branch>
エントリの形式はになります<old_rev> <new_rev> [...] <timestamp> [...]
。タイムスタンプによる連結とソートを試すことができます。ただし、一部の行new_rev
は次の行と一致しないold_rev
場合があります。その場合、reflogが無効になると思われます。次に、シーケンスを「修正」するために偽のエントリを挿入してみることができますが、私にとっては面倒すぎるようです。
git log
参照(ヘッド、タグ、リモート)からアクセス可能なコミットログを表示しますgit reflog
で記録されているか、いつでもあなたのレポで参照されたすべてのコミットのは。そのため、git reflog
(ブランチの削除などの)「破壊的な」操作を行うときに、そのブランチによって参照されていたSHA1を取り戻すために(デフォルトでは90日後に剪定されるローカルレコーディング)が使用されます。
を参照してください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ブックの説明は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の前にいくつかの基本を知りたいと思います。
HEAD
ポインター)と、それらが参照しているコミットの記録です。それは理にかなっていますか?サイドノートでは、log
また、あなたが情報をREFLOG表示していますが、それへの引数として特別なオプションフラグを渡すことができます--walk-reflogs
。
私もこれに興味があったので、少し詳しく説明したいと思います。
git log
現在のブランチのすべてのコミットの履歴を表示します。別のブランチをチェックアウトすると、別のコミット履歴が表示されます。すべてのブランチのコミット履歴を確認するには、と入力しgit log --all
ます。
git reflog
カップケーキが言ったようにあなたの参照の記録を示しています。コミットまたはチェックアウトが行われるたびにエントリがあります。を使用して2つのブランチ間を数回切り替えて、各チェックアウト後にgit checkout
実行git reflog
します。一番上のエントリが「チェックアウト」エントリとして毎回更新されるのがわかります。これらのタイプのエントリは表示されませんgit log
。
参照:http : //www.lornajane.net/posts/2014/git-log-all-branches
git logとreflogの違いは、プライベートレコードとパブリックレコードの違いだと思っています。
git reflogを使用すると、ローカルで行ったすべてのことを追跡できます。コミットしましたか?Reflogが追跡します。ハードリセットを行いましたか?Reflogが追跡します。コミットを修正しましたかか?Reflogが追跡します。ローカルで行ったすべての処理が、reflogにあります。
これはログには当てはまりません。コミットを修正した場合、ログには新しいコミットのみが表示されます。リセットを行い、履歴内のいくつかのコミットをスキップすると、スキップしたコミットはログに表示されません。変更を別の開発者またはGitHubにプッシュするときなどにと、ログで追跡されたコンテンツのみが表示されます。別の開発者にとっては、リセットが行われなかったか、修正が行われなかったように見えます。
ええ、私は「プライベートvsパブリック」のアナロジーが好きです。または多分より良いログ対reflog類似は、「洗練されたvs」です。reflogには、すべての試行錯誤が表示されます。ログには、作業履歴のクリーンで洗練されたバージョンが表示されるだけです。
ポイントを強調するためにこの画像を見てください。リポジトリの初期化以降、多くの修正とリセットが行われました。reflogにすべてが表示されます。しかし、logコマンドを使用すると、リポジトリに対してコミットが1回だけ行われたように見えます。
また、reflogは修正した内容とリセットしたコミットを追跡するので、コミットIDを取得できるため、前に戻ってそれらのコミットを見つけることができます。リポジトリから古いコミットが削除されていないと仮定すると、ログに表示されなくなったアイテムを復活させることができます。reflogは、誤って失ったと思ったものを取り戻す必要があるときに、誰かの皮膚を保存してしまうことがあります。
実際、reflogは
git log -g --abbrev-commit --pretty=oneline
だから答えは:それは特定のケースです。
git log
、-g
はの短縮形です--walk-reflogs
。だから、それは何も説明しません。