Определите, разошлись ли две ветки Git

Я хотел бы определить, разошлись ли две ветки Git или просто одну из веток можно быстро переслать в другую ветку.

Другими словами, я хочу проверить, был ли текущий HEAD одной из веток в какой-то момент объединен с другой веткой или содержит ли он коммиты, которых нет в другой ветке.

Есть ли способ сделать это без фактического слияния двух ветвей? Простоgit diff не помогает в этом случае.

Ответы на вопрос(4)

git merge-base

Описание можно найтиВот.

 jørgensen28 мар. 2012 г., 16:34
И чтобы завершить это:m="$(git merge-base b1 b2)"; test "$m" = "$(git rev-parse b1)" -o "$m" = "$(git rev-parse b2)";

git merge --ff-only otherbranch удастся. (И если это невозможно, он будет отклонен, а не будет сделан коммит слияния.)

gitk branch1 branch2, Это также позволяет вам при необходимости проверять расходящиеся коммиты.

Решение Вопроса

git_is_merged() {
    local revlist
    revlist=$(git rev-list -1 "$1" --not "$2")
    if [ $? -eq 0 ]; then
        if [ "$revlist" = "" ]; then
            echo "'$1' IS merged into '$2'."
        else
            echo "'$1' is NOT merged into '$2'."
        fi
    fi
}

alias gim='git_is_merged'

Используйте это какgim origin/devel origin/master определить,origin/devel слит вorigin/master.

Редактировать: Для полноты картины, если вы работаете только с именованными ветвями, вы также можете использовать

git branch --contains origin/devel | grep -q origin/master && echo "Merged" || echo "Not merged"

или же

git branch --merged origin/master | grep -q origin/devel && echo "Merged" || echo "Not merged"

для той же цели.

 ReenignE27 апр. 2017 г., 21:23
@sschuberth Спасибо за то, что приняли во внимание эти моменты! Я хочу указать на подводные камни № 25 и № 27 по этой ссылке, которые актуальны здесь.mywiki.wooledge.org/BashPitfalls#function_foo.28.29 Возвращаемое значение $? теперь маскируется локальным объявлением var и, вероятно, всегда будет возвращать 0, поэтому в редактировании он был отделен от того, где была установлена переменная.
 sschuberth27 апр. 2017 г., 20:46
@ReenignE Не беспокойся. Я благодарен за правки, которые приносят ясную ценность, но в этом случае значение было неясным для меня (и на этот раз это я, кто не хочет наступать на ваши пальцы). Может быть, это только из-за моего среднего знания Bash. Я сознательно использовал этот «лишний» псевдоним, чтобы подчеркнуть, чтоgim обозначает. Но теперь я вижу ценность цитирования аргументов и наличия локальной переменной, и соответственно скорректировал свой ответ. Благодарю.
 ReenignE27 апр. 2017 г., 21:20
@sschuberth Я полагаю, что мои рассуждения таковы, что люди, которые учатся на подобном коде, могут не понимать, что функция может быть вызвана напрямую. Я согласен с тем, что просто назвать функцию gim не так удобно для чтения. Вы думаете, что вышеприведенный комментарий с описательным текстом о назначении функций будет лучшим подходом?
 Danilo Bargen28 мар. 2012 г., 16:15
Очень мило :) Я играл сgit for-each-ref | grep $(git merge-base <branch1> <branch2>)и подумал о написании функции оболочки, но ваше решение определенно выглядит чище.
 ReenignE27 апр. 2017 г., 19:40
Извинения @sschuberth не означали наступать на ваши пальцы с предложенным редактированием. Нет необходимости создавать псевдоним, когда у вас уже есть функция. Неиспользование локального ключевого слова внутри функции означает, что revlist var сохраняется в среде после его выполнения. & не заключая в кавычки аргументы $ 1 / $ 2, может возникнуть проблема со странными именами ветвей, которые все еще допустимы и разрешены git; в том числе точки с запятой, цитаты и тому подобное. Редактирование было одобрено двумя рецензентами без дальнейших изменений, которые я представляю по этим причинам.

Ваш ответ на вопрос