Проверьте, нужно ли тянуть в Git

Для тех, у кого есть проблемы,

попробуйте это (мой хостинг был из Godaddy , и это единственное, что работало для меня среди всех ответов там.

AddHandler x-httpd-php5-cgi .html

581
задан Peter Mortensen 10 November 2015 в 16:08
поделиться

5 ответов

Сначала используйте git remote update , чтобы обновить ваши удаленные ссылки. Затем вы можете выполнить одно из следующих действий, например:

  1. git status -uno сообщит вам, идет ли отслеживаемая вами ветка впереди, позади или разошлась. Если он ничего не говорит, значит, локальный и удаленный одинаковые.

  2. git show-branch * master покажет вам коммиты во всех ветвях, имена которых заканчиваются на master (например, master и origin / master ).

Если вы используете -v с git remote update ( git remote -v update ), вы можете увидеть, какие ветки были обновлены, поэтому не действительно нужны какие-то дополнительные команды.

Однако похоже, что вы хотите сделать это в сценарии или программе и получить значение истина / ложь. Если это так, есть способы проверить связь между вашим текущим коммитом HEAD и заголовком отслеживаемой ветки, хотя, поскольку существует четыре возможных результата, вы не можете свести его к да / нет. отвечать. Однако, если вы готовы выполнить pull --rebase , тогда вы можете рассматривать «local is behind» и «local has diverged» как «необходимо подтянуть», а два других - как «don ' не нужно тянуть ".

Вы можете получить идентификатор фиксации любой ссылки с помощью git rev-parse , так что вы можете сделать это для 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}'} позволяет вам дополнительно явно передать восходящую ветвь, если вы хотите проверить другую удаленную ветку, отличную от настроенной для текущей ветки. Обычно это имеет форму удаленное имя / название ветви .Если параметр не указан, по умолчанию используется значение @ {u} .

Сценарий предполагает, что вы сначала выполнили удаленное обновление git fetch или git , чтобы обновить ветки отслеживания. Я не встраивал это в скрипт, потому что он более гибок, позволяя выполнять выборку и сравнение как отдельные операции, например, если вы хотите сравнивать без выборки, потому что вы уже выполняли выборку недавно.

815
ответ дан 22 November 2019 в 22:01
поделиться

Все такие сложные предложения, в то время как решение так коротко и легко:

#!/bin/bash

BRANCH="<your branch name>"
LAST_UPDATE=`git show --no-notes --format=format:"%H" $BRANCH | head -n 1`
LAST_COMMIT=`git show --no-notes --format=format:"%H" origin/$BRANCH | head -n 1`

git remote update
if [ $LAST_COMMIT != $LAST_UPDATE ]; then
        echo "Updating your branch $BRANCH"
        git pull --no-edit
else
        echo "No updates available"
fi
3
ответ дан 22 November 2019 в 22:01
поделиться

Я думаю, что лучший способ сделать это:

git diff remotes/origin/HEAD

Предполагая, что у вас зарегистрирован this refspec. Вам следует, если вы клонировали репозиторий, в противном случае (то есть, если репо было создано de novo локально и отправлено на удаленный компьютер), вам необходимо явно добавить refspec.

9
ответ дан 22 November 2019 в 22:01
поделиться

Команда

git ls-remote origin -h refs/heads/master

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

36
ответ дан 22 November 2019 в 22:01
поделиться

Запустите git fetch (remote) , чтобы обновить ваши удаленные ссылки, он покажет вам, что нового. Затем, когда вы проверяете свой локальный филиал, он покажет вам, отстает ли он от восходящего потока.

4
ответ дан 22 November 2019 в 22:01
поделиться