git checkout
Подробное описание команды git checkout: переключение веток, восстановление файлов, состояние detached HEAD и примеры использования.
Что делает git checkout
git checkout — одна из наиболее универсальных команд Git. Она выполняет две разные задачи:
- Переключение веток — перемещает
HEADна другую ветку и обновляет файлы в рабочем каталоге в соответствии с последним коммитом этой ветки. - Восстановление файлов — перезаписывает файлы в рабочем каталоге (или в индексе) версией из коммита, ветки или индекса.
HEAD — это указатель Git на «текущее положение»: как правило, он указывает на кончик ветки, которая в данный момент извлечена. При выполнении git checkout Git перемещает HEAD и переписывает отслеживаемые файлы так, чтобы рабочее дерево отражало целевое состояние.
Поскольку команда совмещает несколько функций, современный Git (2.23+) разделил её роли на две более понятные команды: git switch — для переключения между ветками, и git restore — для отмены изменений в файлах. git checkout по-прежнему работает точно так же, как раньше; на этой странице она используется в примерах, а где уместно — указываются современные аналоги.
На этой странице рассматриваются извлечение существующих и новых веток, работа с удалёнными ветками, восстановление файлов и состояние detached HEAD.
Переключение на существующую ветку
Если репозиторий уже содержит несколько веток, команда git checkout <branch> переключается на одну из них. Сначала выполните git branch, чтобы вывести список доступных веток; текущая ветка отмечена звёздочкой:
Вывод списка веток и переключение на одну из них
$ git branch
* master
test_branch
feature_branch
$ git checkout feature_branch
Switched to branch 'feature_branch'После переключения рабочий каталог соответствует последнему коммиту ветки feature_branch, и все новые коммиты будут записываться в неё. Современный аналог — git switch feature_branch.
Git откажется переключаться, если у вас есть незафиксированные изменения, которые будут перезаписаны целевой веткой. В этом случае сначала зафиксируйте их, спрячьте или отмените.
Создание новой ветки и переключение на неё
Чтобы создать ветку и одновременно переключиться на неё, используйте флаг -b:
git checkout -b
git checkout -b new_branchФлаг -b указывает Git выполнить git branch new_branch (создать ветку от текущего HEAD) и сразу же git checkout new_branch. Это эквивалентно:
git branch new_branch
git checkout new_branchПо умолчанию новая ветка начинается с текущего HEAD. Чтобы основать её на другой ветке или коммите, укажите начальную точку:
git checkout -b от конкретной начальной точки
git checkout -b new_branch existing_branchЗдесь new_branch создаётся на кончике existing_branch, а не от текущего HEAD. Современный аналог — git switch -c new_branch existing_branch.
Переключение веток и HEAD
Выполнение git checkout <branch> направляет HEAD на кончик этой ветки:
git checkout mainЕсли вы переключились по ошибке или потеряли ориентацию в перемещениях HEAD, команда git reflog выведет список всех позиций, в которых находился HEAD, что позволит вернуться к предыдущему состоянию.
Извлечение удалённой ветки
При работе в команде удалённый репозиторий хранит ветки, отправленные другими участниками. Чтобы просмотреть и извлечь их, сначала загрузите последние данные с помощью git fetch:
git fetch --allПосле этого современный Git может извлечь удалённую ветку по короткому имени. Git автоматически создаёт локальную ветку, отслеживающую соответствующую удалённую:
git checkout feature_branchЭто работает только тогда, когда ровно один удалённый репозиторий содержит ветку с таким именем. Если имя неоднозначно или вы хотите быть явным, создайте локальную отслеживающую ветку из удалённой ссылки:
Создание локальной ветки из удалённой
git checkout -b feature_branch origin/feature_branchФлаг -b здесь обязателен — новая локальная ветка feature_branch создаётся из origin/feature_branch и настраивается для её отслеживания. Чтобы привести существующую локальную ветку в точное соответствие с удалённой, используйте git reset:
git reset --hard origin/feature_branchgit reset --hard удаляет локальные коммиты и незафиксированные изменения в этой ветке, поэтому используйте её только когда намеренно хотите отказаться от локальной работы.
Восстановление файлов с помощью git checkout
Помимо переключения веток, git checkout может заменить файлы в рабочем дереве версией из индекса или другого коммита.
Отмените незафиксированные изменения в одном файле и восстановите версию из последнего коммита:
Отмена изменений в одном файле
git checkout -- file.txt-- отделяет параметры команды от пути к файлу, что устраняет неоднозначность, когда файл и ветка имеют одинаковое имя. Современный аналог — git restore file.txt.
Восстановите файл в состоянии, в котором он существовал в конкретном коммите или ветке, не переключая ветку:
Восстановление файла из другого коммита
git checkout <commit> -- file.txtЭто обновляет file.txt в рабочем каталоге и индексе до его содержимого в <commit>, при этом HEAD остаётся на текущей ветке. Более понятный современный синтаксис см. в git restore.
Состояние detached HEAD
Извлечение конкретного коммита (а не ветки) переводит вас в состояние detached HEAD:
git checkout a1b2c3dОбычно HEAD указывает на ветку, которая в свою очередь указывает на коммит. Когда вы извлекаете коммит напрямую, HEAD указывает прямо на него без привязки к ветке — именно это означает «detached». Это полезно для изучения или тестирования старого состояния проекта.

Риск заключается в том, что любые коммиты, сделанные в этом состоянии, не принадлежат ни одной ветке. Как только вы переключитесь на другую ветку, эти коммиты останутся без ссылок и станет трудно найти (Git в итоге удалит их при сборке мусора). Если вы решили сохранить работу, выполненную в состоянии detached HEAD, создайте ветку, прежде чем уйти:
git switch -c new_branchТаким образом, изучение старого коммита в состоянии detached HEAD совершенно безопасно, но любую новую разработку ведите на настоящей ветке, чтобы коммиты оставались доступными. git reflog всё равно поможет восстановить коммиты, если вы забудете об этом.