Git: Ваша ветвь впереди X коммитов


379

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

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

  1. Изменить файлы
  2. совершить
  3. Повторите 1-2, пока не выполните
  4. Нажмите, чтобы освоить

Затем, когда я делаю a, git statusон говорит мне, что моя ветвь впереди X коммитов (предположительно, такое же количество коммитов, которое я сделал). Это потому, что когда вы нажимаете код, он фактически не обновляет ваши локально кэшированные файлы (в папках .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)

Как у вас дела pushи каковы ваши настройки удаленного и филиала конфигурации?
CB Bailey

2
на самом деле он не проверяет удаленное репо, вам нужно выполнить git-выборку самой последней информации об удаленном репо после выполнения push, это обновит локальную «удаленную» ветку, которую он использует для отслеживания.
Sekhat

2
@Sekhat: Пока git statusне проверяет удаленный репозиторий, git pullделает. Если у вас есть ветвь отслеживания для репозитория, к которому вы git pushотправляете, обновите локальную ветвь отслеживания, чтобы отразить новое состояние удаленной ветви, если ваша отправка прошла успешно. Вот почему я спросил о конфигурации asker, потому что, если это не происходит правильно, возможно, есть ошибка конфигурации.
CB Bailey

git status? действительно? my git statusникогда не говорит мне, насколько далеко впереди моя ветка ... вы передаете какие-то дополнительные аргументы?
hasen

4
@hasen j: git statusне идет в удаленный репозиторий, чтобы проверить, была ли удаленная ветвь обновлена. Он говорит вам, насколько далеко впереди ваша локальная ветка по сравнению с вашей локальной веткой удаленного отслеживания Проблема заключается в том, что обычное git push(а также извлечение и извлечение) должно обновлять ветку удаленного отслеживания, и для запрашивающего это, похоже, не работает. Чтобы понять, почему мы должны видеть как точную форму git push, которая используется, так и конфигурацию локального репозитория, но, поскольку спрашивающий уже принял ответ, я не вижу, чтобы это происходило сейчас.
CB Bailey

Ответы:


508

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

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


1
Браво. Это была действительно проблема. Я начал с создания хранилища в коде Google. Затем я клонировал этот репозиторий на своем ноутбуке, и я работаю там и отправляю изменения, Laptop => code.google. Я имел обыкновение получать это сообщение на моем сервере, где я создал клон code.google репозитория кода, и я использовал, чтобы получить изменения. Я думаю, что fetch требуется для обновления локальной базы данных.
rjha94

2
У нас была такая же проблема, потому что другая ветвь (A) указывала на тот же коммит master. Вытягивание А, а затем подтягивание мастера привело к той же ситуации. Когда git вытащил A, коммит был обновлен до последнего, поэтому при извлечении мастера ему нечего было извлекать, поэтому git не обновил мастер последним коммитом и предупреждал о том, что он «впереди мастера».
Uberto

8
Спасибо, хотя я заметил одну странную вещь. "git fetch origin master" не помогает, но "git fetch origin" делает. Я нахожусь в основной ветке, поэтому не уверен, как «происхождение git fetch» ​​будет делать что-то другое в контексте.
Параг

2
@Parag см stackoverflow.com/questions/26350876/... для объяснения различий между этими двумя командами, и как возможно изменить конфигурационный файл , чтобы изменить поведение , чтобы принести мерзавец удаленный филиал также обновляет удаленного отслеживания ветви реф, так git_status не сообщает «впереди».
Дом Анатортуаз

2
@Parag, также stackoverflow.com/questions/7365415/… answer обсуждает детали несинхронизации ORIG_HEAD и FETCH_HEAD, вызывая предупреждение о состоянии и возможные исправления файла конфигурации.
Дом Анатортуаз

138

использование

git pull --rebase

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


3
Действительно хороший способ предотвратить бесполезные слияния и создать более чистое дерево!
Hatef

1
Я попробовал эту команду, но у меня все еще есть та же проблема ...$ git pull --rebase Current branch xyz is up to date. $ git status On branch xyz Your branch is ahead of 'origin/xyz' by 6 commits. (use "git push" to publish your local commits) nothing to commit, working tree clean
BBH

4
Этот ответ неверен: если вы используете его, не понимая ситуации, вы потенциально создаете проблемы на будущее (переписанная история!). Если вы понимаете ситуацию, это не будет исправлением. Пожалуйста, подумайте, прежде чем печатать при использовании git, и никогда не пишите историю бездумно!
cmaster - восстановить

81

Используйте эти 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

Наслаждаться.


3
Это единственный ответ, который на самом деле решил проблему для меня. Приведенные выше команды странным образом сбили его с 12 до 7 коммитов, и это окончательно убрало их
Ieuan

1
Я согласен с тем, что это единственное, что сработало для меня. Я убежден, что у GIT иногда бывает множественное расстройство личности.
ksed

11
Как @leuan, только git reset --hard origin/masterпрояснил это для меня.
Дейв Лэнд

То же самое здесь, это единственные шаги, которые работали для меня
Shard_MW

51

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


22
Это на самом деле после того, как я нажал. Я должен был вытащить (или, возможно, получить?), Чтобы получить это сообщение.
SeanJA

26

Кто-то сказал, что вы, возможно, неправильно читаете свое сообщение, а вы нет. Эта проблема на самом деле связана с вашим <project>/.git/configфайлом. В нем будет раздел, похожий на этот:

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

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

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


Я проверю это в следующий раз, когда увижу ahead by x commitsсообщение. Я давно не видел сообщения.
SeanJA

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

Я попробовал это, но это заставило eGit в Eclipse начать всплывать с «внутренней ошибкой», когда я пытался зафиксировать. Хотя сам Git работал нормально.
user4815162342

19
Что делает эта линия? и что я пропускаю, удаляя это? (кроме раздражения)
Джон Ми

1
Это сработало, но это больше похоже на подавление ошибки. Добавьте строку назад, и вы снова получите предупреждение.
Кришна Пандей

15

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

git reset --hard origin/master

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

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

Сначала я попробовал без флага --hard, и это сработало!
Кроиз

12

Это сработало для меня

git reset --hard origin/master

Вывод должен выглядеть так

On branch dev HEAD is now at ae1xc41z Last commit message


11

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

 git checkout -B master

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

 git checkout master

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

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

git reset --hard origin/master

Чтобы исправить это


9

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

Удачи


4

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


Я считаю, что это эффективно делает git fetchза кадром.
Брайан Петерсон

"git fetch" не решил мою проблему, это сделал. Я получил список недавно добавленных веток и это сообщение «Вы попросили извлечь из удаленного« восходящего потока », но не указали ветку. Поскольку это не настроенный по умолчанию удаленный для вашей текущей ветки, вы должны указать ветку в команде». линия." и следующая команда «git status» не показала предупреждение.
Кришна Пандей

2

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


2

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

Сначала попробуйте с push -f опцией или силой

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

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

Чтобы подтвердить вышеизложенное, клонируйте репозиторий в другом месте и попробуйте сравнить локальный / ответвительный HEAD и удаленный / ответвительный HEAD. Если они оба одинаковы, то вы, вероятно, столкнулись с проблемой, которую я сделал.

Решение:

$ 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 ### Обратите внимание, что ваша команда не имеет origin !

Сделать git pull сейчас git pull github master

при git statusполучении

# On branch master

nothing to commit (working directory clean)

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

Также обратитесь к gitref для деталей


2

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

Моя проблема заключалась в том, что я создал филиал на основе другого локального филиала. Он создал запись «слияния», /.git/configкоторая выглядела примерно так:

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

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

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


2

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

git pull origin develop

должно сопровождаться $ git pull --rebase.

Это удалит комментарии, появляющиеся $ git statusпосле последней попытки.


2

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

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


1
Пожалуйста, добавьте описание
Mathews Sunny

2

Затем, когда я делаю git-статус, он говорит мне, что моя ветвь впереди по X-коммитам (предположительно, столько же коммитов, сколько я сделал ).

Мой опыт в командной среде со многими филиалами. Мы работаем в наших собственных ветках функций (в локальных клонах), и это было одно из тех, которые git statusпоказали, что я впереди на 11 коммитов. Как и автор вопроса, мое рабочее предположение заключалось в том, что +11 было от моих собственных коммитов. .

Оказалось, что я перенес изменения из общей developветви в свою функциональную ветку много недель назад - но забыл! Когда я сегодня снова посетил свою локальную ветку функций и выполнил git pull origin developкоманду, число подскочило до +41 коммитов вперед. Большая работа была проделана, developи поэтому моя локальная ветвь функций была еще дальше, чем ветка функций наorigin хранилище.

Поэтому, если вы получите это сообщение, вспомните о любых попытках слияния / слияния, которые вы, возможно, сделали из других ветвей (ваших или других), к которым у вас есть доступ. Сообщение просто сигнализирует вам о необходимости git pushэтих pullизменений обратно в originрепозиторий («отслеживающую ветвь») из вашего локального репозитория, чтобы все было синхронизировано.


1

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

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


Это , кажется, не быть для меня: .git/FETCH_HEADсодержит 9f7336c873ccffc772168bf49807e23ff74014d3 branch 'master' of URLи .git/refs/remotes/origin/masterсодержит 9f7336c873ccffc772168bf49807e23ff74014d3, но я все еще получаю сообщение и ни git pullни git fetchрешает эту проблему
Davide

0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.