Fermer

mai 25, 2021

Un guide pour annuler les erreurs avec Git (partie 2)


Erreurs. Ces méchants cruels ne s'arrêtent même pas au beau monde du développement logiciel. Mais bien que nous ne puissions pas éviter de faire des erreurs, nous pouvons apprendre à les défaire! Cet article présente les bons outils pour votre travail quotidien avec Git. Vous voudrez peut-être consulter également le premier article de la série .

Dans cette deuxième partie de notre série sur «Annuler les erreurs avec Git», nous allons bravement regarder à nouveau le danger dans les yeux: I 'ai préparé quatre nouveaux scénarios apocalyptiques – y compris, bien sûr, des moyens intelligents de sauver nos cous! Mais avant de plonger: jetez un œil aux articles précédents sur Git pour encore plus de méthodes d'auto-sauvetage qui vous aideront à réparer vos erreurs avec Git!

Allons-y!

Récupération d'un Branche supprimée à l'aide de Reflog

Avez-vous déjà supprimé une branche et, peu de temps après, réalisé que vous n'auriez pas dû? Dans le cas peu probable où vous ne connaissez pas ce sentiment, je peux vous dire que ce n’est pas un bon sentiment. Un mélange de tristesse et de colère vous envahit, pendant que vous pensez à tout le travail acharné qui a été consacré aux commits de cette branche, à tout le code précieux que vous avez maintenant perdu.

Heureusement, il existe un moyen de ramener cette branche from the dead – avec l'aide d'un outil Git nommé «Reflog». Nous avions utilisé cet outil dans la première partie de notre série mais voici un petit rappel: le Reflog est comme un journal où Git note chaque mouvement du pointeur HEAD dans votre référentiel local. En d'autres termes, moins ringards: à chaque fois que vous effectuez une vérification, une validation, une fusion, un rebase, une sélection cerise, etc., une entrée de journal est créée. Cela fait du Reflog un filet de sécurité parfait en cas de problème!

Prenons un exemple concret:

 $ git branch
* fonctionnalité / connexion
Maître

Nous pouvons voir que notre branche fonctionnalité / login est actuellement vérifiée. Disons que c'est la branche que nous allons supprimer (par inadvertance). Avant de pouvoir faire cela, cependant, nous devons changer de branche car nous ne pouvons pas supprimer notre branche HEAD actuelle!

 $ git checkout master
$ git branch -d fonctionnalité / connexion

Notre précieuse branche de fonctionnalités a maintenant disparu – et je vais vous donner une minute pour (a) comprendre la gravité de notre erreur et (b) pleurer un peu. Après avoir essuyé les larmes, nous devons trouver un moyen de ramener cette branche! Ouvrons le Reflog (simplement en tapant git reflog ) et voyons ce qu'il nous réserve:

 Les protocoles Reflog de Git toutes les actions majeures dans notre référentiel local
Les protocoles Reflog de Git toutes les actions majeures dans notre référentiel local. ( Grand aperçu )

Voici quelques commentaires pour vous aider à donner un sens à la sortie:

  • Tout d'abord, vous devez savoir que Reflog trie ses entrées par ordre chronologique: les éléments les plus récents sont à
  • L'élément le plus haut (et donc le plus récent) est la commande git checkout que nous avons exécutée avant de supprimer la branche. Il est enregistré ici dans le Reflog parce que c'est l'un de ces «mouvements du pointeur HEAD» que le Reflog enregistre si consciencieusement.
  • Pour réparer notre grave erreur, nous pouvons simplement revenir à l'état d'avant ce – qui est

Essayons donc ceci, en créant une nouvelle branche (avec le nom de notre branche "perdue") qui commence à cet état "avant" de hachage SHA-1:

 $ fonctionnalité de branche git / login 776f8ca

Et voilà! Vous serez ravi de voir que nous avons maintenant restauré notre branche apparemment perdue! 🎉

Si vous utilisez une interface graphique de bureau Git comme "Tower" vous pouvez prendre un raccourci intéressant: appuyez simplement sur CMD + Z sur votre clavier pour annuler la dernière commande – même si vous venez de supprimer violemment une branche!

Une interface graphique de bureau comme Tower peut faciliter le processus d'annulation des erreurs.

Déplacement d'un commit vers une branche différente

Dans beaucoup équipes, il y a un accord pour ne pas s'engager sur des branches de longue durée comme main ou develop : les branches comme celles-ci ne devraient recevoir de nouveaux commits que par le biais d'intégrations (par ex. rebase). Et pourtant, bien sûr, les erreurs sont inévitables: on oublie parfois et on s'engage sur ces branches quand même! Alors, comment pouvons-nous nettoyer le gâchis que nous avons fait?

 Déplacement d'un commit vers sa branche de destination correcte
Notre commit a atterri sur la mauvaise branche. Comment pouvons-nous le déplacer vers sa succursale de destination correcte? ( Grand aperçu )

Heureusement, ces types de problèmes peuvent être facilement corrigés. Retroussons nos manches et allons au travail.

La première étape consiste à passer à la bonne branche de destination, puis à déplacer le commit en utilisant la commande cherry-pick :

 $ git checkout feature / connexion
$ git cherry-pick 776f8caf

Vous aurez maintenant le commit sur la branche désirée, là où il aurait dû être en premier lieu. Génial!

Mais il reste une chose à faire: nous devons nettoyer la succursale où elle accidentellement a atterri au début! La commande cherry-pick pour ainsi dire, a créé une copie du commit – mais l'original est toujours présent sur notre branche de longue date:

 Une copie du commit sur la bonne branche, mais l'original est toujours montré sur la mauvaise branche
Nous avons réussi à créer une copie du commit sur la bonne branche, mais l'original est toujours là – sur la mauvaise branche. ( Grand aperçu )

Cela signifie que nous devons revenir à notre branche de longue date et utiliser git reset pour le supprimer:

 $ git checkout main
$ git reset --hard HEAD ~ 1

Comme vous pouvez le voir, nous utilisons ici la commande git reset pour effacer le commit défectueux. Le paramètre HEAD ~ 1 dit à Git de «remonter 1 révision derrière HEAD», effaçant effectivement le commit le plus élevé (et dans notre cas: indésirable) de l'historique de cette branche.

Et voilà: le commit est maintenant là où il aurait dû être en premier lieu et notre branche de longue date est propre – comme si notre erreur ne s'était jamais produite!

Modification du message d'un ancien commit

C'est tout trop facile de faire passer une faute de frappe dans un message de validation – et de ne le découvrir que beaucoup plus tard. Dans un tel cas, la bonne vieille option - amend de git commit ne peut pas être utilisée pour résoudre ce problème, car elle ne fonctionne que pour le tout dernier commit. Pour corriger tout commit plus ancien, nous devons recourir à un outil Git appelé "Interactive Rebase".

 Un message de commit qui vaut la peine d'être changé
Voici un message de commit qui mérite d'être changé. ( Grand aperçu )

Tout d'abord, nous devons indiquer à Interactive Rebase la partie de l'historique des commit que nous voulons éditer. Ceci est fait en lui donnant un hachage de commit: le commit parent de celui que nous voulons manipuler.

 $ git rebase -i 6bcf266b

Une fenêtre d'édition s'ouvrira alors. Il contient une liste de tous les commits après celui que nous avons fourni comme base pour la Rebase interactive dans la commande:

 Affichage de la plage de commits que nous avons sélectionnés pour l'édition dans notre session Interactive Rebase
Le gamme de commits que nous avons sélectionnés pour l'édition dans notre session Interactive Rebase. ( Grand aperçu )

Ici, il est important que vous ne ne suivez pas votre première impulsion: dans cette étape, nous ne modifions pas le message de validation , encore. Au lieu de cela, nous disons seulement à Git quel type de manipulation nous voulons faire avec quel (s) commit (s). Pour plus de commodité, une liste de mots clés d’action est indiquée dans les commentaires au bas de cette fenêtre. Dans notre cas, nous marquons la ligne n ° 1 avec reformulation (remplaçant ainsi le choix standard ).

Il ne reste plus qu'à enregistrer et fermer l'éditeur la fenêtre. En retour, une nouvelle fenêtre d'édition s'ouvrira contenant le message actuel du commit que nous avons balisé. Et maintenant est enfin le moment de faire nos modifications!

Voici tout le processus en un coup d'œil pour vous:

Utilisation d'Interactive Rebase pour éditer un ancien message de commit, du début à la fin. [19659051] Corriger un commit cassé (d'une manière très élégante)

Enfin, nous allons jeter un coup d'œil à fixup le couteau suisse des outils d'annulation. En termes simples, cela vous permet de réparer un commit cassé / incomplet / incorrect après coup. C’est vraiment un outil formidable pour deux raisons:

  1. Le problème n’a pas d’importance.
    Vous avez peut-être oublié d’ajouter un fichier, supprimé quelque chose, effectué une modification incorrecte ou simplement une faute de frappe. fixup fonctionne dans toutes ces situations!
  2. Il est extrêmement élégant.
    Notre réaction normale et instinctive à un bogue dans un commit est de produire un nouveau commit qui résout le problème. Cette façon de travailler, aussi intuitive que cela puisse paraître, donne à votre historique de commit un aspect très chaotique, très bientôt. Vous avez des commits «originaux» puis ces petits commits «pansement» qui corrigent les problèmes qui se sont produits dans les commits originaux. Votre historique est jonché de petits commits sans signification, ce qui rend difficile la compréhension de ce qui s'est passé dans votre base de code.
 L'historique de vos commits peut être très difficile à lire si vous corrigez constamment de petites erreurs avec des commits soi-disant.
Corriger constamment de petites erreurs avec des «commits de pansement» rend votre historique de commits très difficile à lire. ( Grand aperçu )

C'est ici qu'intervient la correction . Cela vous permet de continuer à faire ce correctif de pansement. Mais voici la magie: il l'applique ensuite au commit original cassé (en le réparant de cette façon), puis rejette complètement le commit de bande-aide laide!

 Fixup applique vos corrections au commit original, puis supprime le superflu. commit band-aid
Fixup applique vos corrections au commit original et supprime ensuite le commit band-aid superflu. ( Grand aperçu )

Nous pouvons passer par un exemple pratique ensemble! Disons que le commit sélectionné ici est rompu.

 Correction du commit incorrect sélectionné de manière élégante
Le commit sélectionné est incorrect – et nous allons le corriger de manière élégante. ( Grand aperçu )

Disons aussi que j'ai préparé des modifications dans un fichier nommé error.html qui résoudra le problème. Voici la première étape à effectuer:

 $ git add error.html
$ git commit --fixup 2b504bee

Nous créons un nouveau commit, mais nous disons à Git que c'est spécial: c'est un correctif pour un ancien commit avec le hachage SHA-1 spécifié ( 2b504bee dans ce cas).

La deuxième étape, maintenant, est de démarrer une session Interactive Rebase – parce que fixup appartient au grand ensemble d'outils d'Interactive Rebase.

 $ git rebase -i --autosquash 0023cddd

Deux choses méritent d'être expliquées à propos de cette commande. Premièrement, pourquoi ai-je fourni 0023cddd comme hachage de révision ici? Parce que nous devons démarrer notre session Interactive Rebase au commit parent de notre camarade cassé.

Deuxièmement, à quoi sert l'option - autosquash ? Cela nous enlève beaucoup de travail! Dans la fenêtre de l'éditeur qui s'ouvre maintenant, tout est déjà préparé pour nous:

 La fenêtre de session Interactive Rebase
La fenêtre de session Interactive Rebase ( Grand aperçu )

Merci au --autosquash Git a déjà fait le gros du travail pour nous:

  1. Il a marqué notre petit engagement de pansement avec le mot-clé d'action fixup . De cette façon, Git le combinera avec le commit directement ci-dessus puis le rejettera.
  2. Il a également réorganisé les lignes en conséquence, déplaçant notre commit de pansement directement sous le commit que nous voulons corriger (encore une fois: fixup fonctionne en combinant le commit balisé avec celui ci-dessus !).

En bref: il n'y a rien à faire pour nous mais fermer la fenêtre!

Prenons un dernier regard sur le résultat final.

  • L'ancien commit cassé est corrigé: il contient maintenant les changements que nous avons préparés dans notre commit de pansement.
  • Le commit de pansement lui-même a été abandonné: l'historique du commit est propre et facile à lire – comme si aucune erreur ne s'était produite.
 Un exemple de ce à quoi ressemble un historique de commit propre
Le résultat final après avoir utilisé l'outil de correction: un historique de commit propre! ( Grand aperçu )

Savoir comment annuler des erreurs est une superpuissance

Félicitations! Vous êtes maintenant en mesure de sauver votre cou dans de nombreuses situations difficiles! Nous ne pouvons pas vraiment éviter ces situations: peu importe notre expérience en tant que développeurs, les erreurs font simplement partie du travail. Mais maintenant que vous savez comment y faire face, vous pouvez y faire face avec un rythme cardiaque décontracté. 💚

Si vous voulez en savoir plus sur la correction des erreurs avec Git, je peux vous recommander le « First Aid Kit for Git », une série de courtes vidéos sur exactement ce sujet.

Amusez-vous bien. faire des erreurs – et, bien sûr, les défaire facilement!

 Smashing Editorial "width =" 35 "height =" 46 "loading =" lazy "decoding =" async (vf, il)




Source link