TL; DR
Если у вас есть какие-либо сомнения, используйте слияние.
Короткий ответ
Единственное различие между перебазировкой и слиянием:
- Результирующая древовидная структура истории (обычно заметная только при просмотре графа коммитов) отличается (у одного будут ветви, у другого нет).
- Слияние обычно создает дополнительный коммит (например, узел в дереве).
- Слияние и перебазировка будут обрабатывать конфликты по-разному. Rebase будет представлять конфликты по одному коммиту за раз, когда слияние представляет их все одновременно.
Таким образом, краткий ответ - выбрать перебазирование или слияние на основе того, как вы хотите, чтобы ваша история выглядела .
Длинный ответ
Есть несколько факторов, которые вы должны учитывать при выборе используемой операции.
Является ли ветка, в которую вы получаете изменения, доступной другим разработчикам за пределами вашей команды (например, с открытым исходным кодом, общедоступным)?
Если это так, не перебазируйте. Rebase разрушает ветку, и эти разработчики будут иметь поврежденные / несовместимые репозитории, если они не используют git pull --rebase
. Это хороший способ быстро расстроить других разработчиков.
Насколько опытна ваша команда разработчиков?
Rebase - разрушительная операция. Это означает, что если вы не примените его правильно, вы можете потерять совершенную работу и / или нарушить целостность репозиториев других разработчиков.
Я работал в командах, в которых все разработчики пришли из времени, когда компании могли позволить себе выделенный персонал для работы с ветвлениями и слияниями. Эти разработчики мало знают о Git и не хотят много знать. В этих командах я бы ни за что не рискнул порекомендовать перебазирование.
Представляет ли сама ветка полезную информацию
Некоторые команды используют модель ветвления для функции, где каждая ветвь представляет функцию (или исправление, или подфункцию и т. Д.). В этой модели ветвь помогает идентифицировать наборы связанных коммитов. Например, можно быстро восстановить функцию, отменив объединение этой ветви (если честно, это редкая операция). Или отличить особенность, сравнивая две ветви (чаще). Rebase уничтожил бы ветку, и это было бы не просто.
Я также работал над командами, которые использовали модель ветвления на разработчика (мы все были там). В этом случае сама ветка не передает никакой дополнительной информации (у коммита уже есть автор). Перебазировка не принесет вреда.
Можете ли вы отменить слияние по какой-либо причине?
Возврат (как при отмене) перебазирования значительно сложнее и / или невозможен (если у перебазировки были конфликты) по сравнению с возвратом слияния. Если вы считаете, что есть шанс вернуться, используйте merge.
Ты работаешь в команде? Если да, готовы ли вы использовать подход «все или ничего» в этой отрасли?
Операции перебазирования должны выполняться с соответствующим git pull --rebase
. Если вы работаете самостоятельно, вы можете вспомнить, какой из них следует использовать в соответствующее время. Если вы работаете в команде, это будет очень трудно координировать. Вот почему большинство рабочих процессов rebase рекомендуют использовать rebase для всех слияний (и git pull --rebase
для всех извлечений).
Распространенные мифы
Слияние уничтожает историю (совершает сквош)
Предполагается, что у вас есть следующее слияние:
B -- C
/ \
A--------D
Некоторые люди утверждают, что слияние «уничтожает» историю коммитов, потому что если бы вы смотрели журнал только главной ветки (A - D), вы пропустили бы важные сообщения фиксации, содержащиеся в B и C.
Если бы это было правдой, у нас не было бы таких вопросов . По сути, вы увидите B и C, если явно не попросите их не видеть (используя --first-parent). Это очень легко попробовать для себя.
Rebase допускает более безопасные / простые слияния
Два подхода объединяются по-разному, но не ясно, что один всегда лучше другого, и это может зависеть от рабочего процесса разработчика. Например, если разработчик стремится к регулярной фиксации (например, может быть, он фиксирует дважды в день при переходе с работы на дом), тогда для данной ветви может быть много коммитов. Многие из этих коммитов могут не выглядеть как конечный продукт (я склонен к рефакторингу своего подхода один или два раза для каждой функции). Если кто-то еще работает над связанной областью кода и пытается отменить мои изменения, это может быть довольно утомительной операцией.
Rebase круче / сексуальнее / профессиональнее
Если вы хотите использовать псевдоним от rm
до rm -rf
, чтобы «сэкономить время», тогда, возможно, ребаз для вас.
Мои два цента
Я всегда думаю, что когда-нибудь я столкнусь со сценарием, в котором git rebase является отличным инструментом, который решает проблему. Как и я думаю, я столкнусь со сценарием, в котором git reflog - это замечательный инструмент, который решает мою проблему. Я работал с Git более пяти лет. Этого не произошло.
Грязные истории никогда не были для меня проблемой. Я никогда не читаю историю коммитов, как захватывающий роман. Большую часть времени мне нужна история, я в любом случае собираюсь использовать git blame или git bisect. В этом случае наличие коммита слияния на самом деле полезно для меня, потому что, если слияние создало проблему, которая является важной для меня информацией.
Обновление (4/2017)
Я чувствую себя обязанным упомянуть, что лично смягчил использование rebase, хотя мой общий совет остается в силе. Недавно я много общался с проектом Angular 2 Material . Они использовали rebase, чтобы сохранить очень чистую историю коммитов. Это позволило мне очень легко увидеть, что фиксация исправила данный дефект и была ли эта фиксация включена в релиз. Это хороший пример правильного использования rebase.