Представьте себе следующую историю:
c---e---g--- feature
/ \
-a---b---d---f---h--- master
Как я могу найти, когда коммит "c" был объединен с мастером (то есть, найти коммит коммит "h")?
Ваш пример показывает, что ветка feature
все еще доступна.
В этом случае h
последний результат:
git log master ^feature --ancestry-path
Если ветка feature
больше недоступна, вы можете показать коммиты слияния в строке истории между c
и master
:
git log <SHA-1_for_c>..master --ancestry-path --merges
Это, однако, также покажет все слияния, которые произошли после h
, между e
и так g
далее feature
.
Сравнение результата следующих команд:
git rev-list <SHA-1_for_c>..master --ancestry-path
git rev-list <SHA-1_for_c>..master --first-parent
даст вам SHA-1 в h
качестве последнего общего ряда.
Если он у вас есть, вы можете использовать comm -1 -2
эти результаты. Если вы используете msysgit, вы можете использовать следующий код perl для сравнения:
perl -ne 'print if ($seen{$_} .= @ARGV) =~ /10$/' file1 file2
(Perl-код от http://www.cyberciti.biz/faq/command-to-display-lines-common-in-files/ , который взят у «кого-то из группы новостей comp.unix.shell»).
Посмотрите процесс замены, если вы хотите сделать его однострочным.
master
был объединен сfeature
, затем сразу жеfeature
объединен вmaster
качестве ускоренной перемотки вперед (наконечникfeature
заменяетmaster
). Будет ли это причиной,--first-parent
чтобы вернуть неправильный родитель?comm -1 -2
но это не сработало.comm
работает только на отсортированных строках. (Perl однострочный работает, хотя я не мог его прочитать.)git find-merge h master
(ничего не возвращает, но должен вернуть h),git find-merge d master
(возвращает f, но должен вернуть d),git find-merge c feature
(возвращает e, но должен вернуть g).Добавьте это к вашему
~/.gitconfig
:Затем вы можете использовать псевдонимы следующим образом:
Чтобы увидеть сообщение коммита слияния и другие детали, используйте
git show-merge
те же аргументы.(Основано на ответе Готье . Спасибо Розену Матеву и Джавабретту за исправление проблемы с
sort
.)источник
sort -k2 | uniq -f1 -d | sort -n | tail -1 | cut -f2
не найдете правильно последний общий ряд. Вот пример, где это терпит неудачу.16db9fef5c581ab0c56137d04ef08ef1bf82b0b7
здесь, когда я запускаю его на вашей пасте, это не ожидается? На какой ОС вы работаете?29c40c3a3b33196d4e79793bd8e503a03753bad1
git-get-merge найдет и покажет коммит слияния, который вы ищете:
Команда следует за дочерними элементами данного коммита, пока не будет найдено слияние с другой ветвью (предположительно master).
источник
То есть, чтобы подвести итог сообщения Готье:
РЕДАКТИРОВАТЬ: потому что это использует подстановку процесса "
<()
", это не POSIX-совместимый, и он может не работать с вашей оболочкой. Это работает сbash
илиzsh
хотя.источник
<()
не совместим с POSIX. Вы должны использоватьbash
,zsh
или оболочка поддерживает замену процесса . Я отредактировал свой ответ соответственно.Мне нужно было сделать это и как-то найти
git-when-merged
(что на самом деле ссылается на этот ТАК вопрос, но Майкл Хаггерти никогда не добавлял сюда ссылку на свой очень хороший скрипт на Python). Так что теперь у меня есть.источник
Опираясь на отличный ответ Готье, нам не нужно использовать
comm
для сравнения списков. Так как мы ищем последний результат, в--ancestry-path
котором он также находится--first-parent
, мы можем просто использовать grep для последнего в выходных данных первого:Или для чего-то быстрого и многократно используемого, вот функция, чтобы войти в
.bashrc
:источник
comm
не работал, когда входы не были отсортированы.Для толпы Ruby есть git-откуда . Очень просто.
источник
Я использую ниже bash скрипт, который я размещаю по пути
~/bin/git-find-merge
. Он основан на ответ Готье и ответ evilstreak в с несколькими настройками для обработки угловых случаев.comm
бросает, когда входы не отсортированы.grep -f
работает отлично.Угловые чехлы:
~/bin/git-find-merge
сценарий:Что позволяет мне сделать это:
Этот скрипт также доступен на моем github .
источник
Затем найдите первое слияние перед фиксацией.
источник
Моя рубиновая версия идеи @ robinst работает в два раза быстрее (что важно при поиске очень старого коммита).
find-commit.rb
Вы можете просто использовать это так:
источник
Вы можете попробовать что-то вроде этого. Идея состоит в том, чтобы перебрать все коммиты слияния и посмотреть, достижим ли коммит "c" из одного из них:
источник
git rev-list <SHA-1_for_c>..master --ancestry-path --merges
Мне пришлось делать это несколько раз (спасибо всем, кто ответил на этот вопрос!), И в итоге я написал скрипт (используя метод Готье), который я мог бы добавить в свою небольшую коллекцию утилит git. Вы можете найти его здесь: https://github.com/mwoehlke/git-utils/blob/master/bin/git-merge-point .
источник