четверг, 19 февраля 2015 г.

Ветвление в Git - практика перемещения веток (часть 1)

Еще раз попрактикуемся с той же схемой коммитов, что и в прошлом посте.

basic-rebase-1

В коммитах C0, С1 и С2 у нас есть один файл test.txt, в который в каждом коммите мы последовательно добавляли по одной строке.

В коммите С2 этот файл выглядит так:

Rb0001

А история коммитов так:

Rb0002

Теперь в рабочий каталог добавим еще один файл testC3.txt и добавим его в коммит C3.

Rb0003

Сейчас мы уже ближе к блок схеме представленной в самом начале поста

Rb0004

У нас уже есть все коммиты в ветке master с С0 по С3, теперь нам надо как-то сделать ответвление от коммита С2.

Сделаем это так:

Rb0005

Мы переключились на коммит С2, добавили файл testC4.txt в рабочий каталог и сделали коммит С4.

Теперь дерево коммитов выглядит точно так, как на диаграмме в начале этого поста:

Rb0006

Коммиты С3 и С4 различаются только тем что в коммите С3 есть файл test3.txt, а в коммите С4 есть файл testC4.txt. Файл test.txt присутствует в обоих коммитах и абсолютно в них одинаков.

Содержимое рабочего каталога в коммите C4:

Rb0007

Теперь переключимся в ветку master и посмотрим содержимое рабочего каталога в коммите С3:

Rb0008

Надеюсь теперь все более менее понятно. Так что будем делать rebase. А до этого запомним что коммит С4 у нас имеет хэш 4f3c493. А так же что у нас имеется ветвление в истории коммитов.

Переходим в ветку experiment и выполняем там перемещение (rebase):

Rb0009

В этот раз у нас нет ни каких конфликтов и перемещение происходит гладко. Как видим изменения применились в коммите С4 и теперь это АБСОЛЮТНО НОВЫЙ коммит.

Теперь посмотрим рабочий каталог после операции перемещения:

Rb0010

Напомню что перед операцией перемещения мы перешли в ветку С4, и до операции перемещения там были только два файла test.txt и testC4.txt. После операции перемещения появился файл testC3, который приплыл сюда из коммита С3.

Стоит еще раз напомнить что, при помощи команды rebase вы можете взять все изменения, которые попали в коммиты на одной из веток, и повторить их на другой. Но при этом указатель ветки на которую вы переносите изменения, как бы перемещается на ветку с которой вы переносите изменения и устанавливается на последний коммит своей ветки. А последний коммит ветки, с которой вы переносите изменения, становится предком для цепочки изменений ветки куда вы переносите, то есть таким образом вы избавляетесь от ветвления.

Все это кажется не особо понятным, но может эта диаграмма внесет ясность:

basic-rebase-3

Коммит С4, как бы перестал сущестовать, а вернее видоизменился и сейчас это абсолютно НОВЫЙ ДРУГОЙ коммит  (у него даже другой хэш) но с именем С4.

Это можно так же посмотреть и в логах коммитов Git:

Rb0011

Из истории коммитов так же видно, что ветвление исчезло. Что у коммита С4 другой хэш (был 4f3c493, а стал d78f51b).

Кроме того, стоит обратить внимание что ветка master по прежнему указывает на коммит С3 (который остался без изменений).

На этом этапе можно переключиться на ветку master и выполнить слияние-перемотку (fast-forward merge), то есть переместить указатель ветки master на коммит С4:

Rb0012

То есть мы пришли к вот такому виду истории коммитов:

basic-rebase-4

То же самое видим в логе коммитов:

Rb0013

Теперь ветку experiment можно вообще удалить, чтобы глаза не мозолила

Rb0014

Теперь у нас снова чистенькая веточка master.

По существу это то же самое, что в предыдущем посте, просто я исключил возникновение конфликтов, чтобы материал был более понятен и ясен.

Комментариев нет:

Отправить комментарий