2009-10-10 121 views
568

如何找到兩個Git分支的最新共同祖先?查找兩個Git分支的最新共同祖先

+3

定義最近的:真實世界的時間,提交的數量,其他指標? – 2014-07-17 20:51:37

+2

相關(十字交叉合併):http://stackoverflow.com/questions/26370185/how-do-criss-cross-merges-arise-in-git – Jubobs 2014-12-26 12:21:52

回答

661

您正在尋找git merge-base。用法:

$ git merge-base branch2 branch3 
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2 
+58

請注意,這找到了最近的共同祖先......哪我相信是提問者想要的,所以+1。只是注意到,如果有人來這裏試圖找到*最古老的*共同的祖先(如我所做的) - 爲此,另請參見:http://stackoverflow.com/questions/1527234/finding-a-branch-point -with-git – lindes 2011-02-14 09:52:57

+1

這可能是他正在尋找的內容,但手冊頁並不能保證它不是實時最新的或提交次數最多的版本:只是它將成爲最好的共同祖先之一。 – 2014-07-17 20:53:10

+0

我想我會使用這個小片段:'$(git merge-base HEAD master)'。例如,'git log $(git merge-base HEAD master).. HEAD' – funroll 2014-09-08 15:48:56

-1

一旦獲取時,共同的祖先SHA可以使用,例如,以查看遙控器上可用的提交,像這樣:

#!/bin/bash 

git remote update 
REMBR=`git show-remote-branch` 
REMHEAD=`git rev-parse $REMBR` 
MERGEBASE=`git merge-base HEAD $REMBR` 
REMURL=`git config remote.origin.url` 

git request-pull $MERGEBASE $REMURL $REMHEAD 
+2

這似乎與實際要求的內容非常相關。 – 2016-09-10 18:41:57

17

git diff master...feature

節目當前(可能是多次提交)功能分支的所有新提交。

man git-diff文檔:

git diff A...B 

是一樣的:

git diff $(git merge-base A B) B 

...是更容易輸入和記憶。

如提到的by DaveHEAD的特例可以省略。所以:

git diff master...HEAD 

是一樣的:

git diff master... 

這是不夠的,如果當前分支是feature

最後,請記住,順序很重要!做git diff feature...master將顯示在master上的更改不在feature上。

我希望更多的git命令可以支持這種語法,但我不認爲他們這樣做。有的甚至有不同的語義...What are the differences between double-dot ".." and triple-dot "..." in Git commit ranges?

+5

或者只是'git diff master ...'在差異到'HEAD'的特殊情況下# – Dave 2016-11-01 16:41:25

4

隨着gitk可以圖形方式查看兩個分支:

gitk branch1 branch2 

然後很容易發現在兩個分支的歷史的共同祖先。

+1

並非所有情況下都可以視覺化。有些原因可能需要以編程方式實現自動化。 – ADTC 2017-10-21 00:21:34

9

由於在之前的回答指出,git merge-base作品:

$ git merge-base myfeature develop 
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2 

但如果myfeature是當前分支,因爲是常見的,你可以使用使用--fork-point

$ git merge-base --fork-point develop 
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2 

這個說法僅適用於最新版本的git。另請參閱this answer


對於完整的提交信息,可以考慮:

$ git log -1 $(git merge-base --fork-point develop) 
+0

我有'git版本2.14.1.windows.1'。運行'git merge-base -fork-point branch2'並帶有一個分支_(帶有它自己的提交)_ **,**我知道**已經從當前分支分支出來不會產生任何結果,而'git merge-base branch1 branch2'正確顯示叉點。可能是什麼問題呢? – ADTC 2017-10-21 00:22:45

+0

@ADTC檢出'branch2',然後運行'git merge-base --fork-point branch1'。 – 2017-10-21 01:58:09

+0

是的,做到了。沒有再出現。 – ADTC 2017-10-21 02:16:28