Git. Часть 2. Работа с ветками

Ветка (branch) – это ответвление от истории приложения, представленная в виде коммитов.
После создания репозитория, у вас будет всего одна основная ветка. Как правило, ее называют master. Написав команду
git status
можно легко в этом убедится.

Вот как выглядит история коммитов в Idea, в созданном проекте из первой части, с единственной веткой master.

Если перейти во вкладку git (1), то видно, что есть пять коммитов (2) в ветке master (3). Слева располагаются все локальные ветки (4) и ветки, расположенные на удаленном сервере (5), в нашем случае на GitHub.
Создание новой ветки
Для того, чтобы создать новую ветку, важно понимать, что это можно сделать только ответвлением от другой. Для этого необходимо написать команду
git branch <название_ветки>
Для перехода в другую ветку, необходимо написать команду
git checkout <название_ветки>

Вернувшись в Idea справа снизу (1) видно, что мы находимся в ветке dev. Кликнув на этот элемент откроется окно (2), где располагаются все локальные ветки и ветки на удаленном сервере.

Давайте что-то изменим и создадим коммит. Теперь история выглядит вот так.

В ней можно увидеть шесть коммитов, но ветка мастер находиться в пятом коммите, а ветка dev в шестом. Это означает, что мы начали развивать историю приложения, не трогая историю в основной ветке master. Это можно проверить, переключившись на нее. В Idea можно сделать так.

Либо воспользоваться уже встроенным инструментом в Git. Необходимо кликнуть на ту ветку, с которой хотим сравнить нашу, и выбрать «Show Diff with Working Tree».


В результате открывается окно, в котором можно посмотреть все файлы, которые отличаются от ветки master, в нашем случае это файл Main.java.
Теперь можно продолжать работать в ветке dev, создавать в ней коммиты, и при этом ветка master останется нетронутой.
Слияние git merge
Для того чтобы внести все изменения из одной ветки в другую можно выполнить команду
git merge <название_ветки>
Предварительно нужно переключиться на ту ветку, куда мы хотим слить историю другой ветки.
Для наглядности, я создам еще один коммит в ветке dev, переключусь в ветку master и выполню слияние. В Idea необходимо кликнуть на нужную ветку и выбрать «Merge Selected into Current».

Теперь выполним команду
git push
для выгрузки изменений в GitHub.

Сейчас ветки master и dev имеют абсолютно одинаковую историю, то есть слияние ветки dev в ветку master произошло успешно.
Так же в Remote под веткой master теперь есть ветка dev. Это означает, что dev загружена на удаленный сервер.

Действительно, теперь можно выбрать ветку dev на GitHub и посмотреть проект в ней.
Удаление ветки
Для локального удаления ветки необходимо написать команду
git branch -d <название_ветки>
Флаг -d указывает на то, что мы хотим удалить ветку. После удаления, вся история изменений в ней пропадет, если предварительно не слили ее в другую ветку.
Так как мы выполнили слияние ветки dev в ветку master, можем не беспокоиться, что коммиты пропадут. Для удаления выбираем ветку dev и нажимаем «Delete».

Ветка локально удалилась. Но на удаленном репозитории она осталась. Поэтому к ней можно вернуться, выбрав в окне origin/dev. Для удаления ветки в удаленном репозитории необходимо ввести команду
git push <название_удаленного_сервера> -d <название_ветки>
Название удаленного сервера обычно origin. Мы можем в этом убедиться, написав команду
git remote

Либо же посмотреть в Idea.

Удалить ветку можно и через Idea, просто выбрав необходимую ветку и нажав «Delete».

После этого ветка dev на GitHub будет удалена.
Для чего нужны ветки
Обычно ветка master это самая главная production ветка. В ней проект уже должен быть протестирован, и это конечное готовое решение. При этом вы и ваши коллеги можете работать в другой ветке над новыми обновлениями, не вмешиваясь в основную линию разработки.
Не стоит бездумно создавать множество веток, в большой команде в них легко запутаться. Стоит придерживаться определенных стратегий менеджмента веток, в каждой компании они свои. Одна из самых популярных это Gitflow.
