git: ваша ветка опережает X коммитов

как это на самом деле происходит?

Я работаю в одном РЕПО сам по себе в данный момент, так что это мой рабочий процесс:

  1. изменить файлы
  2. Commit
  3. повторите 1-2, пока не удовлетворены
  4. нажмите на master

тогда, когда я делаю git status Он говорит мне, что моя ветка вперед по X commits (предположительно такое же количество коммитов, которое я сделал). Это потому, что когда вы нажимаете код, он не фактически обновите локально кэшированные файлы (в .git folders)? git pull Кажется, "исправить" это странное сообщение, но мне все еще интересно, почему это происходит, может быть, я использую git неправильно?


в том числе какая ветка напечатана в сообщении

мой местный филиал опережает master

где вы нажимаете / тянете текущую ветку

Я нажимаю на GitHub и тянет к любому компьютеру, на котором я оказался работая на данный момент, моя локальная копия всегда полностью обновлена, поскольку я единственный, кто работает над ней.

он фактически не проверяет удаленное РЕПО

Это то, что я думал, я решил, что я должен убедиться, что мое понимание этого было правильным.

вы передаете ему дополнительные аргументы?

не те, которые я вижу, может быть, на моем конце есть какая-то забавная конфигурация?

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)

16 ответов


если вы получите это сообщение после этого git pull remote branch, попробуйте выполнить его с помощью git fetch. (Необязательно, run git fetch -p обрезать удаленные ветви из РЕПО)

Fetch, похоже, обновляет локальное представление удаленной ветви, что не обязательно происходит, когда вы делаете git pull remote branch.


использовать

git pull --rebase

опция --rebase означает, что git переместит вашу локальную фиксацию в сторону, синхронизируется с удаленным, а затем попытается применить ваши фиксации из нового состояния.


Я думаю, вы неправильно читаете сообщение - ваш филиал не опережает master, Это is master. Это впереди origin/master, который является удаленного слежения филиал это записывает статус удаленного репозитория из вашего последнего push, pull или fetch. Он говорит вам точно, что вы сделали; вы опередили пульт, и он напоминает вам нажать.


используйте эти 3 простые команды

Шаг 1 : git checkout <branch_name>

Шаг 2 : git pull -s recursive -X theirs

Шаг 3 : git reset --hard origin/<branch_name>

больше деталей:https://stackoverflow.com/a/39698570/2439715

наслаждайтесь.


кто-то сказал, что вы, возможно, неправильно читаете свое сообщение, вы не. Эта проблема на самом деле связана с вашим . В нем будет раздел, подобный этому:

[remote "origin"]
    url = <url>
    fetch = +refs/heads/*:refs/remotes/origin/*

Если вы удалите строку выборки из вашего проекта .файл git / config вы остановите "ваша ветка опережает" origin / master " на N commits."раздражение от происходящего.

или так я надеюсь. :)


у меня была эта проблема на моем сервере сцены, где я только вытягиваю. И жесткий сброс помог мне очистить голову так же, как и пульт.

git reset --hard origin/master

Итак, теперь у меня снова:

On branch master
Your branch is up-to-date with 'origin/master'.

В моем случае это было потому что я переключился на мастера, используя

 git checkout -B master

просто вытащить новую версию вместо

 git checkout master

первая команда сбрасывает голову мастера мои последние коммиты

Я

git reset --hard origin/master

исправить


Я просмотрел все решения на этой странице, и, к счастью, @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

удачи


у меня была такая же проблема на машине Windows. Когда я побежал git pull origin master command, я бы получил предупреждение" впереди "origin/master " по X commits". Я обнаружил, что если я вместо этого побежал git pull origin и не указал ветку, тогда я больше не получу предупреждение.


Это просто напоминает вам различия между текущей веткой и веткой, которая делает текущий трек. Пожалуйста, предоставьте дополнительную информацию, в том числе, какая ветвь напечатана в сообщении и где вы нажимаете/тянете текущую ветвь.


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

первая попытка с push -f или форс вариант

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

результат выше того, что ваш толчок синхронизировал ваш локальный / филиал с вашим удаленным / филиалом однако кэш в локальном репо по-прежнему показывает предыдущую фиксацию (локальной/ветви ...при условии, что только одна фиксация была нажата) как голова.

чтобы подтвердить выше клонировать РЕПО в другом месте и попытаться сравнить локальную/головку филиала и удаленную/головку филиала. Если они оба одинаковы, то вы, вероятно, столкнулись с проблемой, которую я сделал.

устранение:

$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)
$ git remote add origin git://github.com/pjhyett/hw.git
$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com: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  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)

теперь push -f следующим образом

git push -f github master ### Примечание команда нет


на самом деле это произошло, когда я делал переключатель/проверку с TortiseGIT.

моя проблема заключалась в том, что я создал ветку на основе другой локальной ветви. Он создал запись "merge" в /.git/config это выглядело примерно так:

[branch "web"]
    merge = refs/heads/develop
    remote = gitserver

где всякий раз, когда я переключался на ветку "web", он говорил мне, что я был на 100+ коммитов впереди разработки. Ну, я больше не собирался развиваться, так что это было правдой. Я мог просто удалить эту запись и она похоже, функционирует как и ожидалось. Он правильно отслеживает с удаленным ref вместо того, чтобы жаловаться на то, что находится за веткой разработки.

Как сказал Викрам, этот поток переполнения стека является лучшим результатом в Google при поиске этой проблемы, поэтому я подумал, что поделюсь своей ситуацией и решением.


ответы, которые предлагают git pull или git fetch являются правильными.
Сообщение генерируется, когда git status видит разницу между .git/FETCH_HEAD и .git/refs/remotes/<repository>/<branch> (например,.git/refs/remotes/origin/master).

последний файл записывает голову из последней выборки (для репозитория/ветви). Делать git fetch обновляет оба файла до текущей головки филиала.
Конечно, если нет ничего, чтобы получить (потому что локальный репозиторий уже обновлен), то .git/FETCH_HEAD не меняется.


Я хотел бы повторить то же самое, что упоминалось @Marian Zburlia выше. Это сработало для меня и предложило бы то же самое другим.

git pull origin develop

следует $ git pull --rebase.

это удалит комментарии, поступающие на $ git status после последнего тянуть.


Если вы получаете это сообщение после выполнения фиксации, чтобы распаковать файл в ветке, попробуйте внести некоторые изменения в любой файл и выполнить фиксацию. По-видимому, вы не можете сделать одну фиксацию, которая включает только отследить ранее отслеживаемый файл. Наконец, этот пост помог мне решить всю проблему https://help.github.com/articles/removing-files-from-a-repository-s-history/. Мне просто нужно было удалить файл из истории репозитория.


git fetch разрешит это для вас

Если мое понимание верно, ваш локальный (кэшированный)origin/master устарело. Эта команда обновит состояние репозитория с сервера.