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