Git: Как вернуться из состояния «отсоединенная ГОЛОВА»

218

Если вы захотите оформить ветку:

git checkout 760ac7e

Например b9ac70b, как можно вернуться к последней известной голове, b9ac70bне зная ее SHA1?

Джеймс Райцев
источник

Ответы:

332

Если вы помните, какая ветвь была проверена ранее (например master), вы можете просто

git checkout master

выйти из отсоединенного состояния ГОЛОВА .

Вообще говоря: git checkout <branchname>вытащить вас из этого.

Если вы не помните последнее название ветви, попробуйте

git checkout -

Это также пытается проверить вашу последнюю проверенную ветку.

Экес
источник
17
git checkout -- убийственная особенность!
Dimpiax
1
Если вы не сделаете a git checkout -b new_branch_name, вы потеряете коммиты, сделанные в состоянии отключенного HEAD?
Йокассид
2
@jocassid Да, вы делаете. Они присутствуют некоторое время, но когда git gcони запускаются, они удаляются навсегда. Вы можете смотреть их git reflogдо тех пор, пока они все еще там.
Eckes
не потеряете ли вы какие-либо коммиты / изменения, сделанные вами в отдельном HEAD, если вы это сделаете? Разве это не лучший способ? stackoverflow.com/a/61489179/13087176
навеселе Бупенштайн
@tipsyboopenstein правильно. jocassid уже говорил об этом: stackoverflow.com/questions/11801071/...
Экес
16

Используйте git reflogдля поиска хэшей ранее проверенных коммитов.

Команда быстрого доступа к вашей последней извлеченной ветке (хотя она не уверена, работает ли она правильно с отключенным HEAD и промежуточными коммитами) git checkout -

knittl
источник
4

У меня был такой крайний случай, когда я проверил предыдущую версию кода, в которой структура моего файлового каталога была другой:

git checkout 1.87.1                                    
warning: unable to unlink web/sites/default/default.settings.php: Permission denied
... other warnings ...
Note: checking out '1.87.1'.

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 performing another checkout.

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

  git checkout -b <new-branch-name>

HEAD is now at 50a7153d7... Merge branch 'hotfix/1.87.1'

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

git checkout master не сработало:

$ git checkout master
error: The following untracked working tree files would be overwritten by checkout:
web/sites/default/default.settings.php
... other files ...

git checkout master --force(или git checkout master -f) работал:

git checkout master -f
Previous HEAD position was 50a7153d7... Merge branch 'hotfix/1.87.1'
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
mcaleaa
источник
1

Возможно, вы сделали несколько новых коммитов в detached HEADштате. Я считаю, что если вы делаете, как другие ответы, советуйте:

git checkout master
# or
git checkout -

тогда вы можете потерять свои коммиты !! Вместо этого вы можете сделать это:

# you are currently in detached HEAD state
git checkout -b commits-from-detached-head

а затем слиться commits-from-detached-headв любую ветку, которую вы хотите, чтобы вы не потеряли коммиты.

пьяный бупенштайн
источник