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

C’est ce qui s’est passé:

J’ai une twig A. Sur la twig, AI a effectué un tas de modifications. Je n’étais pas satisfait du code, alors j’ai vérifié le commit précédent dans la twig A. J’ai ensuite fait beaucoup de changements et je les ai validés sur la twig A. Maintenant, je ne trouve pas ce commit quelque part. Ai-je perdu ce code?

L’ancien commit est toujours dans le reflog.

 git reflog 

Cela affichera une liste de commits, et le commit “perdu” devrait y figurer. Vous pouvez en faire une nouvelle twig. Par exemple, si le SHA-1 est ba5a739, vous pouvez créer une nouvelle twig nommée “new-branch” à l’ancien commit avec:

 git branch new-branch ba5a739 

Notez que les commits “perdus” seront supprimés lorsque la firebase database est élaguée.

Vos commits sont toujours disponibles dans le reflog, comme déjà souligné. En plus des autres réponses, voici un moyen de reprendre directement les validations HEAD détachées dans votre twig actuelle, sans créer ni fusionner une nouvelle twig:

  1. Recherchez les hachages SHA-1 des commits que vous avez effectués dans l’état HEAD détaché avec

     git reflog 
  2. Ensuite, exécutez, avec tous les hachages de validation ordonnés du plus ancien au plus récent:

     git cherry-pick    ... 

    Par exemple si je n’en avais qu’un, donné dans le format de hachage court “7 premiers caractères”:

     git cherry-pick a21d053 

Cela créera de nouveaux commits sur votre twig actuelle, un commit par hash détaché HEAD-détaché que vous avez mentionné dans la commande. Il reprend également les messages de validation originaux.

Vous pouvez trouver des commits perdus (pendants) avec la commande suivante:

 git fsck --lost-found 

Notez que si votre tête actuelle est en attente de validation, elle n’est pas répertoriée comme étant perdue.

Vous pouvez trouver plus d’informations sur git-fsck (1) Manual Page

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

 git branch new-branch ba5a739 

Vous ne l’avez pas perdu, Git garde toujours une copie (mais il est actuellement inaccessible par n’importe quel responsable). Vous pouvez trouver votre commit manquant à l’aide de la commande git reflog . Le reflog garde la trace des positions historiques d’une tête de twig et vous pouvez l’utiliser pour trouver des objects pointés par la tête de twig.

Git parlance pour l’état de votre répertoire de travail est un « HEAD détaché ». Voici un autre endroit où git reflog fait la sauvegarde.

 $ git reflog 0b40dd6 HEAD@{0}: commit: my commit on detached HEAD ... 

Si j’essaie de vérifier une twig différente, git-1.7.5.1 donne une suggestion utile.

  $ git checkout master
 Attention: vous laissez 1 commit derrière, pas connecté à
 l'une de vos twigs:

   0b40dd6 mon commit sur HEAD détaché

 Si vous souhaitez les conserver en créant une nouvelle twig, cela peut être un bon moment
 le faire avec:

  git branch new_branch_name 0b40dd65c06bb215327863c2ca10fdb4f904215b

 Passé à la twig 'master' 

Suivez ces étapes pour relier votre tête détachée à repo git

  1. git checkout "your branch with path but without remote name"

Par exemple, si le nom distant est l’origine et le nom de la twig est bugfix/somebranch alors utilisez git checkout bugfix/somebranch

  1. git reflog récupère les commit SHA listés dans votre liste de commit de twig détachée.

  2. git cherry-pick "commit hash1" "commit hash2" "commit hash3"

  3. git push

ALL SET !!

Dans Sourcetree, j’ai constaté que git reflog ne fonctionnait pas, alors j’ai compris comment le faire en utilisant l’interface graphique.

Tout d’abord, essayez de trouver la validation “perdue” en recherchant un message dans l’historique des commandes (vue: Afficher la sortie de la commande). Avec un peu de chance, vous serez dans la commande “Switching Branch” après le commit que vous avez perdu et vous verrez le commentaire de validation avec un ID de validation 1234567.

Prenez cet ID de validation à l’étape suivante.

Cliquez sur le bouton “Branche” dans la barre d’outils supérieure et vous devriez avoir une boîte de dialog “Nouvelle twig” où vous pouvez spécifier un certain commit. Mettez cet ID de validation à cet endroit, spécifiez un nouveau nom de twig, cliquez sur Créer une twig et vous devriez obtenir une nouvelle twig avec votre engagement perdu!

Cela m’a rapporté du travail perdu pour moi!