Как насчет:
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
Оба 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
) с:
Давайте запустимся следующим примером:
Теперь у нас есть 3 опции объединить изменения [1 125] ответвление функции в [1 126] основное ответвление :
фиксации Слияния
сохранят всю историю фиксаций ответвление функции и переместят их в , основное ответвление
добавит дополнительную фиктивную фиксацию.
Переоснова и слияние
добавят всю историю фиксаций ответвление функции перед , основное ответвление
НЕ добавит дополнительную фиктивную фиксацию.
Сквош и слияние
сгруппируют весь ответвление функции фиксации в , одна фиксация затем добавляет его перед , основное ответвление
добавит дополнительную фиктивную фиксацию.
можно найти ниже, как основное ответвление будет заботиться о каждом из них.
Во всех случаях:
Мы можем безопасно УДАЛИТЬ ответвление функции .
Merge squash объединяет дерево (последовательность коммитов) в один коммит. То есть, он сминает все изменения, сделанные в n коммитах, в один коммит.
Rebasing - это перебазирование, то есть выбор новой базы (родительского коммита) для дерева. Возможно, термин mercurial для этого более понятен: они называют это transplant, потому что это именно так: выбор нового основания (родительского коммита, корня) для дерева.
При выполнении интерактивного ребазинга вам предоставляется возможность либо раздавить, либо выбрать, либо отредактировать, либо пропустить коммиты, которые вы собираетесь ребазировать.
Надеюсь, это было понятно!