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

Сценарий:

  • Я создаю новую ветку
  • взломать его
  • передать его
  • нажмите на него
  • взломать его еще немного
  • еще раз подтвердить
  • попробуйте снова нажать

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  

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

Ответ 1

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

gitk HEAD @{u}

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

git push -f

-f делает это принудительным нажатием и перезаписывает ветвь на сервере. Это очень опасно, когда вы работаете в команде. Но поскольку вы сами по себе и уверены, что ваше местное состояние верное это должно быть хорошо. Вы рискуете потерять историю фиксации, если это не так.

Ответ 2

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

git co master
git pull

Что вызвало эти изменения. Тогда,

git co develop
git pull

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

Ответ 3

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

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

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

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

Ответ 4

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

Попробуйте следующее:

git pull --rebase <url>

затем

git push -u origin master