Git говорит, что локальная ветка находится за удаленной веткой, но это не так

83

Сценарий:

  1. Делаю новую ветку
  2. взломать это
  3. совершить это
  4. толкни это
  5. взломай это еще
  6. совершить снова
  7. попробуй снова нажать

Git отвечает:

Обновления были отклонены, потому что вершина вашей текущей ветки находится позади удаленной копии. и т.п.

Я один взламываю эту ветку - больше никто ее не трогает. Удаленная ветка фактически находится за локальной веткой. Мне вообще не следовало тянуть.

(И если я потяну, Git сообщит о конфликтах между ними и заставит меня объединить ветку в себя)

Почему это (вероятно) происходит? И как мне это диагностировать / исправить?

Чтобы было ясно, я никуда не делаю ветвления, и никто больше не работает над этим:

Remote: Commit A -------- Commit B  

Local:  Commit A -------- Commit B -------- Commit C  

C является прямым продолжением B без ветвления. Но git думает, что C - это ветвь A:

Remote: Commit A -------- Commit B  

                  ------- Commit C  
                /  
Local:  Commit A -------- Commit B  

Это не; это прямое продолжение Б.

Тим Янке
источник
1
Вывод git remote -vи git show remote origin(при условии, что origin - это пульт, с которым у вас проблемы) может быть полезным
Бен Грэм

Ответы:

197

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

gitk HEAD @{u}

Я настоятельно рекомендую вам попытаться понять, откуда эта ошибка. Чтобы исправить это, просто запустите:

git push -f

-fДелает это «принудительный толчок» и перезаписывает ветку на сервере. Это очень опасно, когда ты работаешь в команде. Но поскольку вы сами по себе и уверены, что ваш местный штат правильный, все должно быть в порядке. Если это не так, вы рискуете потерять историю коммитов.

Хрониальный
источник
13
Вот и все. На шаге 2 я сделал «Исправить последнюю фиксацию», затем нажал, затем еще немного взломал, а затем снова попытался нажать. Я неправильно понял, как работает Amend. Благодаря!
Тим Янке
4
Это кажется действительно полезным, но не мог бы кто-нибудь объяснить синтаксис HEAD @ {u}?
ChrisV
5
И, HEADи @{u}ссылка на коммиты. Они сообщают gitk, какие ветви отображать. HEADотносится к текущей проверенной ветке, @{u}это сокращение от HEAD@{u}, которое представляет восходящую ветвь текущей проверенной ветки. Так, например, master, это обычно origin/master.
Chronial
Был тот же сценарий - пришлось делать пересканирование и слияние конфликтов. Использование очень gitkпомогло!
brichins 06
Со мной случается, если я делаю много простых коммитов локально (не исправляю) и пытаюсь подтолкнуть. Я знаю, что на github больше никто ничего не меняет. Gitk действительно показал, что пульт отличается от локального, несмотря на то, что это ожидается, он должен отображать локальный как более новую версию, чем удаленный, а не удаленный как вилку (похоже, я не знаю, что сказать gitk)
Aquarius Power
5

Решение очень простое и сработало для меня.

Попробуй это :

git pull --rebase <url>

тогда

git push -u origin master
theRana
источник
4

Это случилось со мной, когда я пытался нажать ветку разработки (я использую git flow). У кого-то были push-обновления для мастера чтобы исправить это я сделал:

git co master
git pull

Что и привело к этим изменениям. Потом,

git co develop
git pull

Что ничего не дало. Я думаю, что ветвь разработки уже запущена, несмотря на сообщение об ошибке. Сейчас все в актуальном состоянии, ошибок нет.

Даниэль
источник
0

Чтобы диагностировать это, следуйте этому ответу .

Но чтобы исправить это, зная, что вы единственный, кто его изменяет, выполните:
1 - сделайте резервную копию вашего проекта (я сделал только файлы в git, папке ./src)
2 - git pull
3 - восстановите резервную копию множества "испорченных" файлов ( с индикаторами слияния)

Я пробовал, git pull -s recursive -X oursно не получилось так, как я хотел, это может быть вариант, но сначала сделайте резервную копию !!!

Убедитесь, что отличий / изменений (в git gui) нет. Это мой случай, сливать вообще нечего, но github все время говорит, что надо сливать ...

Водолей Сила
источник