Шпаргалки Git rebase

Rebase - команда предназначенная для редактирования коммитов в git. Часто ее воспринимают как альтернативу команде git merge, однако это не так. Хотя команда и позволяет переносить коммиты, мержиться все равно придется обычной командой merge.

Перенос коммитов (rebase)

Основной режим работы команды - это перенос коммитов, он позволяет выбрать группу коммитов и перенести (пересадить) их в конец ветки. Такой перенос коммитов позволяет подтянуть в feature-ветке свежие изменения из master. Такая ситуация часто возникает когда над проектом работает больше одного человека. Второй разработчик успевает замержить свои изменения раньше ваших, и вам остается либо подмерживать master-ветку себе, либо пользоваться командой rebase. Подмерживание коммитов приводит к усложенению истории и созданию лишних merge-коммитов. Если же воспользоваться командой rebase, то ваши изменения логически и хронологически будут расположены после коммитов коллеги.

Наглядно работа команды выглядит следующим образом (git rebase feature/JIRA-123 –onto master)

git-rebase

  • Иллюстрация взята с 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 предварительно сделает чекаут этой ветки, в других случаях ребейз выполнится в текущей ветке.
  • КОММИТЫ КОТОРЫЕ будут переноситься - НАХОДЯТСЯ В текущей ветке, либо в ветке которая указана последним параметром (и которая при выполнении ребейза зачекаучится);

Примеры

  1. Неважно в какой мы ветке.
    git rebase --onto MW-1655 new-feature~4 new-feature -i
    

    Четыре последних коммита из new-feature будут перенесены в конец ветки MW-1655 и результат сохранится в new-feature.

  2. Мы в new-feature.
     git rebase --onto MW-1655 new-feature~4 -i
    

    То же что и в примере 1. Т.к. мы вытаскиваем последние 4 коммита, то последний параметр можно опустить.

  3. Мы в feature.
    git rebase master
    

    Взять за основую master, и заребейзить поверх feature. Изменения в ветке feature.

  4. Мы в feature
    git rebase master feature
    

    То же самое, что и выше.

  5. Неважно в какой мы ветке.
    git rebase --onto develop MW-1572~1 MW-1572 -i
    
    • сделать чекаут ветки MW-1572
    • применить последний коммит из ветки MW-1572 в конец develop
    • результат поместить в MW-1572
  6. Мы в 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

Written on April 9, 2017