Как проверить, являются ли две ветки "четными"?

В веб-интерфейсе GitHub есть хорошая функция, которая сообщает мне, является ли ветвь ветвью master.

Есть ли в командной строке аналог этой функции? Я работаю с несколькими репозиториями и ищу быстрый способ определить, являются ли ветки четными или требуют внимания.

Вот скриншот веб-интерфейса GitHub для тех, кто интересуется этой функцией:

enter image description here

enter image description here

Ответ 1

Чтобы сравнить файлы ветки с названием branch, расположенной в GitHub, с master в том же репозитории, вы можете использовать git diff:

git diff origin/branch origin/master

Следующее будет работать, чтобы сравнить коммиты между двумя ветвями:

git log --left-right --graph --cherry-pick --oneline origin/branch...origin/master

Как уже упоминалось в моем комментарии выше, возможно, что две ветки могут иметь одинаковые файлы, но разные коммиты.

Ответ 2

GitHub терминология

Branch A и branch B are even.

такое язык GitHub для

Ветвь A и ветвь B указывают на один и тот же коммит.

Равны ли две ветки?

Если вас интересует, являются ли две ветки четными или нет, без каких-либо дополнительных подробностей (например, счетчик коммитов), дружественный к сценариям способ состоит в том, чтобы просто проверить SHA их советов на равенство:

[ "$(git rev-parse <refA>)" = "$(git rev-parse <refB>)" ]

После выполнения этой команды значение $? равно 0, если <ref1> и <ref2> четные, и 1 в противном случае. Поскольку эта команда включает только команду Git git-rev-parse, ее можно безопасно использовать программно.

Одна ветвь впереди или позади другой?

Если вы хотите эмулировать функциональность GitHub, например, печать

foo is n фиксирует перед баром

и т.д., вы можете использовать следующий скрипт:

#!/bin/sh

# git-checkeven.sh
#
# Check whether two revisions are even, and, otherwise, to what extent
# the first revision is ahead of / behind the second revision
#
# Usage: git checkeven <revA> <revB>
#
# To make a Git alias called 'checkeven' out of this script,
# put the latter on your search path, and run
#
#   git config --global alias.checkeven '!sh git-checkeven.sh'

if [ $# -ne 2 ]; then
    printf "usage: git checkeven <revA> <revB>\n\n"
    exit 2
fi

revA=$1
revB=$2

nA2B="$(git rev-list --count $revA..$revB)"
nB2A="$(git rev-list --count $revB..$revA)"

if [ "$nA2B" -eq 0 -a "$nB2A" -eq 0 ]; then
  printf "$revA is even with $revB\n"
  exit 0
elif [ "$nA2B" -gt 0 ]; then
  printf "$revA is $nA2B commits behind $revB\n"
  exit 1
else
  printf "$revA is $nB2A commits ahead of $revB\n"
  exit 1
fi

Test

Предположим, игрушечное репо со следующей историей:

... -- * [release71]
        \
         * [master, develop]

Затем, после определения псевдонима Git с именем areeven, который вызывает приведенный выше скрипт, вы получаете...

$ git checkeven release71 develop
release71 is 1 commits behind develop
$ git checkeven develop release71
develop is 1 commits ahead of release71
$ git checkeven master develop
master is even with develop

Ответ 3

Сравните хеширование фиксации

Если вы хотите проверить, являются ли две ветки эквивалентными, просто сравните хеш фиксации:

-> git branch -v
  master                       0ccca51 Commencing the awesome
                               ^^^^^^^

-> git fetch
-> git branch -v -r
  origin/master                0ccca51 Commencing the awesome
                               ^^^^^^^
  origin/other                 0ccca51 Commencing the awesome
                               ^^^^^^^

Если хеши фиксации совпадают - ветки не находятся ни впереди, ни друг за другом, они точно такие же.