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)
286
задан SeanJA 12 марта '10 в 15:15
источник поделиться
14 ответов

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

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

432
ответ дан Rich 24 июля '10 в 8:26
источник поделиться

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

git pull --rebase

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

72
ответ дан Marian Zburlea 13 марта '14 в 18:19
источник поделиться

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

47
ответ дан Josh Lee 12 марта '10 в 22:54
источник поделиться

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

Шаг 1: git checkout <branch_name>

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

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

Подробнее: qaru.site/questions/2568/...

Enjoy.

26
ответ дан Abhishek Goel 26 сент. '16 в 11:59
источник поделиться

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

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

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

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

26
ответ дан Fake Code Monkey Rashid 04 дек. '10 в 5:44
источник поделиться

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

 git checkout -B master

Просто чтобы вытащить новую версию, а не

 git checkout master

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

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

git reset --hard origin/master

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

5
ответ дан AxCoder 15 дек. '16 в 10:03
источник поделиться

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

4
ответ дан The Code Father 11 сент. '13 в 21:30
источник поделиться

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

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

Если это не сработало, возможно, что (как и в моем случае) удаленные репозитории (вернее, ссылки на удаленные репозитории, которые отображаются на 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

on git status получить

# On branch master

nothing to commit (working directory clean)

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

Также см. gitref для деталей

2
ответ дан Vikram 11 июля '13 в 0:43
источник поделиться

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

2
ответ дан wRAR 12 марта '10 в 15:21
источник поделиться

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

Желаем удачи

1
ответ дан Ryan Erwin 06 дек. '16 в 11:31
источник поделиться

Ответы, предлагающие 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 не изменяется.

1
ответ дан NoBrassRing 22 янв. '14 в 19:55
источник поделиться

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

git reset --hard origin/master

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

On branch master
Your branch is up-to-date with 'origin/master'.
1
ответ дан Anatolii Pazhyn 06 сент. '16 в 12:28
источник поделиться

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

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

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

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

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

1
ответ дан Dustin Graham 10 сент. '13 в 21:57
источник поделиться

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

git pull origin develop

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

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

0
ответ дан Partho Chatterjee 20 нояб. '17 в 19:29
источник поделиться

Другие вопросы по меткам