Git каже, що локальна гілка стоїть за віддаленою гілкою, але це не так


82

Сценарій:

  1. Я роблю нову гілку
  2. зламати його
  3. вчинити це
  4. штовхати його
  5. рубати на ньому ще
  6. скоєно ще раз
  7. спробуйте штовхнути ще раз

Git відповідає:

Оновлення було відхилено, оскільки кінчик вашої поточної гілки знаходиться за віддаленим аналогом. тощо

Я єдиний, хто зламав цю гілку - ніхто інший її не чіпає. Віддалене відділення фактично знаходиться за місцевим відділенням. Мені не треба було б тягнути взагалі.

(І якщо я все-таки витягну, Git повідомляє про конфлікти між ними та змушує мене об'єднати гілку в себе)

Чому це (ймовірно) відбувається? І як я можу діагностувати / виправити це?

Щоб бути зрозумілим, я ніде не розгалужуюсь, і ніхто інший над цим не працює:

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

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

С є прямим продовженням В, без розгалуження. Але git вважає, що C є гілкою A:

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

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

Це не; це пряме продовження B.


1
Результат git remote -vі git show remote origin(якщо припустимо, що походження - це пульт, з яким у вас виникають проблеми) може бути корисним
Ben Graham

Відповіді:


196

Ви, мабуть, переписували історію? Ваша локальна гілка відрізняється від гілки на сервері. Виконайте цю команду, щоб краще зрозуміти, що сталося:

gitk HEAD @{u}

Настійно рекомендую спробувати зрозуміти, звідки ця помилка. Щоб це виправити, просто запустіть:

git push -f

Це -fробить це "вимушеним натисканням" і замінює гілку на сервері. Це дуже небезпечно, коли ти працюєш у команді. Але оскільки ви самі по собі і впевнені, що ваш місцевий штат правильний, це повинно бути нормально. Якщо це не так, ви ризикуєте втратити історію комітів.


13
Це було все. На кроці 2 я зробив "Змінити останню комітацію", потім натиснув, потім зламав ще, а потім спробував натиснути ще раз. Я неправильно зрозумів спосіб роботи Amend. Дякую!
Тім Янке

4
Це здається дійсно корисним - але хтось може пояснити синтаксис 'HEAD @ {u}'?
ChrisV

5
І the, HEADі @{u}посилання стосуються комітів. Вони повідомляють gitk, які гілки відображати. HEADПосилається на зареєстровану гілку, @{u}це скорочення HEAD@{u}, що представляє вищу гілку поточно зареєстрованої гілки. Так наприклад. master, тобто зазвичай origin/master.
Хроніаль

Був той самий сценарій - довелося зробити повторне сканування та об’єднати конфлікти. Використання дуже gitkдопомогло!
brichins

У мене трапляється, якщо я роблю багато простих комітів локально (не змінюю) і намагаюся натиснути. Я знаю, що ніхто інший не змінює щось на github. Gitk справді показав, що пульт відрізнявся від локального, незважаючи на те, що очікується, він повинен показувати локальний як нову версію, ніж пульт, а не пульт як розгалуження (виглядав так, я не знаю багато про що розповідати)
Сила Водолія

5

Рішення дуже просте і працювало для мене.

Спробуйте це :

git pull --rebase <url>

тоді

git push -u origin master

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 постійно каже, що я повинен об’єднати ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.