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
?
8 réponses
N'importe quelle caisse d'une commit qui n'est pas le nom d'une de vos branches vous obtiendrez une tête détachée. Une SHA1 qui représente la pointe d'une branche donnerait encore une tête détachée. Seule une caisse d'une succursale locale nom évite ce mode.
voir commettre avec une tête détachée "151980920
lorsque la tête est détachée, effectue le travail comme d'habitude, sauf si aucun nommé branche est mise à jour. (Vous pouvez penser que c'est une branche anonyme.)
par exemple, si vous vérifiez une" branche distante " sans la suivre en premier, vous pouvez vous retrouver avec une tête détachée.
Voir git: commutateur de direction, sans les détacher de la tête
Je l'ai reproduit ici par accident:
-
liste les branches éloignées
git branch -r origin/Feature/f1234 origin/master
-
je veux en acheter un localement, donc je coupe la pâte:
git checkout origin/Feature/f1234
-
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
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.
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.
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.
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
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é.
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.