Как найти самого последнего общего предка двух веток Git?
Как найти самого последнего общего предка двух веток Git?
Ответы:
Вы ищете git merge-base. Применение:
$ git merge-base branch2 branch3
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2
git log master...HEAD
--octopusфлаг, чтобы получить правильный результат. Очевидное, но неправильное git merge-base branch1 branch2 branch3даст вам коммит, но, как описано в разделе «Обсуждение» в документации, он не обязательно является общим предком всех трех ветвей.
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 поддерживали этот синтаксис, но я не думаю, что они делают. А некоторые даже имеют различную семантику для ...: Каковы различия между двойной точкой ".." и тройной точкой "..." в диапазонах коммитов Git?
git diff master...в частном случае сравнивает кHEAD
git diff origin/branchname...
Как отмечалось в предыдущем ответе, 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)
git version 2.14.1.windows.1. Запуск git merge-base --fork-point branch2с веткой (с ее собственными коммитами), который, как я знаю , разветвился из текущей ветви, не даст никакого результата, тогда как git merge-base branch1 branch2правильно показывает точку ветвления . В чем может быть проблема?
branch2а затем запустить git merge-base --fork-point branch1.
gitk, и т. Д., Чтобы увидеть, как выглядит дерево. Может быть, вы получите ответ.
git merge-base branch1 branch2. Но что странно, это то, что --fork-pointничего не дает в любом случае. Вы подтвердили, что это работает для вас, как задумано?