Git: Как проверить, указывают ли локальные и удаленные ветви на один и тот же коммит (т.е. синхронизированы)? - PullRequest
12 голосов
/ 02 февраля 2012

Как я могу проверить, указывают ли feature_branch и origin/feature_branch на один и тот же коммит?

Ответы [ 6 ]

13 голосов
/ 02 февраля 2012

Вы можете сравнить вывод git-rev-parse, например, в этом бите сценария оболочки:

export BRANCH_A=feature_branch
export BRANCH_B=origin/feature_branch

if [ x"$(git rev-parse $BRANCH_A)" = x"$(git rev-parse $BRANCH_B)" ]
then
    echo $BRANCH_A and $BRANCH_B are the same
fi

Если вы не заинтересованы в использовании этого в сценарии, но просто хотите получить некоторую индикациюгде feature_branch и origin/feature_branch относительно друг друга, тогда верхняя часть вывода git status сообщит вам свои относительные позиции, если они не совпадают, например:

$ git status
# On branch foo
# Your branch is behind 'origin/foo' by 187 commits, and can be fast-forwarded.

Однако,обратите внимание, что это работает, только если ваш git config указывает, что origin/feature_branch является "восходящим" для feature_branch.Если вы создали локальную ветвь из ранее существующей ветки удаленного отслеживания, это обычно имеет место.Если вместо этого feature_branch была новая ветвь, которую вы создали локально, вы можете установить эту связь в вашей конфигурации, нажав на ветку с помощью -u, например, git push -u origin feature_branch.)

2 голосов
/ 02 февраля 2012

Вы можете использовать git rev-list.Просто позвоните git rev-list feature_branch...origin/feature_branch (симметричная разница).Если выходных данных нет, оба коммита одинаковы.

Очевидно, что самый чистый способ - это git rev-parse и сравнение результатов, как указано Mark Longair

1 голос
/ 04 августа 2017

git rev-parse origin/foo_branch не даст вам последний хеш коммита в удаленной ветке.Он даст вам последний хеш коммита, о котором знает ваш локальный git-репозиторий в удаленной ветке.

Если вы хотите сравнить, актуален ли ваш локальный foo_branch с текущим пультом, вы, вероятно, захотите:

# remote commit hash.
# will do a network request to get latest.
git ls-remote --head --exit-code origin foo_branch | cut -f 1

# local commit hash.
git rev-parse foo_branch

В качестве альтернативы, если вы хотитечтобы использовать git rev-parse, вам нужно сначала получить последние изменения перед запуском rev-parse:

git fetch origin foo_branch
git rev-parse origin/foo_branch

Мне нравится подход git ls-remote, потому что он оставляет ваш локальный репозиторий без изменений.

1 голос
/ 02 февраля 2012

Вы можете использовать простую команду, подобную этой:

git diff feature_branch origin/feature_branch

, которая покажет что-то, только если ветви будут указывать на что-то другое.


git log -1 --decorate feature_branch

, если она покажет вам что-токак это

commit c1e77c1....896b (origin/feature_branch, feature_branch)

, чем обе ветви указывают на этот же коммит.

commit c1e77c1....896b (feature_branch)

означает, что ветви не синхронизируются.


Вы также можете использовать

git merge-base feature_branch origin/feature_branch

, который будет указывать последний общий коммит.И затем

git merge-base feature_branch origin/feature_branch | git show --decorate

Как сказал Марк Лонгэйр, git status также может быть решением (иногда наиболее удобным), однако это зависит от вашего рабочего хранилища и скорости git status (чтоможет быть увеличено на git gc время от времени)

0 голосов
/ 13 августа 2017

Статус простого git должен показывать, сколько коммитов ваша текущая ветка впереди / позади пульта. Убедитесь, что все пульты настроены правильно.

0 голосов
/ 02 февраля 2012

Если вы сделаете git log feature_branch, он покажет вам историю. Просто проверьте, совпадает ли идентификатор SHA фиксации с историей git log origin/feature_branch.

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