В мерзавце, каково различие между слиянием - сквош и переосновой?

Как насчет:

class ABC:
    def __init__(self,debugFlag):
        self.debugFlag = False
    def some_function():
        if self.debugFlag is True:
            print "Some debug logs"
    def set_flag():
        self.debugFlag = True
336
задан GiH 21 July 2014 в 12:44
поделиться

3 ответа

Оба 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 .


Примечание: git merge имеет параметр - commit , но его нельзя использовать с - squash . Было никогда невозможно использовать - commit и - squash вместе.
Начиная с Git 2.22.1 (3 квартал 2019 г.), эта несовместимость явно выражена:

См. commit 1d14d0c (24 мая 2019 г.) от Vishal Verma ( reloadbrain ) .
(Объединено Junio ​​C Hamano - gitster - в commit 33f2790 , 25 июля 2019 г.)

merge : отказаться - commit с - squash

Раньше, когда поставлялся - squash , ' option_commit ' отбрасывалась без уведомления . Это могло быть неожиданностью для пользователя, который попытался переопределить поведение сквоша без фиксации, явно используя - commit .

git / git builtin / merge.c # cmd_merge () теперь включает:

if (option_commit > 0)
    die(_("You cannot combine --squash with --commit."));

воспроизводит некоторые или все ваши коммиты на новой основе, что позволяет вам squash (или совсем недавно "исправление", см. этот вопрос SO ), переходя непосредственно к:

git checkout tmp
git rebase -i stable

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

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

Итак, различия заключаются в следующем:

  • merge не затрагивает вашу исходную ветку (здесь tmp ) и создает одиночный коммит там, где вы хотите.
  • rebase позволяет продолжить работу в той же исходной ветке (все еще tmp ) с:
    • новым база
    • более чистая история
340
ответ дан 23 November 2019 в 00:41
поделиться

Давайте запустимся следующим примером:

enter image description here

Теперь у нас есть 3 опции объединить изменения [1 125] ответвление функции в [1 126] основное ответвление :

  1. фиксации Слияния
    сохранят всю историю фиксаций ответвление функции и переместят их в , основное ответвление
    добавит дополнительную фиктивную фиксацию.

  2. Переоснова и слияние
    добавят всю историю фиксаций ответвление функции перед , основное ответвление
    НЕ добавит дополнительную фиктивную фиксацию.

  3. Сквош и слияние
    сгруппируют весь ответвление функции фиксации в , одна фиксация затем добавляет его перед , основное ответвление
    добавит дополнительную фиктивную фиксацию.

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

enter image description here

Во всех случаях:
Мы можем безопасно УДАЛИТЬ ответвление функции .

5
ответ дан 23 November 2019 в 00:41
поделиться

Merge squash объединяет дерево (последовательность коммитов) в один коммит. То есть, он сминает все изменения, сделанные в n коммитах, в один коммит.

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

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

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

77
ответ дан 23 November 2019 в 00:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: