Создание веток и ветвления

В этом уроке мы поговорим про создание веток и ветвления в системе контроля версий Git.

Ветки, по своей сути, это две разных истории одного проекта. Ветвления и ветки являются самыми важными элементами Git.

Благодаря им вы всегда можете вернуться назад и отменить ошибки, сможете параллельно в команде работать над одним проектом. Каждый член команды сможет работать в своей ветке.

Давайте посмотрим наш лог коммитов:

$ git log --oneline

В предыдущих уроках мы использовали команду log без опций или с опцией -1, например. Здесь же мы добавили параметр --oneline. Он выводит коммит в одну строку, а не в пять, как при обычной комманде.

Давайте посмотрим один из коммитов:

$ git cat-file -p c39a182

Параметр -p мы добавили для удобства чтения. Коммит хранит информацию о том, кто и когда его сохрани, а также хеш родительского коммита.

При этом самый первый коммит не будет содержать родительского коммита.

Теперь нам снова понадобится команда checkout. Мы ее уже использовали в предыдущих уроках. Изначально команда checkout возвращает состояние файла до последнего коммита.

Если мы хотим перейти к какому-то коммиту на более ранних стадиях разработки, то вводим команду:

$ git checkout <commit_hash>

Где вместо <commit_hash> вводим имя нужного нам коммита, который мы посмотрели командой log.

Если после этой команды мы решим посмотреть историю через команду log, то увидим историю только до этого коммита, на который мы переключились.

Здесь важно понимать, что все коммиты никуда не исчезли на данном этапе, просто сама история показывается до последнего коммита.

Теперь можно вернуться к последнему коммиту через команду:

$ git checkout <commit_hash>

Но что если мы забыли или потеряли хеш последнего коммита? Это не страшно. В Git есть кодовое слово указатель master. Этот указатель приписывается последнему самому новому коммиту.

При этом мы можем задавать указатели любому коммиту. Вводим команду:

$ git checkout -b <commit_name> <commit_hash>

В терминале мы увидим:

Создание веток и ветвления

Теперь, если мы посмотрим стату Git:

$ git status

То увидим, что нам консоль вывела следующее:

Создание веток и ветвления

Ключевая фраза здесь в примере — On branch yellow-design. Нам это говорит о том, что мы теперь находимся на коммите yellow-design.

Проверяем командой:

$ git log --oneline --all

В консоли увидим следующее:

Создание веток и ветвления

Здесь можно наблюдать и master и HEAD -> yellow-design. Слово HEAD указывает текущее положение и слово HEAD всегда в искусственном положении.

Что будет если изменить какие то файлы и закоммитить? Давайте изменим файл, проиндексируем его и создадим коммит.

Создание веток и ветвления

Смотрим лог:

Создание веток и ветвления

Куда-то делись другие коммиты, которые были после yellow-design. Здесь нам нужно использовать команду log с определенными опциями, чтобы увидеть всю картину целиком:

$ git log --online --all --graph

Мы выводим весь лог коммитов в одну строчку (--oneline), все коммиты (--all) и в виде наглядного графика (--graph).

Создание веток и ветвления

Видим на скриншоте, что история коммитов раздвоилась, т.е. в проекте у нас теперь две ветки после коммита с хешем bc00f9f.

Наглядно это выглядит так:

Создание веток и ветвления

Веткой называют всю историю коммитов, приводящих в текущую точку. Для master это такая ветка:

Создание веток и ветвления

Для ветки yellow-design из нашего примера ветка такая:

Создание веток и ветвления

Командой checkout можно перемещаться в любой коммит используя хеш или указатель ветки.

Выполнив команду git checkout master мы перейдем у точку с указателем master.

Можно создавать сколько угодно веток и коммитов. В итоге можем получить что-то вроде такого:

Создание веток и ветвления

Но Git был бы не столь эффективен, если бы не было возможности объединять ветки. Давайте посмотрим на наше состояние проекта у которого две ветки:

Создание веток и ветвления

Нам нужно теперь объединить коммиты из отдельных веток, но нам, также, нужно не потерять все изменения.

Нам понадобится для этого процедура мёрдж (англ. — merge или слияние). После слияния у нас будет один новый коммит, у которого будет два родителя.

Создание веток и ветвления

Как мы видим — у нас два указателя и в новый коммит переместится указатель той ветки в которой мы находились.

Убедимся командой git status, что мы находимся в ветке master. И после этого мы должны влить ветку yellow-design в ветку master.

$ git merge yellow-design -m "your message"

В терминале выведется:

Создание веток и ветвления

Теперь смотрим лог:

Создание веток и ветвления

Мы можем создать новую ветку не указав хеш из текущего коммита:

$ git checkout -b <commit_name>

После этой команды мы можем переключаться между master и новым указателем (<commit_name>). Если мы сделаем новый коммит, то сдвинется указатель той ветки в которой мы находимся.

Вернуться в ветку master можно командой:

$ git checkout master

Обычно при командной разработке ветку master считают основной, даже если в проекте много других веток.

Была ли эта страница полезной?