W3docs

git checkout

Подробное описание команды git checkout: переключение веток, восстановление файлов, состояние detached HEAD и примеры использования.

Что делает git checkout

git checkout — одна из наиболее универсальных команд Git. Она выполняет две разные задачи:

  1. Переключение веток — перемещает HEAD на другую ветку и обновляет файлы в рабочем каталоге в соответствии с последним коммитом этой ветки.
  2. Восстановление файлов — перезаписывает файлы в рабочем каталоге (или в индексе) версией из коммита, ветки или индекса.

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_branch

git 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 checkout

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

git switch -c new_branch

Таким образом, изучение старого коммита в состоянии detached HEAD совершенно безопасно, но любую новую разработку ведите на настоящей ветке, чтобы коммиты оставались доступными. git reflog всё равно поможет восстановить коммиты, если вы забудете об этом.

Практика

Практика
Каковы возможности и функции команды 'git checkout'?
Каковы возможности и функции команды 'git checkout'?
Was this page helpful?