Гіт: Знайдіть останнього спільного предка двох гілок


844

Як знайти останнього спільного предка двох гіт Git?


3
Визначте найсвіжіший: реальний час у світі, кількість комітетів, інші показники?
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

2
Відповідні (хрест-навхрест): злиття stackoverflow.com/questions/26370185 / ...
jub0bs

1
@CiroSantilli 新疆 改造 中心 996ICU 六四 事件 це однаково у будь-якій метриці, чи не так?
ЯковЛ

@YakovL Я вважаю, що це не через розгалуження та через те, що ви можете встановити довільні дати фіксації об’єктів вашої комісії: сама ця дата, ймовірно, не така, яку ви хочете.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

1
@CiroSantilli 新疆 改造 中心 996ICU 六四 事件 мені здається, що це може бути інакше, лише якщо до останнього загального комітету в дереві є коміт, який має старішу мітку часу. Чи можете ви навести менш тривіальний приклад?
ЯковЛ

Відповіді:


1019

Ви шукаєте git merge-base. Використання:

$ git merge-base branch2 branch3
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2

85
Зауважте, що це знаходить останнього спільного предка ... якого, на мою думку, запитуючий хоче, тому +1. Просто зазначивши , що вона, в разі , якщо хто приходить сюди , намагаючись знайти найстарішу загального предка (як я) - для якого, дивись також: stackoverflow.com/questions/1527234 / ...
Lindes

16
@funroll: Або стенограма для цього:git log master...HEAD
CB Bailey

17
@lindes чи не найдавніший спільний пращур не буде початковим завданням?
Thorbjørn Ravn Andersen

8
@ ThorbjørnRavnAndersen, так, я вважаю, що це так ... Складність в описі пов'язана з тим, що git використовує спрямований ациклічний графік, і все ж його часто вважають деревом, якого технічно це не так. Щоб бути більш обережним у моїй редакції, я говорив про випадок, коли ви хочете, щоб батьки першої інстанції "гілок" розходилися ... оскільки вони можуть мати кілька точок, де вони знову об'єдналися і повторно розділилися, це "найстаріший" з них, але не справді найдавніший предок, який є (я думаю) завжди початковим завданням.
lindes

5
Хоча це питання суто стосується пошуку спільного предка двох гілок, той, хто хоче спільного предка трьох і більше гілок, повинен зазначити, що їм потрібно передати --octopusпрапор, щоб отримати правильний результат. Очевидне, але неправильне git merge-base branch1 branch2 branch3дасть вам зобов’язання, але, як описано в розділі "Обговорення" в документах, це не обов'язково є спільним предком всіх трьох гілок.
Марк Амері

46

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-комітетів?


8
Або просто git diff master...у спеціальному випадку, що відрізняється відHEAD
Дейв

"..." не працювало для мене в powerhell, смішно це працювало в git console, можливо, репо не було повним, git diff $ (git merge-base AB) B зробив, і оскільки я трохи новий для git Я був трохи скептичний, що це може об'єднати гілки :)
Моїз Ахмед

1
Ого. досить дивовижно. а якщо потрібна галузь не існує у вашому місцевому репо, тому що ви її ніколи не перевіряли, ви можете просто зробитиgit diff origin/branchname...
Марк Ч.

25

Як зазначалося в попередній відповіді, 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правильно показує точку вилки. У чому може бути проблема?
ADTC

@ADTC Checkout, branch2а потім запустіть git merge-base --fork-point branch1.
Acumenus

@ADTC Використовуйте переглядач графічних фіксів, наприклад gitk, тощо, щоб побачити, як виглядає дерево. Можливо, ви отримаєте свою відповідь.
Акумен

Я не бачу нічого дивного в дереві, як я його переглядаю графічно. Я можу простежити шляхи і знайти спільного предка, який відповідає результату git merge-base branch1 branch2. Але що дивно, те, що --fork-pointнічого не дає. Ви підтвердили, що він працює для вас за призначенням?
ADTC

1
Я отримую те саме, що @ADTC. Команда 'git log -1 $ (git merge-base - fork-point anotherBranch)' не показує жодного результату за допомогою git версії 2.16.2.windows.1.
masinger

10

З gitkви можете переглянути дві гілки графічно:

gitk branch1 branch2

І тоді легко знайти спільного предка в історії двох гілок.


6
Не все можна зробити візуально у кожному випадку. Є причини, які можуть потребувати автоматизованої автоматизації.
ADTC
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.