Ответы:
И то, git merge --squash
и другое git rebase --interactive
может произвести «сдавленный» коммит.
Но они служат разным целям.
создаст сжатый коммит в ветви назначения, не помечая никаких отношений слияния.
(Примечание: он не производит коммит сразу: вам нужно дополнительное git commit -m "squash branch"
).
Это полезно, если вы хотите полностью отбросить ветку-источник, начиная с (схема взята из SO-вопроса ):
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 (Q3 2019), эта несовместимость сделана явной:
См. Коммит 1d14d0c (24 мая 2019 г.) Вишала Вермы ( reloadbrain
) .
(Слиты Junio C Hamano - gitster
- в фиксации 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."));
воспроизводит некоторые или все ваши коммиты на новой базе, позволяя вам раздавить (или совсем недавно «исправить», см. этот вопрос ), перейдя непосредственно к:
git checkout tmp
git rebase -i stable
stable
X-------------------G tmp
/
a---b
Если вы решили раздавить все коммиты tmp
(но, вопрекиmerge --squash
, вы можете выбрать переигрывание одних и подавление других).
Итак, различия:
squash
не касается вашей исходной ветви ( tmp
здесь) и создает один коммит, где вы хотите.rebase
позволяет вам продолжить в той же ветке исходного кода (все еще tmp
) с:
tmp
коммиты, сжатые вместе.
G
не будет представлять тот же контент g
, что и из-за внесенных изменений X
.
git merge --no-ff temp
вместо git merge --squash temp
, то вы получите более грязную историю, но вы также можете делать вещи, как git revert e
, гораздо проще. Это грязная, но честная и прагматичная история, и основная ветвь все еще остается довольно чистой.
git bisect
или git blame
когда используется слишком часто (как в git pull --no-ff
: stackoverflow.com/questions/12798767/… ). В любом случае, нет единого подхода, поэтому в этой статье описано три ( stackoverflow.com/questions/9107861/… )
Объединить коммиты: сохраняет все коммиты в вашей ветке и чередует их с коммитами в базовой ветке
Merge Squash: сохраняет изменения, но пропускает отдельные коммиты из истории
Rebase: это перемещает всю ветвь объекта, чтобы начать с кончика мастер-ветви, эффективно объединяя все новые коммиты в master
Больше здесь
Merge squash объединяет дерево (последовательность коммитов) в один коммит. То есть он подавляет все изменения, внесенные в н коммитах, в один коммит.
Перебазирование - это повторное базирование, то есть выбор новой базы (родительского коммита) для дерева. Может быть, ртутный термин для этого более понятен: они называют это трансплантацией, потому что это просто: выбор нового основания (родительский коммит, корень) для дерева.
При интерактивном перебазировании вам предоставляется возможность либо раздавить, выбрать, отредактировать или пропустить коммиты, которые вы собираетесь перебазировать.
Надеюсь, это было ясно!
Давайте начнем со следующего примера:
Теперь у нас есть 3 варианта объединить изменения признака филиала Into мастер филиала :
Слияние коммитов
Сохранит историю всех
коммитов ветви функций и переместит их в основную ветку.
Добавит дополнительный фиктивный коммит.
Перебазирование и слияние Добавит
всю историю коммитов ветви функций в начало главной ветки,
НЕ добавит дополнительный фиктивный коммит.
Сквош и слияние
Сгруппирует все коммиты ветвей объектов в один коммит, затем добавит его перед главной ветвью.
Добавит дополнительный фиктивный коммит.
Ниже вы можете увидеть, как главная ветвь будет выглядеть после каждого из них.
Во всех случаях:
мы можем безопасно УДАЛИТЬ ветку функций .
G
этоc--d--e--f--g
сжато вместе?