2013-07-25 152 views

回答

119

git log顯示當前HEAD及其祖先。也就是說,它將打印提交HEAD點,然後打印其父,父,等等。它通過回購的祖先遍歷回來,遞歸地查找每個提交的父項。

(在實踐中,一些提交有多個父。要看到一個更有代表性日誌,請使用如下命令git log --oneline --graph --decorate。)

git reflog不經過HEAD的祖先都沒有。 reflog是HEAD指出的提交的有序列表:它是您的回購的撤消歷史記錄。 reflog不是repo本身的一部分(它被單獨存儲到提交本身),並且不包含在推送,提取或克隆中;它純粹是本地的。

另外:理解reflog意味着你不能從你的repo數據中丟失數據,一旦它被提交。如果您不小心重置爲較舊的提交或錯誤地重新綁定,或者任何其他視覺上「移除」提交的操作,則可以使用reflog查看之前的位置,然後再返回該引用以恢復先前的狀態。記住,參考文獻不僅意味着承諾,還包括其背後的整個歷史。

+11

謹慎的說法:您有時會丟失數據,因爲reflog條目不會永久保存 - 它們會在特定條件下被清除。請參閱[本答案](http://stackoverflow.com/a/26451688/1614641)和[git-reflog](https://www.git-scm.com/docs/git-reflog)和[ GIT-GC(https://www.git-scm.com/docs/git-gc)。一般來說,如果破壞性手術不超過2周,那麼你很可能是安全的。 – mcmlxxxvi

+0

@mcmlxxxvi我有兩個本地文件夾相同的回購,我可以合併兩個文件夾reflogs? – Tmx

7

這裏的explanation of reflog from the Pro Git book

的事情之一的Git確實在後臺,當你在外打工的就是保持一個引用日誌 - 日誌在哪裏你的頭和分支引用已經在過去的幾個月。

您可以通過使用git reflog看到你引用日誌:

$ git reflog 
734713b... [email protected]{0}: commit: fixed refs handling, added gc auto, updated 
d921970... [email protected]{1}: merge phedders/rdocs: Merge made by recursive. 
1c002dd... [email protected]{2}: commit: added some blame and merge stuff 
1c36188... [email protected]{3}: rebase -i (squash): updating HEAD 
95df984... [email protected]{4}: commit: # This is a combination of two commits. 
1c36188... [email protected]{5}: rebase -i (squash): updating HEAD 
7e05da5... [email protected]{6}: rebase -i (pick): updating HEAD 

每次你的分支頂端以任何理由更新時,Git的商店,在這個臨時歷史記錄您的信息。你也可以用這些數據指定較早的提交。

reflog命令也可用於刪除條目或從reflog中過期的條目過舊。來自official Linux Kernel Git documentation for reflog

子命令expire用於修剪較舊的引用日誌條目。

要從引用日誌中刪除單個條目,請使用子命令delete並指定確切條目(例如git reflog delete [email protected]{2})。

+0

但不將'混帳log'爲您提供相同的信息?很抱歉,如果看起來很明顯,我對GIT很陌生,想在我的第一個OMG之前獲得一些基礎知識。 – Noich

+2

Git日誌是您***提交***的記錄。正如Pro Git書所述,reflog是您的***引用***(基本上,您的分支指針和您的「HEAD」指針)的記錄,以及它們指向的提交記錄。那有意義嗎?在附註中,'log'也可以顯示reflog信息,但是必須傳遞一個特殊選項標誌作爲參數,'--walk-reflogs'。 – 2013-07-25 13:23:06

+1

另外,既然您是Git初學者,我強烈建議您閱讀Pro Git書籍,這是我從Git學到的大部分知識。我建議第1-3和6-6.5章。我還強烈建議您學習如何以交互方式和非交互方式進行rebase。 – 2013-07-25 13:25:10

32
  • git log顯示提交日誌從裁判(頭,標籤,遙控器)訪問
  • git reflog記錄是在任何時間在你的回購中引用的所有提交的

這就是爲什麼當你做一個「破壞性」的操作(如刪除一個分支)git reflog(一本地這是後缺省的90天清理記錄)時,爲了找回SHA1是被該分支引用。
git config

gc.reflogexpire 
gc.<pattern>.reflogexpire 

git reflog到期刪除比這個時間早引用日誌條目;默認爲90天。
在中間,「<pattern>」(例如「refs/stash」)的設置僅適用於匹配<pattern>的參考。

safety net

git reflog經常引用爲 「your safety net

在故障情況下,一般建議,當git的日誌不告訴你,你在找什麼,就是:

Keep calm and use git reflog

keep calm

同樣,reflog是您的SHA1的本地錄製。
git log相反:如果您將庫存回推到upstream repo,您將看到相同的git log,但不一定相同git reflog

1

我很好奇這也只是想闡述和總結了一下:

  1. git log顯示所有你提交你所在分支的歷史。簽出一個不同的分支,你會看到不同的提交歷史記錄。如果您想看到您爲所有分支提交歷史記錄,請鍵入git log --all

  2. git reflog顯示您的參考記錄,如Cupcake說的。每次進行提交或檢出時都會有一個條目。嘗試使用git checkout幾次在兩個分支之間來回切換,並在每次結賬後運行git reflog。您會看到每次更新的頂級條目都是「結帳」條目。您在git log中看不到這些類型的條目。

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

相關問題