183 votes

Qu'advient-il des commits git créés dans un état HEAD détaché?

C'est ce qui s'est passé:

J'ai une branche A. Sur la branche, l'IA a apporté de nombreuses modifications. Je n'étais pas satisfait du code, j'ai donc vérifié le commit précédent dans la branche A. J'ai ensuite effectué de nombreuses modifications et les ai validées dans la branche A. Désormais, je ne peux trouver ce commit nulle part. Ai-je perdu ce code?

256voto

Dietrich Epp Points 72865

L'ancien commit est toujours dans le reflog.

 git reflog
 

Cela affichera une liste de commits, et le "perdu" devrait être dedans. Vous pouvez en faire une nouvelle branche. Par exemple, si le SHA-1 est ba5a739, vous pouvez créer une nouvelle branche nommée "new-branch" à l'ancien commit avec:

 git branch new-branch ba5a739
 

Notez que les commits "perdus" seront supprimés lors de l'élagage de la base de données.

93voto

tanius Points 349

Vos commits sont encore disponibles dans le reflog, comme le soulignait déjà. En plus des autres réponses, ici, c'est une façon de prendre en charge le détaché de la TÊTE s'engage dans votre branche directement, sans la création et la fusion d'une nouvelle branche:

  1. Regarder le SHA-1 hash du changements que vous avez apportés dans décollement de la TÊTE de l'état avec

    git reflog
    
  2. Ensuite, exécutez, avec tous les commettre des hachages commandé à partir de la plus ancienne à la plus récente:

    git cherry-pick <hash1> <hash2> <hash3> ...
    

    Par exemple, si j'avais un seul, dans le "les 7 premiers caractères" court de hachage format:

    git cherry-pick a21d053
    

Cela va créer un nouveau commit de votre branche courante (un par détachées-TÊTE-s'engager à ce que vous mentionnez dans la commande). Il se charge également de l'origine des messages de commit.

16voto

sergtk Points 3109

Vous pouvez trouver des commits perdus avec la commande suivante:

 git fsck --lost-found
 

Notez que si votre tête est en cours de validation, elle n'est pas répertoriée comme perdue.

Vous trouverez plus d’informations sur la page de manuel git-fsck (1)

Ensuite, vous pouvez créer une branche sur ce commit perdu:

 git branch new-branch ba5a739
 

11voto

Greg Bacon Points 50449

Git le langage de l'état de votre répertoire de travail est un “détaché de la TÊTE.” Voici un autre endroit, git reflog rend le sauver.

$ git reflog
0b40dd6 TÊTE de@{0}: engagez à: mon commit détaché de la TÊTE
...

Si j'essaie d'en commander une autre branche, git-1.7.5.1 donne une suggestion utile.

$ git checkout master
Avertissement: vous êtes en laissant 1 s'engager derrière, pas connecté à
l'un de vos branches:

 0b40dd6 mon commit détaché de la TÊTE

Si vous voulez les garder par la création d'une nouvelle branche, cela peut être un bon moment
de le faire avec:

 git branch new_branch_name 0b40dd65c06bb215327863c2ca10fdb4f904215b

Passé à la branche "master"

9voto

Greg Hewgill Points 356191

Vous ne l'avez pas perdue, Git en conserve toujours une copie (mais elle est actuellement inaccessible par tout responsable de succursale). Vous pouvez trouver votre commit manquant en utilisant la commande git reflog . Le reflog conserve la trace des positions historiques d’une tête de branche, et vous pouvez l’utiliser pour trouver des éléments que la tête de branche pointait précédemment.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X