2013-09-25 2 views
47

У меня есть своя ветвь локально, которая уже была нажата.Git branch diverged after rebase

Гит советует, что моя ветвь и удаленного разошлись и что:

«и имеют 109 и 73 различных фиксаций каждый, соответственно»

Will толкая мою ветвь решить эту проблему - то это следует ожидать после переустановки?

ответ

70

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

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

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

+0

«Поскольку вы уже подтолкнули ветку, вы должны были объединиться в ветви источника» - почему? – hammett

+1

@HamiltonVerissimo Первое предложение Джейсона: «Когда вы пересобираете ветку, вы должны переписать фиксации для любого фиксации, которая выше коммитов в ветке, на которую вы перегружаете.«Даже несмотря на то, что изменения, зафиксированные в« выше », совершают один и тот же логический контент, они применяются к другой базе и, следовательно, разные коммиты с разными хэшами. Если другие разработчики работают из предварительно переустановленной ветки, то делают git push -f будет крайне разрушительным для их рабочего процесса.Таким образом, поскольку эта ветвь была нажата на общедоступный источник, он должен был объединиться. – awolf

+2

вы также можете использовать push -force-with-lease, если вы не уверены, что кто-то другой уже толкает что-то. – Console

20

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

Чтобы ваша проблема решена вы должны перезаписать удаленный филиал:

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». Вы увидите более подробное объяснение.

+0

Yup. Думаю, это решает проблему. Но принудительное нажатие может не работать, когда вы работаете в команде, когда ваш push может перезаписать любую недавнюю работу, подталкиваемую другими. Я прав? –

+0

Он может не иметь желаемых эффектов. Удостоверьтесь, что вы сменили свои быстрые переходы вперед, прежде чем выполнять rebase. – mimoralea

Смежные вопросы