Fixer un Git détaché de la tête?
je faisais un peu de travail dans mon dépôt et j'ai remarqué qu'un fichier avait des modifications locales. Je n'en voulais plus, alors j'ai effacé le fichier, pensant que je pouvais juste vérifier une nouvelle copie. Je voulais faire l'équivalent Git de
svn up .
utilisant git pull
ne semblait pas fonctionner. Une certaine recherche au hasard m'a mené à un site où quelqu'un a recommandé de faire
git checkout HEAD^ src/
( src
est le répertoire contenant le fichier supprimé).
maintenant je découvre que j'ai une tête détachée. Je n'ai aucune idée de ce que c'est. Comment puis-je l'annuler?
13 réponses
tête détachée signifie que vous n'êtes plus sur une branche, vous avez coché une seule commit dans l'histoire (dans ce cas la commit précédente à la tête, i.e. à la tête^).
si vous voulez supprimer vos modifications associées à la tête détachée
vous n'avez besoin de vérifier que la succursale sur laquelle vous étiez, par exemple
git checkout master
la prochaine fois que vous avez changé un fichier et que vous voulez le restaurer à l'état il est dans l'index, ne supprimez pas le fichier, il suffit de faire
git checkout -- path/to/foo
cela restaurera le fichier foo dans l'état où il se trouve dans l'index.
si vous voulez garder vos changements associés à la tête détachée
- Run
git log -n 1
; ceci affichera la propagation la plus récente sur la tête détachée. Copier-coller le hachage de propagation. - Exécuter
git checkout master
- Exécuter
git branch tmp <commit-hash>
. Cela enregistrera vos modifications dans une nouvelle branche appeléetmp
. - si vous voulez incorporer les changements que vous avez apportés dans
master
, Lancezgit merge tmp
de la branchemaster
. Vous devriez être sur la branchemaster
après avoir lancégit checkout master
.
Si vous avez modifié des fichiers que vous ne voulez pas perdre, vous pouvez pousser. Je les ai engagés dans le mode détaché et après cela vous pouvez passer à une branche temporaire pour intégrer plus tard dans master.
git commit -m "....."
git branch my-temporary-work
git checkout master
git merge my-temporary-work
extrait de:
Que faire avec la validation faite dans un décollement de la tête
une solution sans création d'une branche temporaire.
Comment quitter ("fix") s'est détachée de la TÊTE de l'état quand vous déjà changé quelque chose dans ce mode et, éventuellement, voulez enregistrer vos modifications:
-
valider les modifications que vous souhaitez conserver. si vous voulez prendre en charge l'un des changements que vous avez fait dans detached HEAD state, commettez-les. Comme:
git commit -a -m "your commit message"
-
éliminez les changements que vous ne voulez pas garder. la réinitialisation dure rejettera tout changement non engagé que vous avez fait dans l'état de la tête détaché:
git reset --hard
(sans cela, l'étape 3 échouerait, se plaignant de fichiers modifiés non engagés dans la tête détachée.)
-
Vérifiez votre succursale. sortie état de la tête détaché en cochant la branche sur laquelle vous avez travaillé auparavant, par exemple:
git checkout master
-
prenez vos commits. vous pouvez maintenant reprendre les commits que vous avez faits en état de tête détaché par la cueillette de cerises, comme indiqué dans ma réponse à une autre question .
git reflog git cherry-pick <hash1> <hash2> <hash3> …
tête détachée:
- Vous n'êtes plus sur une branche,
- vous avez vérifié un seul commit dans l'histoire
si vous n'avez pas de changement: vous pouvez passer au maître en appliquant la commande suivante
git checkout master
si vous avez des changements que vous voulez garder:
dans le cas d'un HEAD, commit le travail comme d'habitude, sauf qu'aucune branche nommée n'est mise à jour. Pour obtenir la branche principale mise à jour avec vos changements engagés, faites une branche temporaire où vous êtes (de cette façon la branche temporaire aura tous les changements engagés que vous avez faits dans la tête détachée), puis passez à la branche principale et fusionnez la branche temporaire avec la branche principale.
git branch temp
git checkout master
git merge temp
voici ce que je viens de faire après avoir réalisé que j'étais sur une tête détachée et que j'avais déjà fait quelques changements.
j'ai engagé les changements.
$ git commit -m "..."
[detached HEAD 1fe56ad] ...
je me suis souvenu du hachage (1fe56ad) du commit. Puis j'ai vérifié la branche où j'aurais dû être.
$ git checkout master
Switched to branch 'master'
finalement j'ai appliqué les changements de commit à la branche.
$ git cherry-pick 1fe56ad
[master 0b05f1e] ...
je pense que c'est un peu plus facile que de créer un temporaire de la branche.
lorsque vous vérifiez un commit spécifique dans git
, vous vous retrouvez dans un État tête détachée ...c'est, de votre copie de travail ne reflète plus l'état d'un nom de référence (comme le "maître"). Ceci est utile pour examiner l'état passé du dépôt, mais pas ce que vous voulez si vous essayez réellement d'inverser les changements.
si vous avez apporté des modifications à un fichier particulier et que vous voulez simplement les éliminer, vous pouvez utiliser le checkout
commande comme ceci:
git checkout myfile
cela supprimera toute modification non engagée et ramènera le fichier dans l'état où il se trouve dans le chef de votre branche actuelle. Si vous voulez rejeter des changements que vous avez déjà commis, vous pouvez utiliser la commande reset
. Par exemple, cela va réinitialiser le dépôt dans l'état de la propagation précédente, en écartant toute modification ultérieure:
git reset --hard HEAD^
Cependant, si vous partagez le référentiel avec d'autres personnes, un git reset
peut être perturbateur (parce qu'il efface une partie de l'historique du dépôt). Si vous avez déjà partagé des changements avec d'autres personnes, vous voulez généralement regarder git revert
à la place, ce qui génère un "anticommit" -- c'est-à-dire qu'il crée un nouveau commit qui "annule" les changements en question.
Le Git Livre a plus de détails.
si vous avez fait quelques changements et puis réalisé que vous êtes sur une tête détachée, il ya une solution simple pour cela: stash - > checkout master - > stash pop:
git stash
git checkout master # Fix the detached head state
git stash pop # ... or for extra safety use 'stash apply' then later
# after fixing everything do 'stash drop'
vous aurez vos changements non engagés et votre tête normale "attachée", comme si rien ne s'était passé.
puisque " detached head state "vous a sur une branche temporaire, il suffit d'utiliser git checkout -
qui vous met sur la dernière branche que vous étiez sur.
Addendum
si la succursale à laquelle vous souhaitez retourner était la dernière caisse que vous avez faite, vous pouvez simplement utiliser checkout @{-1}
. Ceci vous ramènera à votre ancienne caisse.
en outre, vous pouvez alias cette commande avec, par exemple, git global --config alias.prev
de sorte que vous avez juste besoin de taper git prev
pour revenir à la caisse précédente.
pour clarifier davantage la réponse de @Philippe Gerber, la voici:
Avant cherry-pick
, un git checkout master
est nécessaire dans ce cas. En outre, il est seulement nécessaire avec un commit
dans detached head
.
git pull origin master
travaillait pour moi. Il s'agissait simplement de donner explicitement le nom de la télécommande et de la branche.
dans mon cas, j'exécute git status
et j'ai vu que j'avais quelques fichiers non tracés sur mon répertoire de travail.
j'ai juste eu à les nettoyer (puisque je n'en avais pas besoin) pour exécuter le rebase que je voulais exécuter.
vous pourriez avoir besoin de nettoyer votre branche d'abord à la caisse maître. -f force l'action.
git clean -f
alors vous pourrez vérifier votre branche de mât comme indiqué ci-dessus
git checkout master