2012-02-24 179 views
3

我有一個分支,我已經合併到主。Git合併跳過提交

在樹枝上,git log file顯示2月9日 在主提交,git log file顯示提交2月9日 在主,git log不顯示2月9日提交

的文件沒有反映2月9日發生的更改,但git log顯示提交。它似乎在提交合並,但實際上並沒有將其應用於該文件。什麼可能導致這個?

編輯:我想我找出了發生了什麼,並在下面回答。爲清晰起見,我清理了原始問題。我原來寫的,我認爲這是一個與Git的bug,但我不認爲這種情況了。但是,如果git log file確實向文件顯示了這些提交,那將是很好的。感謝所有幫助過的人,特別是Borealid。

此前編輯:我真的相信這是一個bug與git。這個文件從來沒有重命名,但git認爲它是,這就是爲什麼提交沒有被應用。我創建了另一個分支,執行了合併,而這個問題沒有發生。我可以重現發生這種情況的分支上的錯誤。我很樂意幫助任何git開發人員對我進行調試,但我無法將您的存儲庫發送給您。

+0

合併使得合併的分支父。所以它不能跳過提交。不過我相信'git log' does not * walk *按時間順序修訂。 – 2012-02-24 15:40:12

+0

Jan:2月9日提交沒有在git日誌中的任何地方列出。 – Dave 2012-02-24 15:41:31

+0

@Jan Hudec:更正,它在「git log」中列出,但不包含在master上的「git log certainfile」。請看下面的答案我的評論。 – Dave 2012-02-24 15:54:12

回答

4

來自Dave引用:

我重新創建一個類似的情況有以下步驟:

  • 創建一個新的Git倉庫
  • 創建一個文件一行,將其添加到git和commit(commit#1)
  • 創建並切換到分支
  • 更改分支中的文件commit(commit#2)
  • 切換到主,更改文件所以會有衝突,並承諾(承諾#3)
  • 合併分支到主,該文件將在衝突
  • 通過採取主所有的變化解決衝突,並拒絕分支中的所有更改。基本上,文件 看起來就像它在master中一樣。
  • 添加文件並提交更改(提交#4)

現在git的日誌將顯示所有四個提交,但git的日誌文件將只顯示提交#1和#3

的共振git log -- file只顯示提交#1和#3是因爲如何git-log(默認模式)走過提交鏈;當發現合併提交併且存在父提交以使得所選文件在合併之後與父提交時具有相同內容時,git-log將跟隨(一個)這樣的父代並拒絕所有其他父代。

在這種情況下,因爲合併衝突是通過僅保留在master中進行的更改來解決的(文件在提交#1和提交#4中具有相同的內容),git-log將只會遍歷master分支。

在更多的細節:http://schacon.github.com/git/git-log.html(節「歷史簡單化」)

+0

感謝您的回覆。既然你的回答在我的答案中沒有上下文沒有意義(它在我的答案中引用了提交數字),我並沒有將其標記爲接受。如果您複製並粘貼我的答案(並ping我),我一定會將其標記爲這樣。 – Dave 2012-02-27 22:34:22

+0

@Dave,我將你對問題的解釋添加到了我的答案 – joran 2012-02-28 07:17:51

+0

@Dave:你應該在你的問題中提出你的答案,因爲這不是一個真正的答案。 – naught101 2012-06-22 13:22:34

0

如果文件內容在更改前後的內容相同,則該文件未被更改修改。

這個說法是直觀的,因爲git的對象模型,它也是在版本庫中。

您可以檢查您的git log並找到您認爲修改文件的修訂;如果它在主歷史記錄中,則表示您正確地進行了合併,但該更改集對文件沒有影響(因此不包含在git log -- path/to/file中)。

顯然,git merge沒有壞 - 你的期望只是與它做的沒有對齊。

+0

內容不相同。我們注意到我們的應用程序中存在一個錯誤,因爲包含更改的提交沒有在合併中正確傳輸。 – Dave 2012-02-24 15:37:57

+0

@Dave你是如何進行合併的? – Borealid 2012-02-24 15:39:30

+0

來自master:git merge branchname – Dave 2012-02-24 15:40:48

0

我重新用下面的步驟類似的情況:

  1. 創建一個新的Git倉庫
  2. 一個行創建一個文件,把它添加到Git和承諾(承諾#1)
  3. 創建並切換到分支
  4. 更改文件中的分支,提交(提交#2)
  5. 切換到主,更改文件所以會有衝突,提交(提交#3)
  6. 將分支合併到主文件中,文件將衝突
  7. 通過獲取主文件中的所有更改來解決衝突,並拒絕分支中的所有更改。基本上,文件 看起來就像它在master中一樣。
  8. 添加文件並提交更改(提交#4)

現在git log將顯示所有四次提交,但git log file只會顯示提交#1和#3。