Git Checkout - что делает команда и как переключить ветку (branch) - Академия Selectel

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

Рассказываем о команде git checkout, которая позволяет перемещаться между ветками, коммитами и состояниями файлов.

Введение

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

Что такое git checkout

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

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

Как использовать git checkout

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

git checkout [наименование ветки | хэш коммита]

Команда выше является общим шаблоном задействования git checkout для перехода к определенной ветке или коммиту. Из этого можно понять, что переключение происходит с использованием ссылок (refs). Как пример, переключение по ветке:

git checkout pretty_branch

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

git branch

Строка ветки, которая задействована прямо сейчас, будет помечена звездочкой (*). Если  требуется показать все ветвление (включая ветки удаленного репозитория), необходимо добавить флаг -a. Задействовав флаг -r, будет выведен список только удаленных веток.

Варианты использования git checkout

Переключение веток

Одним из типичных вариантов использования git checkout является переключением между ветками. Посмотрев список веток, выберем ветку feature для переключения:

git checkout feature

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

git checkout origin/feature

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

Создание ветки и переключение на нее же — распространенное действие в Git. Осуществляется это действие при помощи git checkout таким образом:

git checkout -b new_branch

Где new_branch — название создаваемой ветки. Работа над новой веткой будет происходить независимо от основной. Закончив с изменениями, можно их объединить с основной веткой.

Проверка коммитов и состояние отсоединенного HEAD

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

git checkout [хэш коммита]

Посмотреть список последних коммитов наряду с их хэшем можно командой git log. При проверке коммита нужно быть внимательным, так как переключение по хэшу приводит к состоянию отсоединенного указателя HEAD (detached HEAD). Это состояние означает, что новые коммиты не будут принадлежать ни одной из веток, дальнейшая разработка может привести к случайной потере данных.

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

Отмена изменений в рабочей директории и восстановление файлов

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

git checkout -- [путь к файлу]

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

git checkout -- .

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

git checkout [хэш коммита] -- [путь к файлу]

Такая команда поместит нужный файл в рабочую директорию. Рекомендуется использовать git diff вместе с git checkout, чтобы посмотреть изменения в файлах, прежде чем их отменить. Также помогает команда git status, обнаруживающая новые изменения.

Копирование удаленной ветки

Совместная работа в удаленном репозитории часто включает в себя множество веток для разработки. Git checkout позволяет получить конкретную удаленную ветку и создать ее локальную копию, если воспользоваться следующим вводом:

git checkout -b [локальная ветка] origin/[удаленная ветка]

Получается рабочая копия ветки удаленного репозитория.

Git checkout против git reset

Git checkout и git reset позволяют перемещаться между коммитами, но работают они по-разному.

  • Git checkout в основном используется для переключения веток, проверки коммитов и восстановления файлов.
  • Git reset используется для отмены коммитов и перемещения указателя ветки на другой коммит, эффективно удаляя некоторые коммиты из истории репозитория.

Говоря вкратце, git checkout используется в основном для навигации по репозиторию, а git reset — для перезаписи истории.

Возможные ошибки при работе с git checkout

Разработчики могут столкнуться с трудностями при работе с командами Git. Чтобы быть готовым к ним, приведем примеры возможных ошибок, которые могут возникнуть с git checkout.

  • Потеря несохраненных изменений. Если есть несохраненные изменения в рабочем каталоге, при переключении на другую ветку Git предупреждает, что изменения могут быть потеряны. В этом случае лучше выполнить коммит или сохранить изменения во временном хранилище с помощью git stash.
  • Некорректное указание коммита или ветки. При разработке следует всегда быть внимательным к названиям коммитов и веток.
  • Отсутствие указанного файла.
  • Конфликт изменений файлов. Такое может произойти, если переключиться на ветку, которая имеет такой же файл, но с другими изменениями. В этом случае стоит вручную произвести слияние веток, либо выбрать, какие изменения использовать.

Флаги и опции git checkout

Git checkout также поддерживает различные опции, расширяющие возможности данной команды. Например, —track или -t позволяет установить слежение между новой веткой (как в примере ниже — feature) и одноименной удаленной.

git checkout -t origin/main

Другим рассматриваемым параметром является —orphan. Используя его, можно создать новую ветку без истории коммитов.

git checkout --orphan branchname

Возможно и принудительное переключение на другую ветку через флаг -f или —force:

git checkout -f force_switched

Также может возникнуть ситуация, когда понадобится выбрать изменения при переключении веток в конфликте изменений файлов. Выбор осуществляется опциями —ours (выбор изменений из текущей ветки) или —theirs (выбор изменений из переключаемой ветки). 

git checkout [--ours | --theirs] [путь к файлу]

Заключение

Git checkout — фундаментальная команда в системе контроля версий Git, позволяющая разработчикам перемещаться между ветками, коммитами и состояниями файлов. Но чтобы разработка шла более плавно, стоит обратить внимание на такие вещи как:

  • Состояние отсоединенного HEAD: при перемещении между коммитами HEAD перестает ссылаться на ветку и является отсоединенным. Лучше всегда создавать новую ветку, если планируются вносить изменения после определенного коммита при отсоединенном состоянии HEAD.
  • Переключение между ветками: следует убедиться, что индекс чист (нет незафиксированных изменений), прежде чем переключаться между ветками. Это позволит предотвратить возможную потерю данных.
  • Конфликты: перед объединением веток следует проверять код на конфликты.