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?

1024
git
demandé sur Peter Mortensen 2012-04-19 17:07:05

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

  1. 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.
  2. Exécuter git checkout master
  3. Exécuter git branch tmp <commit-hash> . Cela enregistrera vos modifications dans une nouvelle branche appelée tmp .
  4. si vous voulez incorporer les changements que vous avez apportés dans master , Lancez git merge tmp de la branche master . Vous devriez être sur la branche master après avoir lancé git checkout master .
1483
répondu ralphtheninja 2018-04-24 07:06:46

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

382
répondu Toni Gamez 2017-05-23 10:31:36

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:

  1. 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"
    
  2. é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.)

  3. 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
    
  4. 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> …
    
117
répondu tanius 2018-09-18 22:32:23

tête détachée:

  1. Vous n'êtes plus sur une branche,
  2. 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
97
répondu Razan Paul 2018-08-20 15:14:33

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.

50
répondu Philippe Gerber 2014-08-02 23:33:49

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.

39
répondu larsks 2012-04-19 13:32:18

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é.

38
répondu mojuba 2016-05-17 22:31:55

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.

16
répondu Mike 2016-10-06 21:35:51

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.

5
répondu David Brower 2016-06-22 23:12:42

pour clarifier davantage la réponse de @Philippe Gerber, la voici:

git cherry-pick

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 .

4
répondu Timo 2017-12-06 13:39:17
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.

0
répondu Amjedonline 2014-05-14 14:14:25

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.

0
répondu falsarella 2015-06-19 17:51:36

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
0
répondu Sweet Chilly Philly 2017-09-07 00:34:35