Git: ваша ветка впереди с помощью X commits
Как это происходит?
В настоящий момент я работаю в одном репо, так что это мой рабочий процесс:
- Изменить файлы
- Фиксировать
- Повторяйте 1-2 до тех пор, пока не будете удовлетворены.
- Нажмите на мастер
Тогда, когда я делаю a git status
, он сообщает мне, что моя ветка впереди по X commits (предположительно, то же количество совершений, которые я сделал). Это потому что, когда вы нажимаете код, он фактически не обновляет ваши локально кэшированные файлы (в папках .git)? git pull
похоже, исправляет это странное сообщение, но мне все еще интересно, почему это происходит, может быть, я использую git неправильно?
в том числе, какая ветвь напечатана в сообщении
Моя локальная ветвь впереди мастера
где вы нажимаете/тянете текущую ветвь
Я подталкиваю GitHub и тяну к тому компьютеру, на котором я сейчас работаю, моя локальная копия всегда полностью обновлена, так как я единственный, кто работает над ней.
он фактически не проверяет удаленное репо
Вот что я подумал, я подумал, что я убедился бы, что мое понимание этого было правильным.
вы передаете ему дополнительные аргументы?
Не те, которые я вижу, может быть, на моем конце происходит какая-то смешная конфигурация?
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)
Ответы
Ответ 1
Если вы получите это сообщение после git pull remote branch
, попробуйте выполнить его с помощью git fetch
. (Возможно, запустите git fetch -p
, чтобы обрезать удаленные ветки из репо)
Кажется, что Fetch обновляет локальное представление удаленной ветки, что не обязательно происходит, когда вы выполняете git pull remote branch
.
Ответ 2
Использование
git pull --rebase
Параметр --rebase означает, что git переместит ваш локальный фиксатор в сторону, синхронизируется с удаленным, а затем попытается применить ваши коммиты из нового состояния.
Ответ 3
Я думаю, что вы неправильно читаете сообщение - ваша ветка не впереди master
, это master
. Он впереди origin/master
, который является удаленной веткой отслеживания, которая записывает статус удаленного репозитория из ваших последних push
, pull
или fetch
. Он говорит вам, что вы сделали; вы опередили пульт дистанционного управления и напомнили вам о том, чтобы нажать.
Ответ 4
Кто-то сказал, что вы неправильно читаете свое сообщение, а вы нет. Эта проблема действительно связана с вашим файлом <project>/.git/config
. В нем будет раздел, похожий на этот:
[remote "origin"]
url = <url>
fetch = +refs/heads/*:refs/remotes/origin/*
Если вы удалите строку выборки из файла проекта .git/config, вы остановите "Ваша ветка впереди" origin/master "на N
совершает". раздражение от происходящего.
Или я надеюсь.:)
Ответ 5
Используйте эти три простые команды
Шаг 1: git checkout <branch_name>
Шаг 2: git pull -s recursive -X theirs
Шаг 3: git reset --hard origin/<branch_name>
Подробнее: fooobar.com/questions/2568/...
Enjoy.
Ответ 6
В моем случае это было потому, что я переключился на мастера, используя
git checkout -B master
Просто чтобы вытащить новую версию, а не
git checkout master
Первая команда сбрасывает главу мастера до моих последних коммитов
Я использовал
git reset --hard origin/master
Чтобы исправить это,
Ответ 7
У меня была такая же проблема на машине Windows. Когда я запустил команду git pull origin master
, я бы получил предупреждение "впереди" источника/хозяина "Х". Я обнаружил, что если я вместо этого выполнял git pull origin
и НЕ указывал ветку, я бы больше не получил предупреждение.
Ответ 8
Он просто напоминает вам различия между текущей ветвью и веткой, которая выполняет текущий трек. Пожалуйста, предоставьте дополнительную информацию, в том числе, какая ветка напечатана в сообщении, и где вы нажимаете/тянете текущую ветку.
Ответ 9
Хотя этот вопрос немного старый... Я был в подобной ситуации, и мой ответ здесь помог мне исправить аналогичную проблему, которую я имел
Сначала попробуйте с параметром push -f
или force
Если это не сработало, возможно, что (как и в моем случае) удаленные репозитории (вернее, ссылки на удаленные репозитории, которые отображаются на git remote -v
), могут не обновляться.
Результат выше, ваш push синхронизировал вашу локальную/ветвь с удаленным/веткистым, но кеш в вашем локальном репо по-прежнему показывает предыдущую фиксацию (из локальной/ветки... при условии, что только одна фиксация была нажата) как HEAD.
Чтобы подтвердить вышеприведенное клонирование репо в другом месте и попытаться сравнить локальную/ветвь HEAD и удаленную/ветвь HEAD. Если они оба одинаковы, то вы, вероятно, столкнулись с проблемой, которую я сделал.
Решение:
$ git remote -v
github [email protected]:schacon/hw.git (fetch)
github [email protected]:schacon/hw.git (push)
$ git remote add origin git://github.com/pjhyett/hw.git
$ git remote -v
github [email protected]:schacon/hw.git (fetch)
github [email protected]:schacon/hw.git (push)
origin git://github.com/pjhyett/hw.git (fetch)
origin git://github.com/pjhyett/hw.git (push)
$ git remote rm origin
$ git remote -v
github [email protected]:schacon/hw.git (fetch)
github [email protected]:schacon/hw.git (push)
Теперь сделайте push -f
следующим образом
git push -f github master
### Обратите внимание: ваша команда больше не имеет origin
!
Сделайте git pull
сейчас
git pull github master
on git status
получить
# On branch master
nothing to commit (working directory clean)
Я надеюсь, что это полезно для кого-то, так как количество просмотров настолько велико, что поиск этой ошибки почти всегда перечисляет этот поток в верхней части
Также см. gitref для деталей
Ответ 10
Я действительно имел это, когда я делал переключатель /checkout с TortiseGIT.
Моя проблема заключалась в том, что я создал ветвь на основе другой локальной ветки. Он создал запись "merge" в /.git/config
, которая выглядела примерно так:
[branch "web"]
merge = refs/heads/develop
remote = gitserver
Где бы я ни переключился на "веб-ветвь", он говорил мне, что я был на 100+ раньше, чем развился. Ну, я больше не собирался развиваться, чтобы это было правдой. Я смог просто удалить эту запись, и, похоже, она функционирует так, как ожидалось. Это правильно отслеживание с помощью дистанционного ref вместо того, чтобы жаловаться на то, что находится за ветвью разработки.
Как сказал Викрам, этот поток является лучшим результатом в Google при поиске этой проблемы, поэтому я решил поделиться своей ситуацией и решением.
Ответ 11
Ответы, предлагающие git pull
или git fetch
, верны.
Сообщение генерируется, когда git status
видит разницу между .git/FETCH_HEAD
и .git/refs/remotes/<repository>/<branch>
(например, .git/refs/remotes/origin/master
).
Последний файл записывает HEAD из последней выборки (для репозитория/ветки). Выполнение git fetch
обновляет оба файла до текущей ветки HEAD.
Конечно, если ничего не получится (поскольку локальный репозиторий уже обновлен), то .git/FETCH_HEAD
не изменяется.
Ответ 12
У меня была эта проблема на моем сервере сцены, где я только тяну.
И жесткий reset помог мне очистить HEAD так же, как и отдаленный.
git reset --hard origin/master
Итак, теперь я снова:
On branch master
Your branch is up-to-date with 'origin/master'.
Ответ 13
Я просмотрел все решения на этой странице, и, к счастью, @anatolii-pazhyn прокомментировал, потому что его решение было тем, что работало. К сожалению, у меня нет достаточной репутации, чтобы повысить его, но я рекомендую сначала попробовать его решение:
git reset --hard origin/master
Который дал мне:
HEAD is now at 900000b Comment from my last git commit here
Я также рекомендую:
git rev-list origin..HEAD
# to see if the local repository is ahead, push needed
git rev-list HEAD..origin
# to see if the local repository is behind, pull needed
Вы также можете использовать:
git rev-list --count --left-right origin/master...HEAD
# if you have numbers for both, then the two repositories have diverged
Желаем удачи
Ответ 14
Я хотел бы повторить то же самое, что упоминал выше @Marian Zburlia. Это сработало для меня и предложило бы то же самое другим.
git pull origin develop
следует $ git pull --rebase
.
Это приведет к удалению комментариев, следующих на $ git status
после последнего нажатия.