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

В этом уроке мы поговорим про создание веток и ветвления в системе контроля версий 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 считают основной, даже если в проекте много других веток.