Tout d'abord, nous allons clarifier ce que la TÊTE est et ce qu'il veut dire quand il est détaché.
La TÊTE est le nom symbolique pour la sorti de la validation. Lorsque la TÊTE n'est pas détachée à la "normale"1 situation: vous avez une branche vérifié), TÊTE de souligne en fait à une branche de la "ref" et les points de branchement à la livraison. La TÊTE est donc "attaché" à une branche. Lorsque vous effectuez un nouveau commit, la direction générale que la TÊTE est mise à jour pour pointer vers le nouveau commit. La TÊTE suit automatiquement depuis juste des points pour la branche.
-
git symbolic-ref HEAD
rendements en refs/heads/master
La branche nommée "maître" est cochée.
-
git rev-parse refs/heads/master
rendement 17a02998078923f2d62811326d130de991d1a95a
Que la validation est que la pointe de courant ou de "tête" de la branche master.
-
git rev-parse HEAD
également yeilds 17a02998078923f2d62811326d130de991d1a95a
C'est ce que signifie être un "symbolique ref". Il pointe vers un objet par une autre référence.
(Symbolique refs ont été initialement mis en œuvre que les liens symboliques, mais plus tard changé à la plaine de fichiers avec l'interprétation supplémentaire afin qu'ils puissent être utilisés sur les plates-formes qui n'ont pas de liens symboliques.)
Nous avons HEAD
→ refs/heads/master
→ 17a02998078923f2d62811326d130de991d1a95a
Lorsque la TÊTE est détachée, il pointe directement vers un commit-au lieu de faire indirectement de pointage à l'aide d'une branche. Vous pouvez penser à un décollement de la TÊTE comme sur un sans nom de la branche.
-
git symbolic-ref HEAD
d'échec avec fatal: ref HEAD is not a symbolic ref
-
git rev-parse HEAD
rendements en 17a02998078923f2d62811326d130de991d1a95a
Car il n'est pas symbolique, ref, il doit pointer directement à le commettre lui-même.
Nous avons HEAD
→ 17a02998078923f2d62811326d130de991d1a95a
La chose importante à retenir avec un décollement de la TÊTE, c'est que si le commit c'est le contraire non référencées (aucun autre ref peut l'atteindre), puis il deviendra "pend" quand vous commander quelques autres de commettre. Enfin, ces balançant les validations seront taillés à travers le processus de nettoyage (par défaut, ils sont conservés pendant au moins 2 semaines et peuvent être conservés plus longtemps en étant référencé par le CHEF de l'reflog).
1
Il est parfaitement bien de faire de travail "normale" avec un décollement de la TÊTE, vous avez juste à garder une trace de ce que vous faites pour éviter d'avoir à poissons a chuté de l'histoire de la reflog.
Les étapes intermédiaires d'un rebase interactif sont fait avec un décollement de la TÊTE (en partie pour éviter de polluer l'actif de la direction générale de reflog). Si vous finissez le plein de rebase opération, elle sera mise à jour de l'original de votre branche avec le résultat cumulé de la rebase fonctionnement et remettre en place la TÊTE à l'origine de la branche. Ma conjecture est que vous n'avez jamais complètement achevé le processus de rebase; ce qui vous laisse avec un décollement de la TÊTE pointant vers le commit qui a été plus récemment traitées par le rebase opération.
Récupérer à partir de votre situation, vous devez créer une branche qui pointe vers le commit actuellement pointée par votre détaché de la TÊTE:
git branch temp
git checkout temp
(ces deux commandes peuvent être abrégé en git checkout -b temp
)
Cela permettra de rattacher votre TÊTE vers le nouveau temp
de la branche.
Ensuite, vous devez comparer l'état actuel de commettre (et son histoire) avec la normale de la branche sur laquelle vous vous attendiez à être à travailler:
git log --graph --decorate --pretty=oneline --abbrev-commit master origin/master temp
git diff master temp
git diff origin/master temp
(Vous aurez probablement envie d'expérimenter avec le journal des options: ajouter -p
, laisser tomber --pretty=…
voir tout le message de log, etc.)
Si votre nouveau - temp
de la branche semble bon, vous souhaitez mettre à jour (par exemple,) master
de point de:
git branch -f master temp
git checkout master
(ces deux commandes peuvent être abrégé en git checkout -B master temp
)
Vous pouvez ensuite supprimer le temporaire de la branche:
git branch -d temp
Enfin, vous aurez probablement envie de pousser les rétabli l'histoire:
git push origin master
Vous avez beaucoup ont besoin d'utiliser --force
pour pousser si la branche à distance ne peut pas être "avance rapide" pour le nouveau commit (c'est à dire que vous avez laissé tomber, ou réécrit certains commettent, ou autrement réécriture de certains bits de l'histoire).
Si vous avez été dans le milieu d'un rebase opération, vous devriez probablement le nettoyer. Vous pouvez vérifier si un rebase a été dans le processus de recherche le répertoire .git/rebase-merge/
. Vous pouvez nettoyer manuellement en cours de rebase tout simplement en supprimant le répertoire (par exemple, si vous ne vous souvenez plus du but et du contexte de l'actif rebase opération). Habituellement, vous devez utiliser git rebase --abort
, mais qui fait partie supplémentaire de réinitialisation que vous voulez probablement à éviter (il bouge la TÊTE en arrière à l'original de la direction générale et le remet à zéro à l'origine de commettre, qui permet d'annuler une partie du travail que nous avons fait ci-dessus).