Git pull.rebase это возможно опасная операция

В git-config документируйте информацию о pull.rebase:

pull.rebase

Когда значение true, ветки переадресации вверху выбранной ветки, вместо объединения ветки по умолчанию с пульта по умолчанию, когда "git pull" запускается. См. "Branch..rebase" для установки этого параметра на для каждой ветки.

ПРИМЕЧАНИЕ: это опасная операция; не используйте его, если вы понять последствия (см. git -rebase (1) для деталей).

Может ли кто-нибудь подробно описать, что означает "NOTE: this is a possibly dangerous operation; do not use it unless you understand the implications (see git-rebase(1) for details)"?

Ответ 1

Скажем, у вас есть эти репозитории Git:

  • ваше личное репо, сидящее на вашем рабочем компьютере;
  • ваше публичное репо, you, где-то размещено;
  • основное репо, origin, которое является основным деревом разработки.

Вы работаете над чем-то и совершили две коммиты A и B. Вы опубликовали их в своем публичном репо. В то же время origin имеет еще одну фиксацию Z.

     /-A-B master, you/master
o-o-o
     \-Z origin/master

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

          /-C-D-E colleague/master
     /-A-B master, you/master
o-o-o
     \-Z origin/master

Теперь вы хотите добавить свои два, полностью протестированные, совершать над origin/master. Вы получаете из origin и делаете rebase (что эквивалентно git pull --rebase или git pull с опцией pull.rebase). Это создает две новые коммиты. Вы нажимаете их на свое публичное репо и на origin. Чтобы усложнить ситуацию, скажем, после этого новый фиксатор F будет нажат на origin.

     /-A-B-C-D-E colleague/master
o-o-o
     \-Z-A'-B'-F master, you/master, origin/master

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

            /-C-D-E colleague/master
o-o-o-Z-A'-B'-F master, you/master, origin/master

Если вы не сказали ему, позже он объединит свою ветку в исходное положение, и история будет выглядеть так:

     /-A-B-C-D-E
o-o-o           \
     \-Z-A'-B'-F-M colleague/master, origin/master

У вас в два раза больше A и B, но с разными именами. История становится сложнее читать, а вы будете сталкиваться с ужасными конфликтами слияния. И помните, этот пример довольно прост. Если в проекте работают десятки людей, и origin будет двигаться быстро, история скоро станет полным беспорядком.

Если это только один коллега, возможно, это хорошо. Но если вы не можете точно знать, кто вытащил вас, вы не можете знать, кого вы должны предупреждать. Это особенно актуально в разработке с открытым исходным кодом.

Основное правило: не перехватывать фиксации, которые вы уже опубликовали. Если A и B были только в вашем частном репо, перезагрузка в порядке и, вероятно, лучше всего, потому что это делает историю более простой и значимой. Расходящаяся история имеет смысл только тогда, когда ветвь имеет достаточные основания для существования (например, ветвь признака).

Ответ 2

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

Тем не менее, вы столкнулись с трудностями при перераспределении общей публичной истории, потому что другие люди, у которых была переработана старая история, вынуждены синхронизировать или переделывать свои коммиты поверх новой истории (что потенциально может быть сложным процессом), или попытайтесь разрешить старую историю с новой, что, безусловно, вызовет конфликты. Из официальной документации ядра Linux Git для rebase:

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

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

Тем не менее, вы должны научиться переустанавливать хотя и интерактивно, и не интерактивно, потому что это самый мощный и эффективный инструмент в арсенале Git, и если вы не знаете, как его использовать, не эффективно используя Git.

Вы можете узнать больше о перезагрузке из раздела История перезаписи в бесплатную онлайн-версию Pro Git, и, конечно, официальная документация официальная документация Linux Git для rebase также превосходна.

Ответ 3

Стоит упомянуть, что "злое изменение" из "слияние зла" может быть потеряно тихо, в то время как "злое" слияние ", содержащее" злое изменение ", которое не противоречит другим коммитам.