Как я закончил с отделенной головой?

Я проверил коммит / ветку от мастера, а затем вернул обратно к мастеру и что-то написал. После этого я совершил это, но в итоге у меня была отдельная ГОЛОВА. Зачем?

Вот что я сделал:

  1. Создайте новый проект и создайте git-репозиторий.
  2. мерзавец добавить
  3. мерзавец совершить
  4. введите несколько слов
  5. мерзавец совершить
  6. оформить предыдущий коммит
  7. оформить заказ обратно

    step7

  8. введите какое-нибудь слово

  9. попытаться совершить; это подсказывает, что есть отдельная голова.

    step9

Консоль IntelliJ IDEA показывает:

17:08:58.143: cd C:\Users\jiahao\IdeaProjects\testtt\src
17:08:58.143: git init
Initialized empty Git repository in C:/Users/jiahao/IdeaProjects/testtt/src/.git/
17:09:16.331: cd C:\Users\jiahao\IdeaProjects\testtt\src
17:09:16.331: git -c core.quotepath=false add --ignore-errors -- C.java
17:09:24.407: cd C:\Users\jiahao\IdeaProjects\testtt\src
17:09:24.407: git -c core.quotepath=false commit --only -F C:\Users\jiahao\AppData\Local\Temp\git-commit-msg-0.txt -- C.java
[master (root-commit) 22d1c79] first commit
 1 file changed, 6 insertions(+)
 create mode 100644 C.java

17:09:38.060: cd C:\Users\jiahao\IdeaProjects\testtt\src
17:09:38.060: git -c core.quotepath=false commit --only -F C:\Users\jiahao\AppData\Local\Temp\git-commit-msg-0.txt -- C.java
[master 69084f3] second commit
 1 file changed, 1 insertion(+)

17:09:44.136: cd C:\Users\jiahao\IdeaProjects\testtt\src
17:09:44.136: git -c core.quotepath=false checkout 22d1c7919eab50925411d9bbb8a9ad1575608c27
Note: checking out '22d1c7919eab50925411d9bbb8a9ad1575608c27'.
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 22d1c79... first commit
17:09:46.576: cd C:\Users\jiahao\IdeaProjects\testtt\src
17:09:46.576: git -c core.quotepath=false checkout 69084f344b79a48da92855d3fb633a28a672a302
Previous HEAD position was 22d1c79... first commit
HEAD is now at 69084f3... second commit
17:18:26.999: cd C:\Users\jiahao\IdeaProjects\testtt\src
17:18:26.999: git -c core.quotepath=false commit --only -F         C:\Users\jiahao\AppData\Local\Temp\git-commit-msg-0.txt -- C.java
[detached HEAD 783fbf2] third commit
1 file changed, 1 insertion(+)

3 ответа

Решение

Проблема и решение

При внимательном рассмотрении журнала IntelliJ-IDEA выявляется характер проблемы. После создания первых двух коммитов вы попали в следующую ситуацию:

введите описание изображения здесь

Каким-то образом вы проверили свой первый коммит, который перевел вас в состояние отсоединенного заголовка:

введите описание изображения здесь

Затем, аналогичным образом, вы проверили свой второй коммит (который оказался кончиком вашего master ветка). Это все еще оставило вас в состоянии обособленной головы:

введите описание изображения здесь


Ты пишешь:

Я проверил коммит / ветку из master [...]

Быть осторожен. Извлечение коммита, который оказывается верхушкой ветки, не эквивалентно проверке этой ветки!


Обратите внимание, что HEAD теперь указывает непосредственно на коммит, а не на ветку. Это определение "отстраненная голова". Дело в том, что HEAD указывает на тот же коммит master ничего не меняет в том факте, что ваша ГОЛОВА отсоединена.


Некоторые IDE могут не дать вам четкого указания, что вы на самом деле находитесь в состоянии отсоединенного HEAD. Четное git log --decorate долгое время не давал понять, HEAD указывал на master или отсоединен и указывает прямо на master Совет.


Затем вы сделали третий коммит, который, как и ожидалось, по-прежнему оставил вас с отделенной ГОЛОВОЙ; ваш master ветвь по-прежнему указывает на второй коммит.

введите описание изображения здесь

Чтобы выйти из отсоединенного HEAD-состояния, вам необходимо подключить HEAD в филиал (master, Вот). Как зависит от того, что вы хотите сделать. Далее я предполагаю, что у вас есть доступ к Git CLI:

  • Если вы хотите отменить третий коммит, просто запустите

    git checkout master
    

    и вы снова окажетесь в этой ситуации:

    введите описание изображения здесь

  • Если вы хотите сохранить свой третий коммит и сделать master указать на это, запустить

    git branch -f master HEAD
    

    введите описание изображения здесь

    а потом

     git checkout master
    

    введите описание изображения здесь

Прощальный совет

Изучение Git в IDE - это рецепт катастрофы. Сначала вы должны построить свое понимание в командной строке, и только потом начинать использовать Git из GUI, если считаете, что это улучшит ваш рабочий процесс.

Я случайно столкнулся с detached-HEAD при разработке проекта Java Spring с использованием IntelliJ 2020.2. Вот как я вернулся к нормальной жизни.

В окне инструмента git [Alt+9] ветка «Журнал: origin / master» имела 3 метки:

желтый = HEAD, зеленый = master, фиолетовый = origin / master:

'HEAD' и 'origin / master' были применены к показу последней фиксации ,

«master» был применен к показу более ранней фиксации .

Чтобы выйти из detached-head и сбросить его до желаемого состояния «HEAD & master & origin / master все применено к последней фиксации ветки», щелкните правой кнопкой мыши узел «master» в списке «Remote» (расположен слева от истории ветки) и выбрал "Касса":

Это вернулось к обычному состоянию в последней фиксации в ветке, которая сейчас отображается .

Для восстановления обособленной головы вы можете:

git checkout master
Другие вопросы по тегам