Как объединить коммиты в Git

Как объединить коммиты в Git

0

Для объединения одного или более коммитов в один можно использовать либо команду git reset, либо команду git rebase. Рассмотрим оба варианта.

Объединение коммитов (с использованием git rebase)

Чтобы объединить два или более последних коммитов в один используется команда git rebase с ключом -i (интерактивный режим).

Для примера объединим последние 2 коммита в один. Выполняем команду:

git rebase -i HEAD~2

Откроется текстовый редактор, в котором первые две строки соответствуют последним двум коммитам:

pick ab37583 Added feature 1.
pick 3ab2b83 Added feature 2.

# Rebase e46d230..3ab2b83 onto e46d230 (2 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
...

В начале каждой строки стоит слово pick. Вам необходимо изменить слово pick на squash или просто на букву s у второй строки. Это означает, что данный коммит будет объединен с предыдущим коммитом. Итак, замените pick на s, у вас должно получиться что-то вроде:

pick ab37583 Added feature 1.
s 3ab2b83 Added feature 2.
...

Сохраните изменения и закройте редактор.

Снова откроется редактор, в котором вам предлагается ввести сообщение к коммиту, который и является объединением двух коммитов:

# This is a combination of 2 commits.
# This is the 1st commit message:

Added feature 1.

# This is the commit message #2:

Added feature 2.

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.

Отредактируйте сообщение к коммиту, сохраните изменения, и закройте редактор.

В результате вы получите коммит, который был объединен из двух последних коммитов.


Если вам нужно объединить не 2, а три или больше коммитов, то в исходной команде необходимо указать соответствующие количество. Например, чтобы объединить 5 коммитов используем команду:

git rebase -i HEAD~5

В таком случае pick нужно будет заменить на squash (s) уже у 4 коммитов.

pick ab37583 Added feature 1.
s 3ab2b83 Added feature 2.
s bf43de1 Added feature 3.
s 10bccc1 Added feature 4.

Если вам нужно объединить несколько коммитов, которые не являются последними, то в команде git rebase -i HEAD~n вместо HEAD необходимо указать хеш коммита (SHA1), а после символа тильда количество коммитов, которое вы хотите объединить. В данном случае речь идет о коммитах, сделанных раньше, чем коммит, хеш которого вы указали в команде. Пример:

git rebase -i ae88544~3

На самом деле при выполнении данной команды в текстовом редакторе откроется список коммитов, начиная с HEAD, то есть их там будет больше трех (так как в нашем примере хеш ae88544 не совпадает с HEAD).

Объединение коммитов (с использованием git reset)

Для объединения двух и более последних коммитов с использованием git reset необходимо выполнить последовательно следующие команды:

git reset --soft HEAD~n
git commit --amend

Вместо n — необходимо указать количество коммитов, которые вы хотите объединить.
После выполнения второй команды вы должны будете ввести сообщение (комментарий) для нового объединенного коммита.

Как вы могли заметить, в этом способе вам нужно ввести сообщение коммита самостоятельно. Но можно сделать так, чтобы для редактирования вам открывался комментарий, который склеен из сообщений объединяемых коммитов. Для этого вместо второй команды вводится более хитрая команда. Например, объединим три последних коммита:

git reset --soft HEAD~3 &&
git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"
0

Комментарии

Комментариев пока не было.

Написать комментарий

Ваше имя:
Текст комментария: