Для тех, у кого есть проблемы,
попробуйте это (мой хостинг был из Godaddy , и это единственное, что работало для меня среди всех ответов там.
AddHandler x-httpd-php5-cgi .html
Сначала используйте git remote update
, чтобы обновить ваши удаленные ссылки. Затем вы можете выполнить одно из следующих действий, например:
git status -uno
сообщит вам, идет ли отслеживаемая вами ветка впереди, позади или разошлась. Если он ничего не говорит, значит, локальный и удаленный одинаковые.
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
, чтобы обновить ветки отслеживания. Я не встраивал это в скрипт, потому что он более гибок, позволяя выполнять выборку и сравнение как отдельные операции, например, если вы хотите сравнивать без выборки, потому что вы уже выполняли выборку недавно.
Все такие сложные предложения, в то время как решение так коротко и легко:
#!/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
Я думаю, что лучший способ сделать это:
git diff remotes/origin/HEAD
Предполагая, что у вас зарегистрирован this refspec. Вам следует, если вы клонировали репозиторий, в противном случае (то есть, если репо было создано de novo локально и отправлено на удаленный компьютер), вам необходимо явно добавить refspec.
Команда
git ls-remote origin -h refs/heads/master
выведет список текущего заголовка на пульте дистанционного управления - вы можете сравнить его с предыдущим значением или посмотреть, есть ли у вас SHA в вашем локальном репо.
Запустите git fetch (remote)
, чтобы обновить ваши удаленные ссылки, он покажет вам, что нового. Затем, когда вы проверяете свой локальный филиал, он покажет вам, отстает ли он от восходящего потока.