Решение 1 :
Допустим, вы работаете над функцией и создали ветку F1, выбрав ее из master. В процессе работы над веткой F1 вы создали несколько промежуточных коммитов. Однако, когда вы проверяете историю коммитов, вы обнаруживаете, что некоторые из этих коммитов избыточны. В таком случае вы можете объединить эти коммиты, т.е. объединить несколько коммитов и сделать их одним коммитом.
Ниже приведена история коммитов функциональной ветви до и после удаления.
Команда для удаления последних X коммитов с помощью интерактивного rebase следующая:
git rebase -i HEAD~[X]
Сквоширование коммитов также полезно, когда вы хотите объединить вашу функциональную ветку с мастер-веткой. Так как при сквошировании все лишние коммиты могут быть удалены, и после объединения функциональной ветки с мастер-веткой история коммитов git будет чистой.
Преимущество сквошинга:
История git остается чистой
Недостаток сквошинга :
Детальная история ветки больше недоступна.
Прежде чем перейти ко второму решению, давайте разберемся в разнице между git merge и git rebase.
git merge VS git rebase
И git merge, и git rebase используются для слияния кода из ветки feature в основную ветку (master).
git merge
Когда мы используем команду git merge для слияния кода из ветки feature в master, то git возьмет все изменения из моей ветки feature и создаст специальный коммит поверх моего коммита, называемый merge commit, который содержит все изменения из моей ветки feature и поместит этот коммит merge commit поверх ветки master. Граф git-коммита будет выглядеть следующим образом
Команда для слияния ветки fetaure_branch с веткой master следующая:
git checkout master
git merge feature_branch
Давайте разберемся с git rebase с помощью решения 2
Решение 2 :
Для того чтобы сохранить чистую историю коммитов, вместо git merge сделайте git rebase. В результате rebase возьмет все коммиты из ветви feature и переместит их поверх коммитов master. Структура графа коммитов выглядит следующим образом
Команда для ребазирования ветки fetaure_branch с мастер-веткой следующая:
git checkout master
git rebase feature_branch
Преимущество git rebase :
Он сохраняет историю коммитов основной ветви чистой и, следовательно, её легко отслеживать
Недостаток git rebase :
Детальная история ветки больше недоступна.
Поэтому использование сминания коммитов и последующего ребазинга с master позволит сохранить историю коммитов чистой и отслеживаемой.