Git: найдите последнего общего предка двух ветвей

Как найти самого последнего общего предка двух ветвей Git?

5 ответов


вы ищете git merge-base. Использование:

$ git merge-base branch2 branch3
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2

git diff master...feature

показывает все новые коммиты текущей (возможно мульти-фиксации) характеристика филиала.

man git-diff документы:

git diff A...B

- это то же, что:

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

но ... легче печатать и запоминать.

как уже упоминалось Дэйв специальный случай HEAD можно опустить. Итак:

git diff master...HEAD

- это то же, что:

git diff master...

что достаточно, если текущая ветвь feature.

и, наконец, помните, что порядок имеет значение! Делать git diff feature...master покажет изменения, которые находятся на master не на feature.

Я хотел бы, чтобы больше команд git поддерживали этот синтаксис, но я не думаю, что они это делают. А некоторые даже имеют различную семантику для ...: каковы различия между double-dot ".."и тройная точка "..."в диапазонах git commit?


как было отмечено в предыдущем ответе, git merge-base работает:

$ git merge-base myfeature develop
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2

но если myfeature является текущей веткой, как обычно, вы можете использовать use --fork-point:

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

этот аргумент работает только в достаточно последних версиях git. К сожалению, это не всегда работает, однако, и не ясно, почему. Пожалуйста, обратитесь к ограничениям, отмеченным в конце ответ.


для полной информации фиксации, подумайте:

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

С gitk вы можете просмотреть две ветви графически:

gitk branch1 branch2

и тогда легко найти общего предка в истории двух ветвей.


после получения общего предка 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