Простейшее перебазирование

Допустим, вы разделили свою работу и сделали коммиты в две разные ветки: master и experiment.

Простейший способ выполнить слияние двух веток, как мы выяснили ранее, это команда Слить. Она осуществляет трехстороннее слияние между двумя последними снимками сливаемых веток (fdaf013 и e11bfda) и самого недавнего общего для этих веток родительского снимка (8f9fb6b), создавая новый снимок (и коммит).

Тем не менее, есть и другой способ: вы можете взять те изменения, что были представлены в e11bfda и применить их поверх fdaf013. В Git это называется перебазированием. С помощью команды Групповая разработка > > Перебазировать... вы можете взять все изменения, которые были зафиксированы в одной ветке и применить их к другой ветке.

В данном примере для этого необходимо выполнить следующее:

  • Сначала переключитесь на ветку experiment (Групповая разработка > > Переключить На > experiment).
  • После этого выполните Групповая разработка > > Перебазировать... > master.

Это работает следующим образом: берется общий родительский снимок двух веток (той, в которой вы находитесь, и той, поверх которой вы выполняете перебазирование). Берется дельта каждого коммита той ветки, на который вы находитесь, эти дельты сохраняются во временные файлы. Текущая ветка устанавливается на тот же коммит, что и ветка, поверх которой вы выполняете перебазирование, и, наконец, ранее сохраненные дельты применяются по-очереди.

На этом моменте вы можете переключиться обратно на ветку master и выполнить слияние перемоткой вперёд:

  • Групповая разработка > > Переключить На > master,
  • затем Групповая разработка > > Слить... > experiment.

Теперь снимок, на который указывает 2fc8b86 абсолютно такой же, как тот, на который указывал 3f78a31 в примере с трехсторонним слиянием.

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

Часто вы будете делать так для уверенности, что ваши коммиты могут быть бесконфликтно слиты в удалённую ветку. Например тогда, когда вы не являетесь владельцем того проекта, которому принадлежит удалённая ветка. В этом случае вам следует работать в своей ветке и затем перебазировать вашу работу поверх origin/master, когда вы будете готовы отправить свои изменения в основной проект. Тогда владельцу проекта не придется делать никакой лишней работы, все решится простой перемоткой вперёд или бесконфликтным слиянием.

Учтите, что снимок, на который ссылается ваш последний коммит (является ли он последним коммитом после перебазирования или коммитом слияния после слияния) в обоих случаях это один и тот же снимок, отличаются только истории коммитов. Перебазирование повторяет изменения из одной ветки поверх другой в порядке, в котором эти изменения были представлены, в то время как слияние берет две конечные точки и сливает их вместе.