2012-07-07 111 views
2

我有一些分支,這些分支定期合併,即我們可以有A,合併到B中,然後B合併到C中,然後A合併到D和D中C等。假設我有一個提交X,我知道它最初是在A中引入的,然後以某種方式合併到C中(當我執行git log C時,我可以看到它)。有沒有辦法找出哪個合併(合併提交)將提交X帶入分支C?git:找到哪個合併brough提交到當前分支

+0

這對git grep X有幫助嗎? – 2012-07-07 01:30:43

+0

@MichaelDurrant不知道如何git grep會有所幫助,你可以ebalorate?我無法grep文件/提交中的特定文本,因爲我正在尋找的提交進行了大量小的更改,並且幾乎所有其他模式也會出現在其他提交中,出現的概率很高。 – StasM 2012-07-07 04:49:03

回答

5

通常我這樣做如下:

git log --oneline --ancestry-path --merges <commit-of-interest>..C 

--ancestry-path參數這裏的關鍵是:它會導致GIT中,只顯示該提交既是一個的<commit-of-interest>後裔和C的祖先。 --merges選項進一步過濾結果列表以僅顯示合併提交。

每個印刷合併的落入以下類別之一:

  • 合併帶來<commit-of-interest>成分支
  • 合併帶來了不同的分支到已<commit-of-interest>
  • 兩個分支父分支已經有<commit-of-interest>

第一類是你感興趣的一個。你可以n通常通過查看提交主題行來確定合併的類別。從列表底部開始;最古老的合併最有可能屬於第一類。

技術上可以編寫一個腳本來過濾掉第二和第三類中的合併(只需測試合併的第一個父代是否可以訪問<commit-of-interest>),但我從未發現它是必需的。

如果您需要做的提交歷史更深入的研究那麼我建議在看歷史圖:

git log --oneline --graph --color --decorate \ 
    --ancestry-path <commit-of-interest>..C 

您可能希望在--boundary折騰過,雖然有時候,增加了太多噪聲。您可以使用gitk,但不幸的是,它繪製的圖不會以正確的順序顯示父項(gitk可能會在合併和其左邊的第二個父項之間繪製邊緣; git log --graph總是繪製右邊的第二個父邊)。

+1

不幸的是,我從這裏得到的是1500+行,看起來像這樣: '| | | * 4b4079b合併請求#1234從用戶名/ bug3456' 這不是一個很大的幫助。現在,最後一行是與我正在查找的提交合並,但是它表示何時將此提交合併到另一個分支中(最初引入的分支),但是當它進入C並進行了哪種合併時,它就會進行合併...... – StasM 2012-07-08 00:48:58

+0

@StasM:默認合併提交信息是「合併分支'foo'」(如果將'foo'合併到'master'中)或者「合併分支'foo'到條」(如果將'foo'合併到'bar'中)。如果沒有任何/很少的合併提交是這樣的話,那麼它可能很難 - 你可能需要編寫一個腳本來過濾掉我提到的後兩類合併。在我的情況下,合併提交幾乎總是有默認的格式,所以grep for「into C」,並找到最後一場比賽將找到所有我使用的庫的興趣合併。 – 2012-07-08 04:56:26

+0

太棒了,這幫助我調試了我們在這裏的「過早合併」問題。非常感謝! – Stefaan 2013-10-10 10:43:26