В git, в чем разница между merge --squash и rebase?

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

3 ответов


и git merge --squash и git rebase --interactive может произвести" раздавленную " фиксацию.
Но они служат разным целям.

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

 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 филиала.

воспроизводит некоторые или все ваши коммиты на новой базе, позволяя вам раздавить (или совсем недавно "исправить", см. Это поэтому вопрос), идущих прямо:

git checkout tmp
git rebase -i stable

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

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

таким образом, различия:

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

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

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

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

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


Merge commits: сохраняет все коммиты в вашей ветви и чередует их с коммитами в базовой ветвиenter image description here

Merge Squash: сохраняет изменения, но опускает отдельные коммиты из истории enter image description here

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

enter image description here

больше на здесь