2016-04-20 70 views
6

我一直在使用Git了巨資約7年`git的等效。幾天前,我發現了一個讓我感到驚訝的行爲。我發現git log,git blamegit bisect表現出這種奇怪的行爲。 A friend讓我知道--full-history標誌爲git log解決了我的問題。我想知道,對於我自己的教育,是否有對git blamegit bisect的等效修正。混帳:`--full-history`爲`git的bisect`和blame`

隨意看看這個問題自己與此回購:https://dl.dropboxusercontent.com/u/1927707/problematic_repo.7z

下面是它的日誌:

$ git log --graph 
* commit b7a8d7aa001d06eb7491ab5fb447a8dd3aa421a8 
| Author: Ram Rachum <[email protected]> 
| Date: Tue Apr 19 17:45:01 2016 +0300 
| 
|  adding more to some-file 
| 
* commit 0aa833916e908ea93902a6c4c227f9a884a1bcef 
|\ Merge: 2413945 3068c7d 
| | Author: Ram Rachum <[email protected]> 
| | Date: Tue Apr 19 17:44:31 2016 +0300 
| | 
| |  Merge branch 'master' into development 
| | 
| * commit 3068c7d2548f1798b6840f73b13a649937339f28 
| | Author: Ram Rachum <[email protected]> 
| | Date: Tue Apr 19 16:02:27 2016 +0300 
| | 
| |  Adding sugar to coffee 
| | 
* | commit 24139451ab954b1f0a9ef616775a3dba0ac81669 
|/ Author: Ram Rachum <[email protected]> 
| Date: Tue Apr 19 16:01:28 2016 +0300 
| 
|  Creating some-file 
| 
* commit cf02fbbc40104cd02eea4c7c6f134ef1fd7b5661 
    Author: Ram Rachum <[email protected]> 
    Date: Tue Apr 19 16:00:47 2016 +0300 

     Create coffee 

在最初的承諾,加入了文件coffee。在提交3068c7d中,我在coffee文件中添加了一行「糖」。但後來我將這個分支合併到development分支中,並且在合併中,發生了錯誤,「糖」線被移除,留下了空的coffee。然後再添加一個提交b7a8d7a,做出不相關的更改,以獲得更好的效果。

現在我看着我的咖啡,發現裏面沒有糖。我清楚地記得加入我的咖啡糖。我運行git log coffee,並得到這個輸出:

$ git log coffee 
commit cf02fbbc40104cd02eea4c7c6f134ef1fd7b5661 
Author: Ram Rachum <[email protected]> 
Date: Tue Apr 19 16:00:47 2016 +0300 

    Create coffee 

就是這樣。 git log既沒有顯示我原來的提交添加了糖,也沒有顯示刪除它的合併。缺少兩個非常相關的提交。

我很沮喪由這個問題約一小時,因爲它在一個龐大的企業回購,其中提交更難手動查找發生。

我也嘗試使用git bisectgit blame來鎖定兩個提交,但這兩個工具忽略了兩個提交。 git bisect在完成所有git bisect badgit bisect good操作後指出我的錯誤提交。

然後,我在開始時說,一個朋友指着我對--full-history標誌:

$ git log --full-history --graph coffee     
* commit 0aa833916e908ea93902a6c4c227f9a884a1bcef  
|\ Merge: cf02fbb 3068c7d        
| | Author: Ram Rachum <[email protected]>     
| | Date: Tue Apr 19 17:44:31 2016 +0300    
| |              
| |  Merge branch 'master' into development   
| |              
| * commit 3068c7d2548f1798b6840f73b13a649937339f28  
|/ Author: Ram Rachum <[email protected]>     
| Date: Tue Apr 19 16:02:27 2016 +0300    
|              
|  Adding sugar to coffee       
|              
* commit cf02fbbc40104cd02eea4c7c6f134ef1fd7b5661  
    Author: Ram Rachum <ra[email protected]>     
    Date: Tue Apr 19 16:00:47 2016 +0300    

     Create coffee          

這讓我很高興,因爲它顯示了兩個相關的提交,一個加入白糖和刪除合併它。所以我的問題解決了。 但我真的希望我能知道如何使git bisectgit blame表現良好。有沒有人碰巧知道?

+0

'git的blame'很可能讓'--full歷史'直接在這裏(我會試試你的回購,但我不能解壓7zip文件)。 Bisect可能會拒絕合併,因爲它自己處理它們。一般來說,你沒有看到這些,因爲'git rev-list'跳過了很多合併:請參閱文檔關於TREESAME和合並處理的討論(以及--full-history如何改變這一點)。 – torek

+0

@torek我現在試了,'怪'似乎接受國旗,但它看起來不會改變任何東西。嘗試'git blame - full-history'和'git blame - full-history --reverse'都沒有結果。關於不能打開7z檔案,這裏是在zip:https://dl.dropboxusercontent.com/u/1927707/foo.zip –

+0

@torek也試過'git怪 - 反向HEAD ^^^ ..頭 - 完全歷史咖啡「,仍然沒有任何東西。 –

回答

0

有趣。由於線路不存在,git blame開始非常無益。至於git blame註釋的文檔:

報告不告訴你這已經 刪除或替換的行;你需要使用一個工具,比如git diff或者下面段落中簡要提到的「鎬」接口。

在這種情況下,我們可能會遇到git log -SSugar找到它走了進去:

$ git log --pretty=oneline -SSugar 
3068c7d2548f1798b6840f73b13a649937339f28 Adding sugar to coffee 

git blame不會立刻幫助我們找到它走了出去。 (正如你剛纔發現的那樣,如果我們想在提到文件時找到該行,我們可能需要--full-history,因爲添加路徑以限制提交git log將提交的提交,也會通過修剪每個提交的樹來包含just 。所提到的文件,然後使用該TREESAME代碼)

從已知良好的轉速開始,我們現在可以嘗試--reverse [編輯:我注意到3068c7d2548f1798b6840f73b13a649937339f28 == master和實際使用master這裏,大概應該使用SHA-1]:

$ git blame --reverse master..HEAD coffee 
^3068c7d (Ram Rachum 2016-04-19 16:02:27 +0300 1) Sugar 

這似乎暗示3068c7d是該行所在的最後一轉,因此它必須在一些或所有的孩子沿着這條特定的路徑,這是真的被刪除:

$ git log --oneline --graph --decorate --all 
* b7a8d7a (HEAD -> development) adding more to some-file 
* 0aa8339 Merge branch 'master' into development 
|\ 
| * 3068c7d (master) Adding sugar to coffee 
* | 2413945 Creating some-file 
|/ 
* cf02fbb Create coffee 

只有一個提交這是3068c7d這裏,即0aa8339一個孩子,所以:

$ git show -m 0aa8339 
commit 0aa833916e908ea93902a6c4c227f9a884a1bcef (from 3068c7d2548f1798b6840f73b1 
Merge: 2413945 3068c7d 
Author: Ram Rachum <[email protected]> 
Date: Tue Apr 19 17:44:31 2016 +0300 

    Merge branch 'master' into development 

diff --git a/coffee b/coffee 
index 4d0f160..e69de29 100644 
--- a/coffee 
+++ b/coffee 
@@ -1 +0,0 @@ 
-Sugar 
diff --git a/some-file b/some-file 
new file mode 100644 
index 0000000..e69de29 

(我們需要-m獲得git的比較對父母雙方合併)。這確實找到了一個稍微迂迴的方式。


(同時,似乎有沒有治癒的平分線的問題。那麼,除了「避惡合併」等...)

+0

感謝您的回答!用'--reverse'我的錯誤是沒有使用正確的左提交。 –

+0

更新:我現在嘗試使用'blame'類似的情況,但舊的提交刪除了之前存在的行,並且合併錯誤地重新添加了它們。 '怪'沒有顯示錯誤地重新添加行的合併,即使當我使用' - full-history'和' - full-history --reverse branch..other_branch'時。任何想法爲什麼? –

+0

我不太確定:我自己並沒有使用'git blame'。但是,一般來說,無論是前進還是後退,它只是比較每個提交之前/之後(每個文件的行),兩兩對齊,以查看是否更改或刪除了一行。然後該行被分配了該對的相應提交的ID。由於存在多個配對,因此該方法不會(並且不能)在合併中很好地工作。 – torek