git: ваша ветка опережает X коммитов
как это на самом деле происходит?
Я работаю в одном РЕПО сам по себе в данный момент, так что это мой рабочий процесс:
- изменить файлы
- Commit
- повторите 1-2, пока не удовлетворены
- нажмите на 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
устарело. Эта команда обновит состояние репозитория с сервера.