Git: могу ли я проверить фиксацию без отсоединения HEAD?

Из руководства Git:

git checkout [--detach] <commit> Подготовьтесь к работе поверх <commit> , путем отсоединения HEAD (см. раздел "DETACHED HEAD" ) и обновления индекс и файлы в рабочем дереве. Локальные модификации файлы в рабочем дереве сохраняются, так что результат работы дерево будет состоять из состояния, зафиксированного в фиксации плюс локальный модификаций.

Кажется, есть только один вариант: HEAD отсоединен. Могу ли я указать параметр, который не позволяет отключить HEAD?

[Обновление 1] Я задал аналогичный вопрос в комментарии в сообщении Вернуть Git repo в предыдущее коммит"

# To get just one, you could use `rebase -i` to squash them afterwards
# Or, you could do it manually (be sure to do this at top level of the repo)
# get your index and work tree into the desired state, without changing HEAD:
git checkout 0d1d7fc32 .

# Then commit. Be sure and write a good message describing what you just did
git commit

Мой вопрос к нему: @Jefromi, после "git checkout 0d1d7fc32.", Уже HEAD отдельностоящий? Тогда "git commit" ничего не может сделать с болтающимся HEAD.

чтобы проверить состояние из 0d1d7fc32 в текущем каталоге, но это оставляет голову, где она была. Это то же самое, что использовать что-то вроде gitcheckout other-branch path/to/file - это оставит вас на вашем текущую ветвь и просто проверить данный файл. В этом случае мы проверяя всю текущую директорию вместо одного файла, но все еще не меняя HEAD. - Jefromi

Итак, мы можем позволить HEAD не привязываться, добавив "."

[Обновление 2] Из ответов и комментариев, приведенных ниже, я думаю, что аккуратный: git reset --hard

Но теперь мой вопрос: Является ли метод Джефоми правильным?

git checkout 0d1d7fc32 .
git commit

См. приведенную выше ссылку для получения более подробной информации о его методе.

Ответ 1

Если вы хотите проверить фиксацию, которая не является последней фиксацией какой-либо ветки, в принципе невозможно проверить это, в то же время имея HEAD ссылку на ветку.

Вы можете создать или обновить ветвь, чтобы указать на эту конкретную фиксацию, как указано в комментариях, используя параметр git checkout -b (или -b для перезаписи существующей ветки) или если вы уже находитесь на который вы хотите указать на конкретную фиксацию, вы можете обновить ее и проверить в то же время, используя git reset --hard <commit>.

Ответ 2

Если вы хотите проверить заданный хеш фиксации без отсоединения от HEAD, вы можете назначить его новой ветке. Просто добавьте -b <newbranch> в конец вашей команды git checkout (заменив <newbranch> на имя вашей новой ветки)

git checkout <hash> -b mynewbranch

Ответ 3

Если вы хотите проверить в отраслевом режиме, и знаете, что он уже сидит на кончике ветки, вам нужно сначала определить имя ветки (используя "git show --decorate", ):

git show --decorate <commit>

Например, "git show --decorate 85d3204" на моем компьютере прямо сейчас говорит мне, что "85d3204" находится на кончике "MY-BRANCH":

commit 85d3204cd5c081abce3329729691fd9e056dcc19 (MY-BRANCH)

Итак, чтобы проверить это фиксацию в ветки-режиме (и предположим, что я хочу продолжить разработку на "MY-BRANCH" ), я бы сделал следующее:

git checkout MY-BRANCH