Pourquoi mon git repo est-il entré dans un État de détachement?

j'ai fini avec une tête détachée aujourd'hui, le même problème que décrit dans: git push dit tout à jour, même si j'ai des changements locaux

autant Que je sache, je n'ai rien qui sort de l'ordinaire, juste s'engage et pousse mon repo.

comment j'ai fini avec un detached HEAD ?

311
git
demandé sur Community 2010-10-19 09:54:02

8 réponses

227
répondu VonC 2017-05-23 10:31:35

Je l'ai reproduit ici par accident:

  1. liste les branches éloignées

    git branch -r
          origin/Feature/f1234
          origin/master
    
  2. je veux en acheter un localement, donc je coupe la pâte:

    git checkout origin/Feature/f1234
    
  3. Presto! État du chef d'état détaché

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

Solution #1:

ne pas inclure origin/ à l'avant de ma spécification de branche lors de la vérification:

git checkout Feature/f1234

Solution n ° 2:

ajouter -b paramètre qui crée une branche locale à partir de la télécommande

git checkout -b origin/Feature/f1234 ou

git checkout -b Feature/f1234 il reviendra à l'origine automatiquement

80
répondu Owen 2016-03-16 10:02:05

essayer

git reflog 

cela vous donne une histoire de la façon dont votre tête et les pointes de branche où déplacé dans le passé.

p.ex.:

88ea06b TÊTE de@{0}: la caisse: passage du DÉVELOPPEMENT à remotes/origin/SomeNiceFeature e47bf80 HEAD@{1}: pull origin DEVELOPMENT: Fast-forward

le haut de cette liste est une raison pour laquelle on pourrait rencontrer une tête détachée état. .. je vérifie une branche de suivi à distance.

9
répondu André R. 2015-05-04 14:58:29

cela peut facilement se produire si vous essayez de défaire les changements que vous avez faits en relisant les fichiers et en n'obtenant pas tout à fait la bonne syntaxe.

vous pouvez regarder la sortie de git log - vous pouvez coller la queue du log ici depuis la dernière propagation réussie, et nous avons tous pu voir ce que vous avez fait. Ou vous pouvez coller-bin il et demander gentiment dans #git sur freenode IRC.

8
répondu Will 2010-10-19 06:08:53

cela peut arriver si vous avez une étiquette portant le même nom qu'une branche.

exemple: si "release / 0.1" est le nom de l'étiquette, alors

git checkout release/0.1

produit une tête détachée à"release/0.1". Si vous vous attendez à ce que release / 0.1 soit un nom de branche, alors vous êtes confus.

3
répondu radzimir 2017-09-28 13:57:54

un moyen accidentel simple est de faire une git checkout head comme une typographie de HEAD .

essayez ceci:

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

qui donne

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
2
répondu Thomas Weller 2017-06-08 12:45:11

l'autre façon d'entrer dans un État de tête détaché est d'essayer de s'engager dans une branche distante. Quelque chose comme:

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

notez que si vous faites cela, toute autre tentative de checkout origine/foo vous laissera tomber à nouveau dans un État de tête détaché!

la solution est de créer votre propre branche locale de foo qui suit l'origine/foo, puis push en option.

cela n'a probablement rien à voir avec votre problème original, mais cette page est haute sur les résultats de google pour "tête détachée git" et ce scénario est sévèrement sous-documenté.

1
répondu dspeyer 2016-05-27 21:41:40

lorsque vous effectuez une sortie vers une propagation git checkout <commit-hash> ou vers une branche distante, votre tête se détachera et essaiera de créer une nouvelle propagation.

s'Engage à ce que ne sont pas accessibles par une branche ou une étiquette seront nettoyés et enlevés à partir du référentiel au bout de 30 jours.

une autre façon de résoudre ce problème est de créer une nouvelle branche pour le commit et le checkout nouvellement créés. git checkout -b <branch-name> <commit-hash>

cet article illustre comment vous pouvez obtenir à tête détachée état.

0
répondu Nesha Zoric 2018-05-07 12:40:28