Перемещение по веткам и коммитам в Git

0
966
views

Перевод статьи «Git Switch Branch – How to Change the Branch in Git».

Пользуясь Git, вам очень часто придется перемещаться по веткам. Для этого используется команда git checkout.

Как создать новую ветку в Git и перейти в нее

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

Допустим, вы находитесь в ветке master:

(master)$ git checkout -b my-feature
Switched to a new branch 'my-feature'
(my-feature)$

Вы видите, что была создана новая ветка с именем my-feature. Она является ответвлением master. После создания новой ветки вы автоматически перешли в нее.

Как перейти в уже существующую ветку в Git

Чтобы перейти в уже существующую ветку, используйте ту же команду git checkout, но без добавления флага -b. Команде нужно передать имя ветки, в которую вы хотите перейти:

(my-feature)$ git checkout master
Switched to branch 'master'
(master)$

Для перехода в предыдущую ветку (т. е. ту, из которой вы перешли в текущую) можно передать команде git checkout не имя ветки, а просто дефис:

(my-feature)$ git checkout -
Switched to branch 'master'
(master)$ git checkout -
Switched to branch 'my-feature'
(my-feature)$

Как переместиться к определенному коммиту

Чтобы перейти к определенному коммиту, используйте ту же команду git checkout, но вместо имени ветки передайте ей SHA коммита.

Ветки по сути являются просто указателями трекерами отдельных коммитов в истории Git.

Как найти SHA коммита

Один из способов найти SHA коммита — просмотреть лог Git. Делается это при помощи команды git log:

(my-feature)$ git log
commit 94ab1fe28727b7f8b683a0084e00a9ec808d6d39 (HEAD -> my-feature, master)
Author: John Mosesman <johnmosesman@gmail.com>
Date:   Mon Apr 12 10:31:11 2021 -0500

    This is the second commmit message.

commit 035a128d2e66eb9fe3032036b3415e60c728f692 (blah)
Author: John Mosesman <johnmosesman@gmail.com>
Date:   Mon Apr 12 10:31:05 2021 -0500

    This is the first commmit message.

В первой строке каждого коммита после слова commit есть длинная строка букв и цифр: 94ab1fe28727…

Вот она и называется SHA. Это уникальный идентификатор, генерируемый для каждого коммита.

Чтобы перейти к определенному коммиту, вам нужно лишь передать его SHA в качестве параметра команды git checkout:

(my-feature)$ git checkout 035a128d2e66eb9fe3032036b3415e60c728f692
Note: switching to '035a128d2e66eb9fe3032036b3415e60c728f692'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at 035a128 a
((HEAD detached at 035a128))$

Примечание: обычно можно использовать всего несколько первых символов SHA, потому что первые 4-5 символов скорее всего образуют уникальную комбинацию в рамках проекта.

Что такое detached HEAD (отсоединенный указатель HEAD)?

В результате перехода к конкретному коммиту вы указываетесь в «состоянии отсоединенного указателя HEAD» («detached HEAD state»).

Из документации:

[a detached HEAD state] означает, что HEAD направлен на конкретный коммит, а не на именованную ветку.

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

«Вы в состоянии detached HEAD. Можете осмотреться, внести какие-нибудь экспериментальные изменения и закоммитить их. Если затем вы переключитесь обратно на ветку, вы сбросите все коммиты, сделанные в этом состоянии, никак не задев никакие ветки».

Исходя из этого, у вас есть два варианта:

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

Для возвращения в предыдущую ветку (со сбросом всех изменений) используйте команду git switch -.

Если вы все же хотите сохранить свои изменения, внесенные в состоянии detached HEAD, и продолжить работу с этого места, можете использовать git switch -c <имя-новой-ветки>, чтобы создать новую ветку из этой точки.

Заключение

Команда git checkout — очень полезная и многофункциональная. С ее помощью можно создавать новые ветки, перемещаться по веткам и коммитам и т. д.