Первое использование git remote update
, чтобы обновить ваши удаленные ссылки. Затем вы можете сделать одну из нескольких вещей, таких как:
git status -uno
сообщит вам, находится ли отслеживаемая вами ветка впереди, позади или разошлась. Если это ничего не говорит, локальный и удаленный - то же самое.
git show-branch *master
покажет вам коммиты во всех ветвях, имена которых оканчиваются на «master» (например, master и origin / master ).
Если вы используете -v
с git remote update
( git remote -v update
), вы можете увидеть, какие ветви были обновлены, поэтому вам больше не нужны никакие дополнительные команды.
Тем не менее, похоже, что вы хотите сделать это в скрипте или программе и получить значение true / false. Если это так, есть способы проверить взаимосвязь между вашим текущим коммитом HEAD и отслеживаемым заголовком ветви, хотя, поскольку есть четыре возможных результата, вы не можете свести его к ответу да / нет. Однако, если вы готовы сделать это, pull --rebase
вы можете рассматривать «местный позади» и «местный разошелся» как «нужно тянуть», а два других - как «не нужно тянуть».
Вы можете получить идентификатор коммита для любой ссылки с помощью git rev-parse <ref>
, так что вы можете сделать это для master и origin / master и сравнить их. Если они равны, ветви одинаковы. Если они неравны, вы хотите знать, что впереди другого. Использование git merge-base master origin/master
скажет вам общего предка обеих ветвей, и если они не разошлись, это будет то же самое, что и та или другая. Если вы получаете три разных идентификатора, ветви разошлись.
Чтобы сделать это правильно, например, в скрипте, вы должны иметь возможность ссылаться на текущую ветку и на удаленную ветку, которую она отслеживает. Функция установки подсказок в bash /etc/bash_completion.d
имеет некоторый полезный код для получения имен веток. Тем не менее, вам, вероятно, не нужно получать имена. В Git есть несколько удобных сокращений для ссылок на ветки и коммиты (как описано в git rev-parse --help
). В частности, вы можете использовать его @
для текущей ветви (при условии, что вы не находитесь в состоянии отсоединенной головы) и @{u}
для его ветви восходящего направления (например,origin/master
). Так git merge-base @ @{u}
будет возвращать (хэш из) фиксации , при котором ток ветви и ее вверх по течению и расходятся , git rev-parse @
и git rev-parse @{u}
даст вам хэши двух советов. Это можно обобщить в следующем сценарии:
#!/bin/sh
UPSTREAM=${1:-'@{u}'}
LOCAL=$(git rev-parse @)
REMOTE=$(git rev-parse "$UPSTREAM")
BASE=$(git merge-base @ "$UPSTREAM")
if [ $LOCAL = $REMOTE ]; then
echo "Up-to-date"
elif [ $LOCAL = $BASE ]; then
echo "Need to pull"
elif [ $REMOTE = $BASE ]; then
echo "Need to push"
else
echo "Diverged"
fi
Примечание: старые версии git не разрешали @
сами по себе, поэтому вам, возможно, придется использовать @{0}
вместо этого.
Линия UPSTREAM=${1:-'@{u}'}
позволяет вам при желании явно передать ветвь вверх по течению, если вы хотите проверить другую удаленную ветвь, отличную от настроенной для текущей ветки. Это, как правило, имеет вид remotename / branchname . Если параметр не указан, по умолчанию используется значение @{u}
.
Сценарий предполагает, что вы уже сделали первый git fetch
или git remote update
первый шаг, чтобы обновить ветки отслеживания. Я не встроил это в скрипт, потому что он более гибок, чтобы можно было выполнять выборку и сравнение как отдельные операции, например, если вы хотите сравнить без выборки, потому что вы уже загрузили недавно.