Question Fixer une tête détachée Git?


Je travaillais dans mon référentiel et j'ai remarqué qu'un fichier avait des modifications locales. Je ne les voulais plus, j'ai donc supprimé le fichier, pensant que je pouvais simplement en extraire une nouvelle copie. Je voulais faire l'équivalent git de

svn up .

En utilisant git pull n'a pas l'air de marcher. Une recherche aléatoire m'a conduit à 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 annuler?


982
2018-04-19 13:07


origine


Réponses:


La tête détachée signifie que vous n'êtes plus sur une branche, vous avez extrait un seul commit dans l'historique (dans ce cas, le commit précédent à HEAD, c'est-à-dire HEAD ^).

Si tu veux effacer vos changements associés à la tête détachée

Vous avez seulement besoin de vérifier la succursale sur laquelle vous étiez, par ex.

git checkout master

La prochaine fois que vous avez changé un fichier et que vous voulez le restaurer à l'état où il se trouve dans l'index, ne supprimez pas le fichier en premier.

git checkout -- path/to/foo

Cela restaurera le fichier foo à l'état dans lequel il se trouve dans l'index.

Si tu veux garder vos changements associés à la tête détachée

  1. Courir git log -n 1; ceci affichera le commit le plus récent sur le HEAD détaché. Copiez et collez le hachage de validation.
  2. Courir git checkout master
  3. Courir git branch tmp <commit-hash>. Cela permettra d'enregistrer vos modifications dans une nouvelle branche appelée tmp.
  4. Si vous souhaitez intégrer les modifications que vous avez apportées master, courir git merge tmp du master branche. Vous devriez être sur le master branche après la course git checkout master.

1406
2018-04-19 13:32



Si vous avez modifié des fichiers que vous ne voulez pas perdre, vous pouvez les 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 le maître.

git commit -m "....."
git branch my-temporary-work
git checkout master
git merge my-temporary-work

Extrait de:

Que faire avec commit fait dans une tête détachée


368
2017-12-09 20:05



Comment quitter ("fix") l'état de la tête détachée quand vous avez déjà changé quelque chose dans ce mode et, en option, souhaitez enregistrer vos modifications.

Cette solution fonctionne sans créer de branche temporaire.

  1. Commettez les changements que vous voulez garder. Si vous voulez prendre en charge l'un des changements que vous avez effectués dans l'état HEAD détaché, validez-les. Comme:

    git commit -a -m "your commit message"
    
  2. Supprimer les modifications que vous ne souhaitez pas conserver La réinitialisation matérielle annulera toutes les modifications non validées que vous avez effectuées dans l'état HEAD détaché:

    git reset --hard
    

    (Sans cela, l'étape 3 échouerait, se plaignant des fichiers modifiés non validés dans le HEAD détaché.)

  3. Découvrez votre succursale. Quittez l'état HEAD détaché en cochant la branche sur laquelle vous avez travaillé auparavant, par exemple:

    git checkout master
    
  4. Prenez en charge vos commits. Vous pouvez maintenant prendre en charge les validations que vous avez effectuées dans l'état TÊTE détachée en sélectionnant les cerises, comme indiqué dans ma réponse à une autre question.

    git reflog
    git cherry-pick <hash1> <hash2> <hash3> …
    

105
2018-06-11 13:23



Tête détachée signifie:  (1) Vous n'êtes plus sur une branche,  (2) Vous avez extrait un seul commit dans l'historique

si vous n'avez aucun changement: vous pouvez passer au maître en appliquant la commande suivante

  git checkout master

si vous avez des modifications que vous souhaitez conserver: 

En cas de détachement HEAD, commet le travail comme d'habitude, sauf qu'aucune branche nommée n'est mise à jour. Pour mettre à jour la branche principale avec vos changements validés, créez une branche temporaire où vous êtes (de cette façon, la branche temporaire aura toutes les modifications validées que vous avez faites dans la HEAD détachée), puis passez à la branche master et fusionnez la branche temporaire avec le master.

git branch  temp
git checkout master
git merge temp

87
2017-08-29 00:39



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 commis les changements.

$ git commit -m "..."
[detached HEAD 1fe56ad] ...

Je me suis souvenu du hash (1fe56ad) du commit. Puis j'ai vérifié la branche que j'aurais dû être.

$ git checkout master
Switched to branch 'master'

Enfin, j'ai appliqué les changements de la validation à la branche.

$ git cherry-pick 1fe56ad
[master 0b05f1e] ...

Je pense que c'est un peu plus facile que de créer une branche temporaire.


49
2017-08-02 23:33



Lorsque vous extrayez un commit spécifique dans git, vous vous retrouvez dans un tête détachée state ... c'est-à-dire que votre copie de travail ne reflète plus l'état d'une référence nommée (comme "master"). Ceci est utile pour examiner l'état passé du référentiel, mais pas ce que vous voulez si vous essayez réellement de rétablir les modifications.

Si vous avez apporté des modifications à un fichier particulier et que vous voulez simplement les supprimer, vous pouvez utiliser le checkout commande comme ceci:

git checkout myfile

Cela supprimera toutes les modifications non validées et rétablira le fichier à l'état qu'il a dans la tête de votre branche actuelle. Si vous souhaitez annuler les modifications que vous avez déjà effectuées, vous pouvez utiliser le reset commander. Par exemple, cela réinitialisera le référentiel à l'état de la validation précédente, en supprimant les modifications suivantes:

git reset --hard HEAD^

Cependant, si vous partagez le référentiel avec d'autres personnes, git reset peut être perturbateur (car 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 au lieu de cela, qui génère un "anticommit" - c'est-à-dire, il crée un nouvel engagement qui "défait" les changements en question.

Le livre de Git a plus de détails.


39
2018-04-19 13:32



Si vous avez fait quelques changements et que vous vous êtes rendu compte que vous êtes sur une tête détachée, il existe une solution simple: 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 motivés et la tête "attachée" normale, comme si rien ne s'est passé.


37
2018-01-01 22:40



Depuis "état de tête détaché" vous avez sur une branche de temp, utilisez simplement git checkout - ce qui vous met sur la dernière branche sur laquelle vous étiez.


14
2017-11-20 19:30