Git — это распределённая система контроля версий; она помогает избежать досадных ошибок и конфликтов при совместной работе над проектом. В этом уроке мы рассмотрим основные команды, полезные при работе в команде. И про ветки тоже поговорим. С них и начнём.
Ветки (англ. «branches»)
Ветка — это изолированный поток разработки, в котором можно делать коммиты так, что их не видно из других веток и они не влияют на основной код проекта. Если проект пишут несколько человек, каждый может работать в отдельной ветке и не мешать другим.
Прежде чем начать писать новую часть проекта, для неё создают отдельную ветку в Git. Когда работа доделана, эту побочную ветку после ревью «вливают» в главную. Таким образом в главной ветке всегда будет стабильная версия проекта.
Основная ветка разработки называется master или main. Обычно в ней хранят финальную версию кода. Ветка master создаётся автоматически, когда в проекте инициализируется Git и создаётся первый коммит.
Чтобы увидеть все ветки и узнать, на какой ветке вы находитесь сейчас, введите команду git branch
:
git branch # команда для просмотра веток
* master # основная ветка проекта, звёздочкой отмечено, что вы в ней
Нажмите Q
, чтобы покинуть режим просмотра веток.
Создать новую ветку можно командой git branch название_ветки
. Название ветки лучше выбирать исходя из того, что в ней будет происходить. Имя ветки не должно содержать пробелов: это вызовет ошибку.
git branch develop # Создали новую ветку с именем develop
git branch # Проверили, в какой ветке находимся
develop # Появилась новая ветка
* master # Но мы пока находимся в ветке master
Ветка создана, но мы пока находимся в ветке master
. Чтобы переключиться в ветку develop
, введите команду git checkout develop
:
git checkout develop # Переключились в ветку develop
git branch # Проверили: "Где я?"
* develop
master
Можно создать ветку и сразу переключиться на неё:
git checkout -b develop # Создали ветку develop и сразу переключились на неё
Есть разные подходы к именованию веток, каждая команда разработки выбирает свой. При любом подходе ветки называют так, чтобы всем было понятно, что в них происходит.
В именах веток можно использовать разделители (например, тире или точку), но чаще всего применяют слеш /
.
Если ветка создана для разработки нового функционала проекта, её имя может начинаться со слова feature
:
git checkout -b feature/email-validation
Если в ветке планируется ловля и исправление багов, ей подойдёт название, начинающееся с bugfix
:
git checkout -b bugfix/resize-image
Слияние веток (англ. «merge«)
После решения задачи вашу изолированную ветку нужно объединить с веткой master
, залить в неё результаты вашей работы. Этот процесс называется «слияние веток», или merge.
Чтобы объединить («смёрджить») ветки, нужно переключиться в ветку, куда должны попасть изменения и из неё выполнить команду на слияние.
Чтобы залить код из ветки develop
в ветку master
, сперва переключаемся на ветку, в которую будут залиты изменения
git checkout master # Переключились в master
Теперь нужно переместить все коммиты из develop
в ветку master
, смёржить ветки:
git merge develop
Если всё прошло хорошо, Git сообщит, сколько строк кода изменилось и в каких файлах. Но иногда при слиянии веток могут возникнуть «конфликты»: например, два разработчика в разных ветках изменили код в одной и той же строке, и после слияния Git не может решить, какой код оставить в финальной версии.
Git сообщает о конфликтах:
git merge develop
# Сливаем ветку develop в master
CONFLICT (content): Merge conflict in [название вашего файла]
Automatic merge failed; fix conflicts and then commit the result.
В коде файлов с конфликтами Git даёт подсказки на тех строках, где в разных ветках текст отличается. Например:
<<<<<<< HEAD
one two three four five
=======
1 2 3 4 5
>>>>>>> develop
В этом файле произошёл конфликт — в ветке master
(на неё указывает заголовок HEAD) строка состоит из слов, а в ветке develop
— из цифр. Git не понимает, какой из вариантов оставить. Если правильный вариант — это строка чисел, нужно удалить всё лишнее:
1 2 3 4 5
Эту процедуру повторяют для всех конфликтующих файлов. После этого делается коммит, чтобы зафиксировать изменения — и ещё раз мёрж. Теперь слияние веток должно получиться!
Когда работа с веткой закончена и она больше не нужна, её можно удалить: git branch -d имя_ветки
(флаг d
— от англ. delete, «удалить»):
git branch -d develop
# Удалили ветку develop
Чаще выполняйте команду git pull
, чтобы иметь актуальное состояние репозитория.
Основные команды для работы с ветками:
git branch <название_ветки>
— создать новую ветку.git checkout <название_ветки>
— переключиться в ветку.git checkout -b <название_ветки>
— создать ветку и сразу переключиться в неё.git branch -d <название_ветки>
— удалить ветку.
Чтобы всё прошло хорошо, нужно переключиться из удаляемой ветки.git merge <название_ветки>
— скопировать все изменения из ветки в ветку. Чтобы перенести изменения из ветки develop
в ветку master
, нужно находиться в ветке master
и выполнить команду git merge develop
.