Git ветвь отклоняется после переустановки

Я переустановил ветвь локально, которая уже была нажата.

Git сообщается, что моя ветка и удаленная часть расходятся и что:

"и имеют 109 и 73 разных коммита каждый, соответственно"

Нажатие моей ветки разрешает это - т.е. это следует ожидать после переустановки?

Ответ 1

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

Поскольку вы уже подтолкнули ветку, вы должны были объединиться в ветки источника, а не сбрасывать ее. Можно "форсировать" новую ветвь (используя флаг -f), но нормальный толчок не будет работать, потому что целостность истории ветвей будет нарушена. Если вы сотрудничаете с другими в этой отрасли, принудительное нажатие - плохая идея, так как это приведет к тому, что другие соавторы станут очень смущены, когда их история внезапно не будет соответствовать.

TL; DR - Если вы не сотрудничаете, нажмите ветку, используя push -f. Если вы, reset ветвь в предыдущее состояние и вместо этого объедините в ветки источника.

Ответ 2

Все ваши фиксации изменили идентификаторы, поэтому отклонение не является действительно расходящимся.

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

git push -f origin experiment

http://git-scm.com/book/ch3-6.html

Объяснение:

Посмотрите, как на этом изображении C3 не помещается как C3 после rebase, а как C3 '. Это происходит потому, что это не совсем C3, но он имеет все свои изменения кода.

Rebase

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

diverge and git push

В любом случае, после принудительного нажатия, он скажет вам, что он сделал (принудительное обновление), вы должны быть в порядке в этот момент.

Оформить ссылку вверху и найти "git push -force". Вы увидите более подробное объяснение.

Ответ 3

У меня был успех с ребазом, расходящимся на толчок, выполнив следующее:

git checkout mybranch
git pull
git push origin mybranch

Тяга разрешила расхождение.

ДО тяги

Your branch and 'origin/mybranch' have diverged,
and have 2 and 1 different commit(s) each, respectively.

PULL выход

Слияние сделано рекурсивным. mypath/myfile.py | 12 +++++++++++ - 1 файл изменен, 11 вставок (+), 1 удалений (-)

ПОСЛЕ тяги

Ваша ветка опережает 'origin/mybranch' на 3 коммита.

После толчка

mybranch на 3 опережает ветвь, но в историю коммитов добавлено сообщение о слиянии с открытым запросом, ветвь слияния mybranch of remote в mybranch

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

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