3 votes

Comment concilier tête détachée et origine/maître ? J'ai déjà extrait l'ancien hash

Intro et recherche

Je pense donc avoir commis une grave erreur et je suis inquiet. J'ai parcouru les forums à la recherche de têtes détachées et j'ai failli trouver une réponse, mais les scénarios sont trop spécifiques et ne s'appliquent pas à ma situation actuelle. Si vous trouvez un fil de discussion spécifique qui répond à ma question, veuillez m'en faire part.

Par exemple : Comment puis-je concilier HEAD détaché et maître/origine ?

Le gars a déjà fait git rebase -i ce que je n'ai pas fait. J'ai essayé de rebaser, mais cela n'a pas résolu mon problème.

Petit historique :

  • Je suis nouveau dans git ; j'utilise git uniquement par moi-même
  • Je possède le référentiel distant
  • J'avais besoin d'un ancien code, et c'était une question de temps.
  • J'ai appris un peu de programmation et je l'utilise sur mon lieu de travail où personne ne code (je ne peux donc pas vraiment demander de l'aide).

Question :

Pour accéder à l'ancien commit avec du code fonctionnel, j'ai fait (probablement la mauvaise chose) :

git log
git checkout <hash-of-desired-old-commit>

J'ai procédé à la finition du code. Dieu merci pour le contrôle de version ! Mais bon sang, pourquoi git est-il si compliqué ? Comment puis-je sauvegarder ce travail ? Je suis maintenant dans une tête détachée. Origin/Master est dans des commits futurs qui devraient de préférence tous être supprimés.

Ce que j'ai essayé :

Pregunta : Comment réconcilier ma tête détachée avec l'origine/maître ? Une fois réconcilié, dois-je git push --force ou autre (notamment avec le --force drapeau) ? Il y a du travail à cette tête détachée, et j'ai lu que plus j'attends, le garbage collection peut venir manger ma branche perdue. Désolé, je n'ai pas de formation formelle en git... Je suis presque prêt à vérifier le master d'origine et à réécrire le code.

Merci d'avance.

3voto

poke Points 64398

Si vous êtes sur un HEAD détaché et que vous voulez sauvegarder l'état actuel de ce HEAD, il suffit de créer une branche :

git branch save-this-head

Maintenant, vous avez une branche qui pointe vers ce HEAD détaché exact, donc vous pouvez le vérifier en toute sécurité sans perdre de choses :

git checkout save-this-head

Et maintenant, vous n'êtes plus dans un état d'HEAD détaché. Vous et vos modifications sont en sécurité ! Si vous avez des changements en attente, vous devriez les livrer maintenant, afin que nous puissions circuler librement.

Ensuite, vous pouvez simplement rebaser cette nouvelle branche sur quelque chose d'autre, par exemple la branche master :

git rebase master

Cela devrait rejouer les commits manquants sur master par dessus. Ainsi, les changements effectués depuis le HEAD détaché seront récupérés.

Si vous voulez plutôt rester sur ce save-this-head et jeter le maître précédent, vous pouvez simplement sortir le maître et le remettre à l'état d'épargne :

git checkout master
git reset --hard save-this-head

Cela rendra master équivalent à save-this-head en rejetant toutes les autres modifications sur master . Si vous voulez pousser ce fichier, vous devrez probablement forcer le push then afin de supprimer les commits du remote.


J'ai lu que plus j'attends, le ramassage des ordures peut venir manger ma branche perdue.

Tout d'abord, tant que vous restez dans cet état, le pointeur HEAD continuera à regarder cet objet commit (c'est pourquoi il est appelé "HEAD détaché" en premier lieu). Cela empêchera toute collecte d'ordures de supprimer cet objet commit (et tous ses parents).

Même si vous avez accidentellement quitté l'état HEAD détaché, faire le commit auquel vous vous référiez un "dangling" commettre, Git conservera les objets pendant plusieurs semaines avant même d'envisager de permettre le ramassage de l'objet. Et ce n'est pas parce qu'il est soumis au garbage collection que le GC sera effectivement exécuté, surtout si vous n'interagissez pas avec le dépôt.


À l'avenir, si vous souhaitez revenir à un commit dans votre historique et vous attendre à ce que faire quelque chose (autre que juste regarder), vous devriez juste créer une branche. Même si ce n'est que temporaire, cela vous permettra de vous déplacer plus librement et vous ne serez pas découragé de faire quoi que ce soit par cet état d'HEAD détaché :

git checkout -b fix-something <some-old-hash>

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