git checkout
может делать несколько разных вещей.
Когда вы пишете git checkout <branch>
, Git извлекает файлы в рабочем дереве, соответствующие коммиту в конце этой ветви, и устанавливает переход к указанному вами (то есть, HEAD
установлен на эту ветвь).
Когда вы пишете git checkout <sha>
или git checkout <tag>
, вы создаете то, что называется detached HEAD . Другими словами, рабочее дерево извлекается для этого коммита и HEAD
обновляется, но ветки нет; если вы создадите коммит в этот момент, он не будет ни в одной ветви. Это все еще полезно, когда вы хотите go к более старой ревизии и смотреть на вещи, но не вносить никаких изменений.
Когда вы пишете git checkout <revision> <paths>
, то, что вы написали здесь, вы спрашиваете Git чтобы изменить рабочее дерево и индекс (промежуточную область), чтобы указанные вами файлы были версиями для данной конкретной ревизии. Другими словами, написав git checkout <sha> .
, вы попросили Git изменить рабочее дерево и индекс, чтобы он полностью соответствовал этой фиксации, но вы не изменили то, на что указывает HEAD
(фактический указатель ветви). Задание определенных путей может быть хорошим способом извлечения указанных c старых версий файлов, если вам нужно, но, вероятно, это не то, что вы хотели.
Если вы сделали коммит сейчас, вы бы в какой бы ветке вы ни находились, но у вас будут все файлы в точности как в указанной вами ревизии, что означает, что вы, вероятно, отмените много работы. Чтобы отменить это и вернуться в нормальное состояние, выполните git reset HEAD .
, а затем git checkout .
. Это отменит изменения в рабочем дереве и оставит вас с чистым рабочим деревом при коммите, на котором вы были.
Чтобы создать и проверить новую ветку с заданной ревизией, напишите git checkout -b <new-branch> <revision>
. Если вы просто хотите создать его в данной ревизии, не проверяя его, используйте git branch <new-branch> <revision>
.