Чому мій репортаж Git увійшов до відокремленого стану HEAD?


387

Сьогодні я закінчився з відірваною головою, та сама проблема, що описана в: git push говорить, що все актуально, навіть якщо я маю місцеві зміни

Наскільки я знаю, я нічого не робив із звичайного, просто робив поштовхи та натиски з боку свого місцевого репо.

Тож як я закінчився detached HEAD?


18
Перевірка віддаленої гілки виглядає як найпоширеніший спосіб випадково зробити це; Іншим поширеним способом є перевірка branch-name@{n}, n-а попередня позиція branch-name. Але незважаючи ні на що, в якийсь момент, мабуть, було таке git checkout <rev>. Якщо це не дзвонить, то, ймовірно, ви зробили те, що згадував Вілл, - спробували зробити git checkout <file>і вдалося вказати ревізію випадково.
Каскабель

3
Щоб скасувати відокремлений стан HEAD, див. Виправлення відстороненої голови Git? .

Моє РЕПО опинилося в такому стані, коли під час виходу зіткнулися конфлікти. На щастя, Гіт сказав мені, що робити, коли я бігав git status:all conflicts fixed: run "git rebase --continue"
Пол

2
Також трапляється, якщо ви випадково вводите git checkout remotes/origin/my-branchзамість git checkout my-branchабо git checkout origin/my-branch.
Адам Лібуша

@adam Libusa, дякую, що це працювало на мене. Яка різниця між git checkout віддаленим / походженням / моїм відділенням та git checkout моїм відділенням. Хіба це не те саме. але те, що ти сказав, працювало на мене. З цікавості запитую.
karunakar bhogyari

Відповіді:


281

Будь-яка перевірка комісії, яка не є іменем однієї з ваших гілок, отримає вам відокремлену ГЛАВУ. SHA1, який представляє кінчик гілки, все ще надає відокремленій головці. Лише замовлення назви місцевої філії уникає цього режиму.

Дивіться вчинення дії з відокремленою головою

Коли HEAD від'єднано, виконує роботу як звичайно, за винятком того, що жодна гілка не називається. (Ви можете думати про це як анонімну гілку.)

alt текст

Наприклад, якщо ви оформили замовлення на "віддалену гілку", не відстежуючи її спочатку, ви можете одержати відокремлену ГОЛОВУ.

Див. Git: перемикання гілки, не відриваючи голову


З Git 2.23 (серпень 2019 року) вам більше не доведеться використовувати заплутану git checkoutкоманду .

git switch Ви також можете оформити відділення та отримати від'єднану ГОЛОВУ, за винятком:

  • він має явний --detachваріант

Щоб перевірити комісію HEAD~3для тимчасової перевірки чи експерименту без створення нової гілки:

git switch --detach HEAD~3
HEAD is now at 9fc9555312 Merge branch 'cc/shared-index-permbits'
  • він не може помилково від'єднати гілку відстеження

Подивитися:

C:\Users\vonc\arepo>git checkout origin/master
Note: switching to 'origin/master'.

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 switching back to a branch.

Vs. за допомогою нової git switchкоманди:

C:\Users\vonc\arepo>git switch origin/master
fatal: a branch is expected, got remote branch 'origin/master'

Якщо ви хочете створити нову локальну гілку, яка відстежує віддалену гілку:

git switch <branch> 

Якщо <branch>його не знайдено, але існує відділення відстеження точно в одному віддаленому (назвіть його <remote>) з відповідним ім'ям, вважайте його рівнозначним

git switch -c <branch> --track <remote>/<branch>

Більше не помилки!
Більше немає небажаної відмежованої ГЛАВИ!


12
Ще один спосіб ввести відокремлений головний стан - це якщо ви перебуваєте посеред інтерактивної бази даних і хочете відредагувати один із комітетів. Коли Git відмовить вас від зобов'язання редагувати, ви будете знаходитись у відокремленому заголовку, доки не закінчите ребазацію.

У цьому візуальному посібнику є таке пояснення: git commit files creates a new commit containing the contents of the latest commit, plus a snapshot of files taken from the working directory. Additionally, files are copied to the stage.що означає "файли копіюються на етап"? Я думав, що файли зроблені, а це означає, що етап очищено?
макс

16
Насправді, ви отримаєте відокремлену ГОЛОВУ щоразу, коли перевірятимете будь-яку фіксацію її SHA1, незалежно від того, знаходиться вона на кінчику гілки; Єдиний вид, який ви можете перевірити, не отримуючи відокремлену ГОЛОВУ, - це назва філії. Наприклад, незважаючи на те master, що ed489на діаграмі вище, git checkout ed489ви отримаєте відокремлену ГОЛОВУ, тоді як git checkout masterне буде.
musiphil

8
"You can think of this as an anonymous branch":) Мені подобається аналогія
Adrien Be


117

Я відтворив це лише випадково:

  1. перелічує віддалені гілки

    git branch -r
          origin/Feature/f1234
          origin/master
    
  2. Я хочу перевірити локально, тому я вирізав пасту:

    git checkout origin/Feature/f1234
    
  3. Престо! Стан окремої головки

    You are in 'detached HEAD' state. [...])
    

Рішення №1:

Не включайте origin/в передній частині моєї гілки специфікацію під час перевірки:

git checkout Feature/f1234

Рішення №2:

Додайте -bпараметр, який створює локальну гілку з віддаленого пристрою

git checkout -b origin/Feature/f1234 або

git checkout -b Feature/f1234 вона автоматично повернеться до походження


14
Це майже чудова відповідь, але не вдається пояснити, чому ви потрапили до відокремленої держави.
Гуска

5
Я погоджуюся, але це дає рішення, яке я шукав. Дякую!!
Кілмазінг

Я бачив у цій іншій відповіді, що git checkout -b Feature/f1234<=> git branch Feature/f1234і git checkout Feature/f1234.
Armfoot

1
за замовчуванням він виглядає за походженням, тому, коли ви даєте origin/branchname, він шукає, origin/origin/branchnameщоб сказати, що спочатку це віддалене ім’я, яке ви використовуєте -b, якщо у вас це не створює anonymousгілку, яка від'єднана. Аналогічно для перевірки з іншого віддаленого пристрою ви повинні згадати -bпараметр, інакше git не має можливості дізнатися, що це з нового пульта, він буде шукати origin/remote/branchname.
garg10 травня

Ти святий!
Харві Лін

12

спробуйте

git reflog 

це дає вам історію того, як ваші головні та галузеві вказівники куди рухалися в минулому.

наприклад:

88ea06b HEAD @ {0}: замовлення: перехід від РОЗВИТКУ до віддаленого / походження / SomeNiceFeature e47bf80 HEAD @ {1}: потягнути початок РОЗВИТОК: Швидкий вперед

у верхній частині цього списку - це одна причина, з якою можна зіткнутися зі станом ДЕТЕЧИРОВАНОЇ ГОЛОВИ ... перевіряючи відділення віддаленого відстеження.


7

Це може статися легко, якщо ви спробуєте скасувати внесені вами зміни шляхом повторної перевірки файлів і не зовсім правильного синтаксису.

Ви можете подивитися на результат git log- ви можете вставити хвіст колоди з часу останнього успішного вчинення, і ми всі могли бачити, що ви зробили. Або ви можете вставити його в бін і красиво попросити #gitна IRC freenode.


5

Це може статися, якщо у вас є тег, названий так само, як гілка.

Приклад: якщо "release / 0.1" - це тег, тоді

git checkout release/0.1

створює відокремлену ГОЛА при "випуску / 0,1". Якщо ви очікуєте, що реліз / 0.1 буде назвою гілки, то ви заплутаєтесь.


1
Так. Але як це виправити? Як ви оформили замовлення на відділення?
Мартін

5

Detached HEAD означає, що те, що зараз перевірено, не є місцевим відділенням.

Деякі сценарії, які призведуть до Detached HEADстану:

  • Якщо ви замовляєте віддалене відділення , скажіть origin/master. Це гілка лише для читання. Таким чином, при створенні комітету з origin/masterнього буде вільно плаваючим , тобто не підключеним до жодної гілки.

  • Якщо ви оформили певний тег або вчинили комісію . Виконуючи нову команду звідси, вона знову буде плаваючою , тобто не підключена до жодної гілки. Зауважте, що коли філія перевіряється, нові комітети завжди автоматично розміщуються на кінчику.

    Коли ви хочете повернутися назад і перевірити певну комісію або тег, щоб почати працювати звідти, ви можете створити нову гілку, що походить з цього коміту, і переключитися на неї git checkout -b new_branch_name. Це завадить Detached HEADдержаві, оскільки у вас зараз філія перевірена, а не комісія.


3

Простий випадковий спосіб - це зробити git checkout headдрукарські помилки HEAD.

Спробуйте це:

git init
touch Readme.md
git add Readme.md
git commit
git checkout head

що дає

Note: checking out 'head'.

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 9354043... Readme

Також згадується у longair.net/blog/2012/05/07/the-most-confusing-git-terminology (шукайте "" HEAD "та" head "")
VonC

@VonC: дякую за це посилання. Я готую тренування з Git, і також хочу зазначити, чому це іноді так заплутано. У мене вже є багато прикладів (як, checkout -bсхоже, каси, але насправді філії), але ще один список вітається.
Томас Веллер

2

Інший спосіб потрапити в відокремлений головний стан - це спробувати встановити віддалену гілку. Щось на зразок:

git fetch
git checkout origin/foo
vi bar
git commit -a -m 'changed bar'

Зауважте, що якщо ви зробите це, будь-яка подальша спроба перевірити походження / foo поверне вас у відокремлений стан голови!

Рішення полягає в створенні власної локальної гілки foo, яка відстежує походження / foo, а потім необов'язково натискати.

Це, мабуть, не має нічого спільного з вашою первісною проблемою, але ця сторінка є високою в хітах Google для "git detached head", і цей сценарій сильно недостатньо задокументований.


Здається, така ситуація є тим, про що йдеться у відповіді Оуена вище - де вирізання та вклеювання "origin / foo" змушує git думати про це як "origin / origin / foo".
mvanle

1

Під час оформлення замовлення на комісію git checkout <commit-hash> або у віддалену гілку ваш HEAD від'єднається та спробує створити на ньому нову комісію.

Комісії, які не досяжні жодною гілкою або тегом, будуть зібрані сміття та вивезені зі сховища через 30 днів.

Ще один спосіб вирішити це - створити нову гілку для новоствореного комітету та отримати замовлення на нього. git checkout -b <branch-name> <commit-hash>

Ця стаття ілюструє, як можна дістатися до відірваного стану HEAD .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.