Как объединить коммиты в один git
Перейти к содержимому

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

  • автор:

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

Для объединения одного или более коммитов в один можно использовать либо команду 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@)"

Смотрите также:

  • Как изменить файлы в старом коммите (не последнем)
  • Как добавить все файлы в коммит, кроме одного
  • Как создать ветку из предыдущего коммита
  • Команда Git stash. Как прятать изменения в Git
  • Как показать файлы, которые будут добавлены в текущий коммит
  • Как применить патч
  • Как узнать версию Git
  • Как добавить коммит
  • Как отменить коммит
  • Как восстановить файл
  • Опубликовано: 19.09.2018
  • yuriy

Как объединить несколько коммитов в один

Есть ветка, в которой последовательно лежит 13 коммитов. Есть нормальный способ их объединить? А по сути, я могу перейти в основную ветку и перекинуть в нее только последний с помощь cherry-pick, т.к. он содержит в себе актуальную версию, что и нужно в итоге. Хотя могу ошибаться

Отслеживать
33.9k 25 25 золотых знаков 130 130 серебряных знаков 222 222 бронзовых знака
задан 29 окт 2015 в 9:54
1,297 2 2 золотых знака 12 12 серебряных знаков 21 21 бронзовый знак
Может быть git rebase ? Что именно вы понимаете по «нормальный способ«?
29 окт 2015 в 9:57
И что именно вы хотите объединять? Ветки или коммиты?
29 окт 2015 в 9:59
@DmitriySimushev Такое же состояние ветки, только с одним коммитом вместо 13
29 окт 2015 в 10:00
И как бы комиты на то и комиты чтоб лежали отдельно и можно было любой достать
29 окт 2015 в 10:00

Из обсуждения так и не понял что вам нужно, но если говорить про склеивание коммитов (squash) то это легко гуглится.

29 окт 2015 в 10:05

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Пусть вы хотите склеить последние три коммита (для 13-ти коммитов процесс выглядит аналогично). Для этого есть отличный метод с использованием git rebase . Эта команда позволяет изменять историю коммитов. Алгоритм работы выглядит следующим образом:

  1. Сделайте резервную копию. Это совсем не обязательно, но поможет сохранить нервные клетки, если что-то пойдет не так. Варианты:
    1. Копия каталога с файлами в котором развернут git репозиторий.
    2. git branch backup или git tag backup в последнем коммите.
    3. Прочитать справку по командам reflog и reset и знать, что бэкапы уже есть.
    pick bcdca61 Second commit pick 4643a5f The third commit with cool stuff pick e0ca8b9 The last commit # Rebase 48411de..e0ca8b9 onto 48411de # # 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 # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell 
    pick bcdca61 Second commit squash 4643a5f The third commit with cool stuff squash e0ca8b9 The last commit # Rebase 48411de..e0ca8b9 onto 48411de # # . 

    Вот здесь, есть развернутая информация о том, как перезаписывать историю в git.

    Как объединить несколько коммитов в один git

    Это делается с помощью интерактивного ребейза git rebase -i . Давайте разберём пример. Мы хотим объединить три последних коммита в ветке в один коммит. Для этого выполняем команду:

    -i HEAD~3 

    Откроется окно текстового редактора интерактивного ребейза:

    # Rebase 44211de..e0cga8b onto 55012de # # 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 # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell 

    Тут нужно заменить pick на squash для двух последних коммитов. Список читается снизу вверх, таким образом последний коммит, это самый нижний коммит в списке.

    # Rebase 44211de..e0cga8b onto 55012de # # 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 # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell 

    Сохраняем файл и в следующем открывшемся окне вводим комментарий для нового коммита. Аналогично сохраняем файл. Смотрим git log и проверяем, что всё получилось.

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

    Чтобы объединить все предыдущие коммиты в один (например, чтобы удалить всю историю), можно воспользоваться командой:

    git rebase --root -i

    После этого список всех коммитов откроется в текстовом редакторе, и напротив каждого из них, кроме первого, нужно будет заменить слово «pick» на «squash». Тогда все предыдущие коммиты будут включены в тот, который находится на первом месте в списке. Затем его можно отредактировать:

    git commit --amend --author "Name " --date="$(date -R)"

    Но можно сделать это быстрее с помощью команды:

    git reset $(git commit-tree HEAD^ -m "commit message")

    которая создаст новый коммит на основе всего существующего дерева.
    В обоих случаях при публикации изменений необходимо добавлять опцию «-f»:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *