Як знайти останнього спільного предка двох гіт 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
нічого не дає. Ви підтвердили, що він працює для вас за призначенням?