2014-02-05 111 views
4

假設我的Git存儲庫擁有分支masterBranchABranchBBranchC使用Git,我該如何記錄兩個特定分支之間合併提交的所有提交?

現在所有這些分支已合併爲主,可能多次(無論出於何種原因,這是一個假設情景)。我希望能夠找到BranchA合併到master的所有合併提交。

這是據我問這個問題之前,有:

git log master ^BranchA --merges --oneline 

這得到我的一切,都在master的提交,而不是BranchA這也是合併的提交。這實際上給了我所有提交我正在尋找,但它也可以給我我不想要的承諾,如從BranchBBranchC併入主。

輸出示例:

10bdc8b Merge branch 'BranchA' 
383693a Merge branch 'BranchB' 
8af3b5c Merge branch 'master' of 192.168.0.0:/path/to/repo.git 
aa0f22c Merge branch 'master' into BranchC 
72bbf3a Merge branch 'BranchA' 
fac1157 Merge branch 'BranchB' 

我想找到輸出只是10bdc8b72bbf3a的溶液。並且不要只想到'BranchA'這個名字;我知道在這種情況下會起作用,但合併提交總是可能會被賦予一個自定義消息,所以它可能不總是有效。


編輯

良好的反應,到目前爲止,但不幸的是,我已經碰了壁,我不知道怎麼弄過去。考慮以下情況:

F        <-BranchB 
/\   
/ \   
A-----B----C-----D--E----K----L <-master 
     \  / \  /
     \ / \ /
     G----H--------I---J  <-BranchA 

現在,我的目標是從BranchA找到所有合併提交到主。通過查看圖表,我可以看到我在尋找LD。然而,讓我無法以編程方式解決這個問題的曲線球是合併提交I,其中master被合併到BranchA中。

在這種情況下,如果我們用在主所有提交的branch --contains方法,我們得到了LDB。但是,如果我們對master中的所有提交進行分支 - 而不是BranchA,則只能得到L。這兩種方法都得不到理想的結果。

同樣,如果我們使用git merge-base找到父項,我們只能得到L

據我所知,似乎沒有一種好的方法來區分BD,因爲這兩個提交都在BranchA的歷史中。我可以通過觀察他們發現他們是不同的,但Git似乎沒有很好的方法來區分他們。

回答

0

我不認爲有一種直接的方式可以在Git中得到這個,但我有一個想法,我將如何去解決它。如果是我,我會用Python來做這件事。其他人可能會在Bash中做到這一點。

首先,我會得到合併的列表中一個承諾伴隨着父母,他們正在合併:

git log --merges --format="%H %P" A 

我會遍歷結果中的每一行着眼於第三哈希(假設所有合併只有兩個父母)。該行上的第一個散列是合併提交本身的散列 - 如果此合併變成A和B之間的位置,我們希望將其作爲答案。第二個散列是A分支中的父代。第三哈希是另一方,這是我們要測試的B.所以會員,每個(三)散列,我會打電話

git merge-base B <hash> 

...如果結果是一樣的哈希我投入,該提交(線上的第一個散列)是合併到分支B的分支A.

+0

我有時無法保持git merge-base的正確性,但在這種情況下,git mergebase B 是否等於是我們正在嘗試做的事情? – jacobhyphenated

1

在git中沒有單個命令來獲取來自特定分支的所有合併,但可以合併branch --contains併合並父母走路結束。忽略章魚承諾,在主分支,我們感興趣的是第二合併母公司:

bash$ for commit in \ 
     $(git log --format=%h --merges --max-parents=2 master ^topic); do \ 
      [[ $(git branch --contains ${commit}^2) =~ topic ]] && \ 
      echo $commit; done 

當然,你必須確保沒有合併快進,也就是說,你必須指定--no-ff開關當你合併時,否則你將失去上面scriplet依賴的必要的雙親分支。

有一個額外的考慮因素,它是否是複雜的取決於您的具體使用情況。在以下示例中,

 
I--A--M---N---O---F ← master 
\ / //
    `-B-------D ←/← topicA 
    \  /
     `--C----E ← topicB 

的提交B是合併的父提交M並且兩個ED的祖先。當您在master上查詢合併提交時,您將收到提交F,O,M,然後當您查詢其中哪些是topicA分支合併時,您將獲得M,O,但是當您詢問其中哪些合併爲topicB時,您還將獲得M,這是因爲B是兩個分支的祖先。

+0

好。你的bash腳本需要一個小小的修正。 「git log --format =%h --merges master」需要是「git log --format =%h --merges master^<所需分支>」否則,您將從所需分支之前獲得所有合併提交被創建。此外,我們可以指定--max-parents = 2來避免章魚提交...仍然不知道我想如何處理這些。 – jacobhyphenated

+0

@jacobhyphenated出色的積分 - 用你的建議更新了答案。 – mockinterface

相關問題