2010-03-11 2 views
251

Я новичок в git, и я пытаюсь понять разницу между squash и rebase. Насколько я понимаю, вы выполняете сквош, когда делаете rebase.В git, в чем разница между слиянием --squash и rebase?

+4

Просто FYI: новый ** Rebase и Merge ** кнопка ведет себя по-разному для выполнения перебазирования над командной строкой! Принятый ответ относится к выполнению переустановки из командной строки. Из [здесь] (https://help.github.com/articles/about-pull-request-merges/#rebase-and-merge-your-pull-request-commits): _ Поведение переадресации и слияния на GitHub немного отклоняется от git rebase. Rebase и merge on GitHub всегда будет обновлять информацию коммиттера и создавать новые SHS-команды, тогда как git rebase вне GitHub не изменяет информацию коммиттера_ – GrayedFox

ответ

271

Оба git merge --squash и git rebase --interactive могут производить «раздавленное» совершение.
Но они служат для разных целей.

будет производить раздавленный совершить на ветке назначения, без маркировки каких-либо отношений слияния.
(Примечание: это не производит фиксацию сразу: вам нужно дополнительный git commit -m "squash branch")
Это полезно, если вы хотите, чтобы выбросить исходную ветвь полностью, переходя от (схем, взятых из SO question):

git checkout stable 

     X     stable 
    /     
a---b---c---d---e---f---g tmp 

к:

git merge --squash tmp 
git commit -m "squash tmp" 

     X-------------------G stable 
    /     
a---b---c---d---e---f---g tmp 

и затем удалить tmp ветвь.

повторы некоторые или все ваши фиксаций на новой базе, что позволяет сквош (или совсем недавно «исправить», посмотреть SO question), идущие непосредственно:

git checkout tmp 
git rebase -i stable 

     stable 
     X-------------------G tmp 
    /     
a---b 

Если вы выбрали сквош всех коммитов tmp (но, вопреки merge --squash, вы можете переиграть некоторых и раздавить других).

Так различия:

  • merge не трогать источник ветви (tmp здесь) и создает одну фиксацию, где вы хотите.
  • rebase позволяет идти на одной и той же исходной ветви (еще tmp) с:
    • новую базу
    • уборщик история
+3

'G' является' c-d-e-f-g' сжатым вместе? –

+4

@Wayne: да, G в этих примерах представляет собой коммиты 'tmp', раздавленные вместе. – VonC

+0

Разве данные в 'G' точно такие же, как в' g'? Значит ли это, что 'G' совпадает с' g', за исключением того, что у него другой родитель? –

67

Слияние сквоша объединяет дерево (последовательность коммитов) в единую фиксацию. То есть, это squash все изменения, сделанные в n совершает одно фиксирование.

Rebasing повторно базируется, то есть выбирает новую базу (parent commit) для дерева. Может быть, для них более ясный термин: они называют это трансплантацией, потому что это просто: выбирая новое основание (parent commit, root) для дерева.

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

Надеюсь, что было ясно!

+1

Когда мне нужно переустанавливать и когда я должен раздавить? –

+2

@MartinThoma https://lwn.net/Articles/328436/ –

31

Merge обязуется: сохраняет все коммиттов в вашей ветке и перемежает их с фиксацией на базовой ветке enter image description here

Merge Сквош: сохраняет изменения, но опускает лицо совершает из истории enter image description here

Rebase: Это перемещает всю ветвь функции, чтобы начать на кончике главного отделения, эффективный учет всех новых фиксаций в мастер

enter image description here

Больше на here

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