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?
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 ^).
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.
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.git checkout master
git branch tmp <commit-hash>
. Cela enregistrera vos modifications dans une nouvelle branche appelée tmp
.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
.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:
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:
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"
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.)
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
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> …
Tête isolée signifie:
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
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.
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é.
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.
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.
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.
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.
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>
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}
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
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.
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.