Skip to content

Instantly share code, notes, and snippets.

@edtoken
Created January 10, 2018 16:30
Show Gist options
  • Save edtoken/bad432bf1596c4d9ee14dc47ae1a5dc9 to your computer and use it in GitHub Desktop.
Save edtoken/bad432bf1596c4d9ee14dc47ae1a5dc9 to your computer and use it in GitHub Desktop.

Шаг 1а: сплющивание через rebase -i Под git squash вы наверное понимаете git rebase --interactive с последующим выбором опции squash. Действительно, можно сделать так:

Ребейз к третьему коммиту с конца (пред-предпоследнему)

git rebase -i HEAD^^ откроется такой документ:

pick 7423f96 сообщение предпоследнего коммита pick 91e9b6e сообщение последнего коммита

Rebase c9e8f38..91e9b6e onto c9e8f38 (2 commands)

... Чтобы объединить два коммита в один нужно сделать squash последнего в предпоследний:

pick 7423f96 сообщение предпоследнего коммита squash 91e9b6e сообщение последнего коммита А потом сохранить документ и выйти из редактора. Откроется новый документ, в котором можно написать сообщение для вновь полученного коммита. По умолчанию там будет:

This is a combination of 2 commits.

This is the 1st commit message:

сообщение предпоследнего коммита

This is the commit message #2:

сообщение последнего коммита Закомментированные строки не войдут в сообщение. Если оставить пустую строку, то rebase будет прерван.

Шаг 1б: сплющивание через reset Поскольку нужно объединить N последних коммитов, отлично подойдёт более простой способ:

сначала очистим индекс (staging area, область подготовки коммита),

чтобы потом не закоммитить ничего лишнего

git reset .

поехали

git reset --soft HEAD^^ Произошло следующее:

текущая ветка переставлена на коммит HEAD^^, т.е. на два коммита назад. изменения всех коммитов вплоть до, но не включая HEAD^^ собраны в индекс Можно сделать новый коммит:

git commit -m'message' В отличие от способа с rebase, информация об авторе и дате оригинального коммита не сохраняется. Лучше не ребейзить таким образом чужие коммиты, т.к. информация об авторстве обычно важна.

Шаг 1в: комбинированный подход Предположим, что в предпоследнем коммите у вас написано нормальное сообщение, раскрывающее суть изменений. А в последнем вы исправили опечатку. Т.е. было бы удобно объединить два коммита, оставив сообщение от предпоследнего.

То же, что и в шаге 1б: собираем содержимое последнего коммита в индекс

git reset . git reset --soft HEAD^

"редактируем" последний коммит, добавляя в него содержимое индекса

(на самом деле создаём новый коммит с тем же сообщением и переставляем на него ветку)

git commit --amend --no-edit Шаг 2. запушить на удалённый репозиторий Поскольку вы переписали свою ветку, нужно будет запушить с -f.

git push -f origin mybranch

@edtoken
Copy link
Author

edtoken commented Jan 10, 2018

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment