Истории успеха наших клиентов — лучшие проекты
Вход/ Регистрация

Git checkout: как работать с ветками

5629
12 минут чтения
Средний рейтинг статьи: 2

Команда checkout в системе контроля версий Git отвечает за переключение между отдельными ветками репозитория.

Каждое переключение обновляет файлы в рабочем каталоге на основе тех данных, которые хранятся в выбранной ветке. При этом каждый последующий коммит автоматически добавляется в активную ветку, выбранную ранее с помощью команды checkout.

В этом руководстве будут рассмотрены возможные пути использования как команды git checkout, так и ряда других сопутствующих команд (git branch, git reflog, git remote show), которые позволяют взаимодействовать с ветками как локального, так и удаленного репозитория.

VDS и VPS

Гибкие виртуальные серверы с почасовым
биллингом по всему миру: Россия, Азия и Европа.

1. Создание репозитория

Сперва подготовим отдельный каталог для тестового проекта в Git:

    

После чего перейдем в него:

    

Наконец, выполним инициализацию репозитория Git:

    

После этого нам станут доступны все команды по управлению как ветками, так и репозиторием в целом.

2. Создание файла и выполнение коммита

Чтобы понять, как переключение веток влияет на рабочий каталог (и репозиторий целикоv), мы подготовим импровизированный файл исходника проекта с тривиальным содержимым внутри:

    

Наполнение файла будет следующим:

    

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

    

Существует только один файл:

    

Теперь проиндексируем изменения:

    

После чего выполним коммит:

    

По ходу этого руководства мы будем наблюдать за тем, как работа с ветками влияет на содержимое рабочего каталога — в частности на файлы, которые мы создаем или редактируем.

3. Создание новой ветки

Предположим, мы решили внедрить в наш проект новую фичу, но пока что до конца не уверены в ее необходимости или эффективности. По сути, мы хотим проверить некую гипотезу с возможностью отката изменений до основной стабильной версии проекта.

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

Однако для начала давайте узнаем, на какой ветке мы находимся сейчас:

    

В консоли появится вывод с подсвеченной активной веткой master:

    

Именно в эту ветку мы совершили предыдущий коммит. Это значит, что в этой ветке находился ранее созданный файл file_m.

Теперь мы попробуем создать отдельную ветку под внедряемую нами импровизированную фичу. Для этих целей используется та же самая команда, но с указанием имени новой ветки:

    

Однако важно помнить, что git branch не выполняет автоматическое переключение на созданную ветку.

Мы можем убедиться в этом, снова проверив список существующих веток:

    

Можно заметить, что к списку добавилась ветка feature1, однако активной веткой (то есть помеченной с помощью зеленого цвета и символа звездочки) по прежнему является master:

    

Теперь у нас есть несколько веток, между которыми мы можем переключаться.

4. Переключение на существующую ветку

Для того, чтобы вручную переключиться на уже существующую ветку, необходимо выполнить команду checkout, указав название ветки:

    

В консоли появится сообщение об успешном переключении:

    

Снова проверим список существующих веток:

    

Как видно, активной веткой теперь является feature1:

    

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

    

В нем по-прежнему один файл, который был «унаследован» из ветки master:

    

Так как отдельная ветка feature1 нужна для модификации проекта, мы создадим еще один файл:

    

Его содержимое пусть будет таким:

    

Проиндексируем изменения:

    

И снова сделаем коммит:

    

Снова проверим рабочий каталог:

    

Можно убедиться, что файлов теперь несколько:

    

Теперь переключимся снова на главную ветку:

    

После этого в рабочем каталоге останется только один файл:

    

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

5. Переключение на новую ветку

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

Сперва убедимся, что мы находимся на master:

    

А теперь попробуем переключиться на еще не созданную ветку feature2:

    

Закономерно, мы получим ошибку:

    

Однако команда checkout позволяет создавать новые ветки в момент переключения на них. Для этого необходимо добавить флаг -b:

    

В консоли появится сообщение об успешном переключении:

    

По сути, команда checkout с флагом -b эквивалентна двум вызовам:

    

Снова проверим список существующих веток:

    

Теперь у нас есть ветка feature2, которая стала активной сразу после своего создания:

    

Новая ветка создается на основе той ветки (ее рабочего каталога и списка коммитов), которая была активной. Перед созданием ветки feature2 мы переключились на ветку master, а значит в рабочем каталоге должен быть только файл file_m, но не файл file_f1.

6. Удаление ветки

Удалить ветку, которая является активной, невозможно:

    

Флаг -d указывает на запрос удаления указанной ветки. В консоли появится сообщение об ошибке:

    

Поэтому нам сперва нужно переключиться на любую другую ветку:

    

После чего выполнить непосредственно удаление:

    

На этот раз в консоли появится сообщение об успешном удалении ветки:

    

Список существующих веток станет таким:

    

7. Создание ветки из другой ветки

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

Давайте убедимся, что мы находимся в ветке master:

    

На данный момент специальный указатель HEAD указывает на активную ветку master, которая, в свою очередь, является указателем на последний коммит этой ветки.

До этого мы создавали ветку feature2 из активной ветки master. Однако сейчас мы создадим ветку feature2 из ветки feature1 (а не из master) без явного переключения на нее — мы по-прежнему будем в master:

    

Теперь активной веткой является feature2. Проверим содержимое рабочего каталога:

    

Как видно, состояние каталога такое же, как в feature1, а не в master:

    

Мы также можем посмотреть историю коммитов:

    

Как видно, ветка feature2 содержит как коммиты ветки master, так и коммиты ветки feature1:

    

8. Сброс ветки до состояния другой ветки

Помимо создания ветки из другой ветки команда checkout позволяет выполнять сброс (reset) существующей ветки до состояния другой существующей ветки.

Например, мы можем сбросить ветку feature2 до состояние ветки master:

    

Обратите внимание, что используется флаг -B, а не -b.

В консоли появится соответствующее сообщение:

    

Проверим рабочий каталог:

    

Как видно, в нем только один файл:

    

При этом список «унаследованных» коммитов ветки feature2 превратиться в список коммитов ветки master:

    

В консольном выводе будет один единственный коммит — самый первый:

    

9. Просмотр истории переключений

Переключение веток — это не просто операция чтения. Смена ветки вносит изменение в репозиторий, создавая новую запись в истории переключений.

По этой причине в Git есть специальная команда, выводящая полную хронологию переключения между ветками:

    

Хронология операций выводится отображается снизу-вверх, то есть самые последние переключения находятся выше:

    

10. Переключение на удаленную ветку

Добавление удаленного репозитория

Предположим, у нас есть удаленный репозиторий GitHub, с которым мы работаем через HTTPS-соединение:

    

Либо же мы могли получить к нему доступ через SSH:

    

В этом случае предварительно выполняется генерация SSH-ключа:

    

При этом публичный ключ (.pub), появившийся в каталоге /.ssh/known_hosts/, копируется в настройки аккаунта GitHub в раздел SSH Keys.

В нашем случае удаленным репозиторием выступит Nginx:

    

Загрузка файлов из удаленной ветки

После добавления удаленного репозитория можно посмотреть список всех его веток:

    

Image1

Перед переключением на удаленную ветку нужно сперва извлечь подробную информацию об удаленном репозитории — ветки и теги:

    

Можно также указать сразу все удаленные репозитории:

    

Теперь мы можем напрямую переключиться на удаленную ветку, получив ее файлы в рабочий каталог:

    

При этом в более старых версиях Git приходилось явно указывать название удаленного репозитория:

    

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

    

Можно увидеть указанную удаленную ветку в статусе активной:

    

Проверим состояние рабочего каталога:

    

Теперь в нем присутствуют следующие каталоги:

    

Удаленную ветку, ровно как и локальную, можно удалить. Для этого ее сперва нужно сделать неактивной:

    

После чего выполнить само удаление:

    

Теперь список веток проекта станет, как прежде:

    

11. Переключение на коммит

Точно так же, как переключаться на разные ветки, вы можете переключаться на конкретные коммиты. Однако, важно отметить разницу между коммитами и ветками.

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

Давайте сперва переключимся на самую последнюю созданную ветку, которая содержит наибольшее число коммитов:

    

Чтобы переключиться на конкретный коммит, вместо имени ветки в checkout указывается хеш (ID) коммита:

    

Чтобы узнать хэш, можно воспользоваться командой:

    

В нашем случае история коммитов выглядит примерно так — отличаться могут только хэши:

    

После переключения на коммит можно посмотреть, какая ветка является активной:

    

Теперь список веток приобрел следующий вид:

    

Эта манипуляция приводит к состоянию отсоединенного указателя HEAD («detached HEAD»). Таким образом, все последующий коммиты не будут принадлежать ни одной из существующих веток.

Однако такой режим небезопасен — отсутствие конкретной ветки в указателе HEAD может привести к потере данных.

По этой причине выбранный коммит (тот, на который указывает HEAD) принято «оборачивать» в новую ветку, в рамках которой производятся дальнейшие модификации проекта.

Чаще всего функцию переключения на конкретный коммит используют для просмотра изменений кодовой базы, которые были внесены на определенной стадии разработки.

Отличие checkout от switch

В более поздних версиях (2.23 и выше) Git есть другая команда для работы с ветками — switch.

Эти команды довольно похожи, однако switch является более специализированным вариантом:

  • git switch — новая команда, которая в большей степени ориентирована на работу с ветками. Напротив, git checkout — старая команда, которая способна делать и другие «периферийные» задачи. Например, создавать новые в ветки в момент переключения или изменять содержимое рабочего каталога до состояние конкретного коммита.

  • git checkout имеет более универсальный (и менее стандартизированный) синтаксис, нежели git switch. С другой стороны по этой причине checkout может казаться более сложной и запутанной, а значит, подверженной ошибкам.

Подготовили для вас выгодные тарифы на облачные серверы

Cloud MSK 15

477 ₽/мес

Процессор
1 x 3.3 ГГц
Память
1 ГБ
NVMe
15 ГБ
Канал
1 Гбит/с
Публичный IP
Cloud MSK 30

657 ₽/мес

Процессор
1 x 3.3 ГГц
Память
2 ГБ
NVMe
30 ГБ
Канал
1 Гбит/с
Публичный IP

Заключение

В этом небольшом руководстве мы подробно рассказали о том, что делает команда git checkout, основная функция которой — переключение между отдельными ветками репозитория.

Вот полный список функций, которые выполняет команда checkout:

  • Переключение между существующими локальными ветками

  • Создание новых локальных веток

  • Создание новых локальных веток на основе других веток

  • Сброс существующих локальных веток до состояния других веток

  • Переключение между существующими удаленными ветками (и загрузкой их файлов в рабочий каталог)

  • Переключение на конкретный коммит из локальной или удаленной ветки

После переключения на другую ветку, как правило, продолжается использование таких команд, как git add и git commit для индексации изменений и обновления состояния репозитория конкретно в этой ветке.

При этом нужно быть всегда осторожным — переключение между ветками после внесения изменений в рабочий каталог без совершения коммита приводит к потере новых данных.

Больше информации о работе с Git можно найти в наших инструкциях и в официальной документации.

5629
12 минут чтения
Средний рейтинг статьи: 2
Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server