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 после последнего нажатия.