Шпаргалки Git rebase
Rebase - команда предназначенная для редактирования коммитов в git. Часто ее воспринимают как альтернативу команде git merge, однако это не так. Хотя команда и позволяет переносить коммиты, мержиться все равно придется обычной командой merge.
Перенос коммитов (rebase)
Основной режим работы команды - это перенос коммитов, он позволяет выбрать группу коммитов и перенести (пересадить) их в конец ветки. Такой перенос коммитов позволяет подтянуть в feature-ветке свежие изменения из master. Такая ситуация часто возникает когда над проектом работает больше одного человека. Второй разработчик успевает замержить свои изменения раньше ваших, и вам остается либо подмерживать master-ветку себе, либо пользоваться командой rebase. Подмерживание коммитов приводит к усложенению истории и созданию лишних merge-коммитов. Если же воспользоваться командой rebase, то ваши изменения логически и хронологически будут расположены после коммитов коллеги.
Наглядно работа команды выглядит следующим образом (git rebase feature/JIRA-123 –onto master)
- Иллюстрация взята с https://hackernoon.com/git-in-2016-fad96ae22a15 В данном 2 коммита будут пересажены в конец ветки master и результат сохранится в feature/JIRA-123
Формат команды
git rebase [-i | --interactive] [options] [--exec <cmd>] [--onto <newbase>]
[<upstream> [<branch>]]
git rebase [-i | --interactive] [options] [--exec <cmd>] [--onto <newbase>]
--root [<branch>]
Особенности команды
- коммиты переносятся ТОЛЬКО в конец ветки;
- при использовании команды модифицируется только текущая ветка;
- можно переносить коммиты, которые находится в текущей ветки;
- за основу (базу) поверх которой будут пересажены коммиты, можно взять другую ветку (параметро –onto);
- если указан параметр
(см. 1 формат команды), то git предварительно сделает чекаут этой ветки, в других случаях ребейз выполнится в текущей ветке. - КОММИТЫ КОТОРЫЕ будут переноситься - НАХОДЯТСЯ В текущей ветке, либо в ветке которая указана последним параметром (и которая при выполнении ребейза зачекаучится);
Примеры
- Неважно в какой мы ветке.
git rebase --onto MW-1655 new-feature~4 new-feature -i
Четыре последних коммита из new-feature будут перенесены в конец ветки MW-1655 и результат сохранится в new-feature.
- Мы в new-feature.
git rebase --onto MW-1655 new-feature~4 -i
То же что и в примере 1. Т.к. мы вытаскиваем последние 4 коммита, то последний параметр можно опустить.
- Мы в feature.
git rebase master
Взять за основую master, и заребейзить поверх feature. Изменения в ветке feature.
- Мы в feature
git rebase master feature
То же самое, что и выше.
- Неважно в какой мы ветке.
git rebase --onto develop MW-1572~1 MW-1572 -i
- сделать чекаут ветки MW-1572
- применить последний коммит из ветки MW-1572 в конец develop
- результат поместить в MW-1572
- Мы в 2.8.2.3
git rebase -i --onto develop 2.8.2.3
- взять все коммиты с 2.8.2.3 и поместить их поверх develop
- естественно должен быть общий предок между 2.8.2.3 и develop чтобы понятно было какие коммиты брать
Редактирование коммитов
Второй режим использования git rebase - это использование интерактивного режима в котором можно отредатировать коммиты. Интерактивный режим включается флагом -i.
Пример:
git rebase -i HEAD~2
После выполнения этой команды откроется окно примерно с таким содержимым:
pick 1ad0144 JRD-2055 Release patch 1.3.5
pick f4cb17f JRD-2051 Use snapshot dependencies for testing
# Rebase 3a30ceb..f4cb17f onto 3a30ceb (5 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
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
Необходимо отредактировать файл, поставив перед каждый коммитом букву, соответствующую команде. Например, так:
d 1ad0144 JRD-2055 Release patch 1.3.5
r f4cb17f JRD-2051 Use snapshot dependencies for testing
В данном случае первый коммит будет удален, а у второго можно будет отредактировать текст коммита. Для применения операции, нужно сохранить файл и закрыть редактор.
Ссылки:
https://hackernoon.com/git-in-2016-fad96ae22a15