Vextor-ltd
@Vextor-ltd
Webdeveloper

Как исправить HEAD detached?

Мой товарищ хотел откатиться к предпоследнему коммиту и неправильно откатился.
Он перешёл на предпоследнюю ветку и не удаляя последнюю, закоммитился.
Получилось ответвление как на скриншоте:

661ee67961b96513219214.jpeg

И теперь, если делать коммиты, то получается вот так:

661ee7fc3bb37402006826.jpeg
Я пробовал исправить эту ситуацию следующим образом:

git branch temp
git checkout temp
git branch -f main temp
git checkout main

1. создал временную ветку с именем temp, причем в новой ветке будет правильно установлено положение HEAD
2. переключился на временную ветку temp
3. этой командой я пытался установить в ветке main ту же позицию HEAD, что и в ветке temp
4. переключился на ветку main

Такой фокус не прокатил.

Как соединить коммиты и исправить ситуацию?
  • Вопрос задан
  • 582 просмотра
Решения вопроса 2
sergey-kuznetsov
@sergey-kuznetsov Куратор тега Git
Автоматизатор
У вас проблемы с пониманием того, что такое указатель HEAD.

в новой ветке будет правильно установлено положение HEAD

установить в ветке main ту же позицию HEAD, что и в ветке temp

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

Обычно указатель HEAD ссылается на ветку, но если по ошибке, вместо reset использовать checkout на произвольный коммит, то указатель HEAD станет ссылаться на этот коммит, а не на ветку. Мы как бы выходим из ветки в никуда. Это состояние называется detached HEAD.
Ответ написан
vhood
@vhood
Не забывайте отмечать решения
Он перешёл на предпоследнюю ветку и не удаляя последнюю, закоммитился
что еще за "последние" и "предпоследние" ветки, какие-то новые понятия в git?

Как соединить коммиты и исправить ситуацию?
в ветке main сделать (на выбор):
  • git reset --hard origin/main, тогда main станет соответстовать origin/main, но коммиты e32d4e8 и 690c2b9 пропадут, но не из истории, так что их можно будет подтянуть: git cherry-pick e32d4e8, git cherry-pick 690c2b9
  • git reset --soft origin/main, посмотреть git status и сделать новые коммиты
  • git rebase origin/main, тогда коммиты e32d4e8 и 690c2b9 начнут применяться заново, начиная с коммита 69805c1 (в ходе применения могут возникать конфликты, а так же у применяемых коммитов будет новый хэш)
  • git rebase -i origin/main (интерактивный ребейз), почти то же самое, как предыдущее, но сначала откроется текстовый редактор (который в git указан как редактор по умолчанию) и в нем можно будет указать как именно делать ребейз, например можно будет не переность коммит 690c2b9 или изменить сообщение коммита
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы