web-dev-qa-db-fra.com

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

Je travaillais dans mon référentiel et j'ai remarqué qu'un fichier contenait des modifications locales. Je n'en voulais plus, alors j'ai supprimé le fichier, pensant pouvoir en extraire une nouvelle copie. Je voulais faire l'équivalent Git de

svn up .

Utiliser git pull n'a pas semblé fonctionner. Certaines recherches aléatoires m'ont 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?

1126
Daniel

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

Si vous souhaitez supprimer vos modifications associées au HEAD détaché

Vous devez uniquement vérifier la branche sur laquelle vous vous trouviez, par exemple. 

git checkout master

La prochaine fois que vous aurez modifié un fichier et que vous souhaitez le restaurer dans l'état où il se trouve dans l'index, ne supprimez pas le fichier au préalable, mais simplement

git checkout -- path/to/foo

Cela restaurera le fichier foo dans l'état où il se trouve dans l'index. 

Si vous voulez conservez vos modifications associées au HEAD détaché

  1. Exécutez git log -n 1; ceci affichera le commit le plus récent sur la HEAD détachée. Copiez et collez le hachage de validation.
  2. Exécuter git checkout master
  3. Exécutez git branch tmp <commit-hash>. Cela enregistrera vos modifications dans une nouvelle branche appelée tmp.
  4. Si vous souhaitez incorporer les modifications apportées à master, exécutez git merge tmp à partir de la branche master. Vous devriez être sur la branche master après avoir exécuté git checkout master.
1647
ralphtheninja

Si vous avez modifié des fichiers que vous ne voulez pas perdre, vous pouvez les envoyer. Je les ai engagés en mode détaché et vous pouvez ensuite passer à une branche temporaire pour une intégration ultérieure 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

410
Toni Gamez

Une solution sans créer de branche temporaire.

Comment quitter («réparer») détaché HEAD état lorsque vous avez déjà modifié quelque chose dans ce mode et, éventuellement, enregistrer vos modifications:

  1. Valider les modifications que vous souhaitez conserver. Si vous souhaitez reprendre les modifications que vous avez apportées dans détaché HEAD état, validez-les. Comme:

    git commit -a -m "your commit message"
    
  2. Ignore 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 en mode détaché HEAD état:

    git reset --hard
    

    (Sans cela, l'étape 3 échouerait en se plaignant de fichiers non engagés modifiés dans la HEAD détachée.)

  3. Vérifiez votre succursale. Sortie détachée HEAD indiquez en vérifiant la branche sur laquelle vous avez travaillé précédemment, par exemple:

    git checkout master
    
  4. Reprends tes commits. Vous pouvez maintenant prendre en charge les commits que vous avez faits en détaché HEAD - énoncez en cherchant, comme indiqué dans ma réponse à une autre question .

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

Tête isolée signifie:

  1. Vous n'êtes plus sur une branche,
  2. Vous avez extrait un seul commit dans l'historique

Si vous n'avez aucune modification: vous pouvez passer en maître en appliquant la commande suivante

  git checkout master

Si vous souhaitez conserver des modifications:

Dans le cas d'une HEAD détachée, les commandes sont comme d'habitude, sauf qu'aucune branche nommée n'est mise à jour. Pour que la branche principale soit mise à jour avec vos modifications validées, créez une branche temporaire à votre emplacement le maître.

git branch  temp
git checkout master
git merge temp
108
Razan Paul

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à apporté des modifications.

J'ai commis les changements.

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

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

$ git checkout master
Switched to branch 'master'

Enfin, j'ai appliqué les modifications du commit à la branche.

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

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

52
Philippe Gerber

Si vous avez apporté des modifications 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 engagés et votre HEAD "attaché" normal, comme si rien ne s'était passé.

41
mojuba

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

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

git checkout myfile

Cela annulera toutes les modifications non validées et rétablira le fichier dans l'état où il se trouve dans la tête de votre branche actuelle. Si vous souhaitez ignorer les modifications que vous avez déjà validées, vous pouvez utiliser la commande reset. Par exemple, cela réinitialisera le référentiel à l'état de la validation précédente, en ignorant les modifications ultérieures:

git reset --hard HEAD^

Cependant, si vous partagez le référentiel avec d'autres personnes, un git reset peut être perturbateur (car il efface une partie de l'historique du référentiel). Si vous avez déjà partagé les modifications avec d'autres personnes, vous souhaiterez généralement plutôt utiliser git revert, qui génère un "anticommit", autrement dit, il crée un nouveau commit qui "annule" les modifications en question.

Le livre Git a plus de détails.

40
larsks

Puisque "l'état détaché de la tête" vous a sur une branche temporaire, utilisez simplement git checkout - qui vous place sur la dernière branche sur laquelle vous vous trouviez.

17
Mike

Addenda

Si la succursale à laquelle vous souhaitez retourner était la dernière commande effectuée, vous pouvez simplement utiliser checkout @{-1}. Cela vous ramènera à votre caisse précédente. 

De plus, vous pouvez aliaser cette commande avec, par exemple, git global --config alias.prev. Il vous suffit donc de saisir git prev pour revenir à la commande précédente.

5
David Brower

Pour préciser la réponse de @Philippe Gerber, la voici:

 git cherry-pick

Avant cherry-pick, un git checkout master est nécessaire dans ce cas. De plus, il n’est nécessaire qu’avec une commit dans detached head.

5
Timo

Dans mon cas, j'ai lancé git status et j'ai vu que j'avais quelques fichiers non suivis dans mon répertoire de travail.

Je devais juste les nettoyer (car je n'en avais pas besoin) pour exécuter la rebase que je voulais effectuer.

0
falsarella

Git m'a dit comment faire.

si vous avez tapé: 

git checkout <some-commit_number>

Enregistrer le statut

git add .
git commit -m "some message"

Ensuite:

 git Push Origin HEAD:<name-of-remote-branch>
0
Sterling Diaz

Etre en "tête détachée" signifie que HEAD fait référence à un commit spécifique sans nom (opposé à une branche nommée) (cf: https://git-scm.com/docs/git-checkout section Tête détachée)

Pour résoudre le problème, il vous suffit de sélectionner la branche précédemment sélectionnée par 

git checkout @{-1}

0
Pat. ANDRIA

Je voulais garder mes modifications, alors je viens de résoudre ce problème en le faisant ...

git add .
git commit -m "Title" -m "Description"
(so i have a commit now example: 123abc)
git checkout YOURCURRENTBRANCH
git merge 123abc
git Push TOYOURCURRENTBRANCH

ça marche pour moi

0
CRLZXO

Lorsque vous êtes dans une situation de tête détachée et que vous créez de nouveaux fichiers, assurez-vous d’abord que ces nouveaux fichiers sont ajoutés à l’index, par exemple avec:

git add .

Mais si vous avez seulement modifié ou supprimé des fichiers existants, vous pouvez ajouter (-a) et valider avec un message (-m) en même temps via:

git commit -a -m "my adjustment message"

Ensuite, vous pouvez simplement créer une nouvelle branche avec votre état actuel avec:

git checkout -b new_branch_name

Vous aurez une nouvelle branche et tous vos ajustements seront là dans cette nouvelle branche. Vous pouvez ensuite continuer à appuyer sur la télécommande et/ou à la caisse/tirer/fusionner à votre guise.

0
DZet
git pull Origin master

a travaillé pour moi. Il s’agissait simplement de donner explicitement le nom de la télécommande et de la branche.

0
Amjedonline