cursus
Git Revert Merge Commit : Un guide avec des exemples
Nous pouvons compromettre une application en fusionnant du code problématique, que ce soit en intégrant accidentellement un travail inachevé dans la branche principale ou en négligeant un bogue critique qui a échappé aux tests automatisés.
Dans cet article, je vais vous guider à travers le processus d'utilisation de git revert
pour annuler une fusion en toute sécurité, en veillant à ce que l'historique des livraisons reste intact et que l'intégrité du projet soit préservée.
Devenez ingénieur en données
Comment git revert
Travaux
Nous pouvons considérer git revert
comme la version Git de la commande undo. Cependant, la commande git revert
ne supprime pas les commits et ne permet pas de revenir à un état antérieur de la branche. Au lieu de cela, il crée un nouveau commit qui annule les modifications d'un commit spécifique.
La syntaxe pour revenir sur un commit avec le hash est la suivante :
git revert <commit_hash>
Nous pouvons lister les commits avec leurs identifiants de hachage à l'aide de la commande git log
. La sortie de git log
liste les commits du plus récent au plus ancien, comme suit :
Par exemple, pour annuler le commit qui implémente la fonction de soustraction, nous utiliserons la commande :
git revert 7ba24a3e62d4d37182428ccfaa070baa222b1151
En utilisant git revert
, nous pouvons annuler les changements d'un commit spécifique sans affecter l'historique du commit.
Notez que git revert
n'est pas magique et qu'en fonction de l'historique des livraisons, il peut en résulter un conflit qui doit être résolu manuellement.
Avantages de la git revert
Plus de changements manuels
Pourquoi git revert
est-il utile si nous devons résoudre un conflit manuellement ? Ne serait-il pas plus simple d'annuler manuellement les modifications ? Voyons ses avantages :
- Préservation de l'historique :
git revert
crée un nouveau commit qui annule les modifications d'un commit spécifié tout en préservant l'ensemble de l'historique du commit. Cela permet de conserver un historique transparent des modifications et des annulations. - Inversion atomique : Il garantit que les inversions sont atomiques et cohérentes. Lorsque nous supprimons et validons manuellement des modifications, il y a un risque d'erreur humaine.
- Sensibilisation aux conflits : Il garantit que nous sommes alertés par les conflits s'il y a des intégrations ou des changements qui dépendent de la livraison originale. Cela peut sembler peu pratique, mais cela permet d'éviter des effets secondaires involontaires.
- Métadonnées : Le nouveau commit créé par git revert inclut des métadonnées et un message de commit qui décrit contextuellement ce qui a été annulé, aidant ainsi à la compréhension future. Sans
git revert
, ce contexte pourrait être perdu.
Annulation d'une fusion dans différents scénarios
Dans cette section, nous verrons comment annuler une fusion. Pour les besoins de l'exemple, nous supposons que nous fusionnons une branche nommée feature
dans la branche main
en exécutant la commande à partir de la branche main
:
git merge feature
Ce que nous apprenons ici peut être appliqué à deux branches quelconques en remplaçant les noms de manière appropriée.
Annulation d'une fusion qui n'est pas associée à un commit
La commande git merge
ne crée pas toujours un nouveau commit. Un commit n'est créé que si la branche main
a divergé de la branche feature
. Parce que git revert
nécessite un commit pour fonctionner, nous ne pouvons pas l'utiliser dans ce cas.
Les branches main
et feature
divergent lorsque de nouveaux commits sont créés sur main
qui ne sont pas des ancêtres de la branche feature
. En d'autres termes, de nouveaux commits ont été créés sur main
après la création de feature
.
Si les branches n'ont pas divergé, lorsque nous lançons la commande git merge feature
sur la branche principale, Git utilisera l'avance rapide pour fusionner. Cela signifie qu'il déplace le site HEAD
de la branche main
vers le site HEAD
de la branche feature
.
Nous pouvons observer que cela s'est produit en regardant le résultat de git merge
:
Pour annuler une telle fusion, il suffit de remettre le site HEAD
de la branche main
à l'endroit où il se trouvait. Pour cela, nous :
- Identifiez le site
HEAD
précédent à l'aide de la fonctiongit reflog
- Réinitialisez le site
HEAD
en utilisantgit reset --hard
, en remplaçantpar le site
HEAD
.
La sortie de git reflog
ressemblera à ceci :
Nous pouvons identifier le précédent HEAD
en regardant la ligne qui dit "checkout : moving from feature to main" (il écrit feature
et main
parce que ce sont les noms de nos branches).
Dans ce cas, la tête précédente est fe59838
. Pour déplacer le site HEAD
de la branche principale vers celle-ci et annuler la fusion, nous utilisons la commande suivante :
git reset --hard fe59838
Annulation d'une fusion à laquelle est associé un commit
Si les branches main
et feature
ont divergé, lorsque nous fusionnons deux branches, un nouveau commit est créé, appelé commit de fusion.
Le commit de fusion applique les modifications d'une branche à une autre. Dans ce cas, les modifications apportées à feature
sont appliquées à la branche main
.
Pour revenir sur les modifications de la branche main
, nous utilisons la branche git revert
sur le commit de fusion. Cela créera un nouveau commit qui annulera les changements apportés à la branche main
avec la fusion, rétablissant ainsi l'état de la branche principale tel qu'il était avant la fusion.
Tout d'abord, nous devons identifier le hachage du commit de fusion. Nous pouvons le faire à l'aide de la commande git log
:
Parce que le commit de fusion a deux parents, la syntaxe de git revert
est légèrement différente. Nous devons utiliser l'option -m 1
pour spécifier que nous voulons annuler les changements relatifs à la branche main
:
git revert -m 1 b8dab2c8611e324ed0d273133987415350e6d10d
Résolution des conflits lors de l'annulation d'un engagement
Des conflits peuvent parfois survenir lors de l'annulation d'un commit, en particulier si le commit annulé entre en conflit avec des modifications ultérieures de la base de code. Dans ce cas :
- Git met en pause le retour à l'état initial : Nous devons résoudre manuellement les conflits. Git marquera les fichiers en conflit et demandera une intervention.
- Résolvez les conflits : Nous ouvrons chaque fichier conflictuel, résolvons les conflits marqués par Git et enregistrons les modifications.
- Mettez en scène les fichiers résolus :
git add
- Poursuivre le renversement :
git revert --continue
Conclusion
L'utilisation de git revert
pour annuler les commits de fusion permet de s'assurer que chaque changement et correction est documenté dans l'historique des commits.
En outre, la compréhension des scénarios appropriés pour appliquer git reset
par rapport à git revert
nous permet de prendre de meilleures décisions, en particulier lorsqu'il s'agit de flux de travail collaboratifs ou de modifications locales uniquement.
Vous trouverez plus d'informations à ce sujet dans la section FAQ ci-dessous. Si vous souhaitez en savoir plus sur Git, je vous recommande les ressources suivantes :
FAQ
Puis-je revenir sur une fusion déjà publiée avec git revert ?
Oui, c'est le principal cas d'utilisation de git revert
pour les fusions. Si les modifications sont locales, git reset
est un moyen plus facile d'annuler la fusion.
Pour que les autres puissent voir les changements, nous devons les pousser vers le référentiel distant. Ainsi, pour annuler une fusion déjà effectuée, nous procédons comme suit :
git revert -m 1
git push origin
Remplacer par le hash du commit de fusion et
par le nom de la branche où la fusion a été effectuée.
Le commit de fusion sera-t-il supprimé après l'utilisation de git revert ?
Non. Le commit de fusion reste dans l'historique, mais ses modifications sont annulées par le nouveau commit. L'intérêt d'annuler une fusion avec git revert
est de préserver l'historique des livraisons.
Existe-t-il d'autres moyens que git revert pour annuler une fusion ?
Une autre façon d'annuler une fusion est d'utiliser git reset
. Cette méthode réinitialise la branche à un état antérieur au commit de fusion. Cette approche est plus intrusive et peut poser des problèmes si d'autres collaborateurs ont déjà basé leur travail sur les commits que nous prévoyons de réinitialiser. Par conséquent, elle n'est recommandée que lorsque nous sommes sûrs qu'elle n'affectera pas les autres.
git reset --hard
git push --force
Remplacement de par le hash du commit sur lequel nous voulons revenir.
Quand dois-je utiliser git reset pour annuler une fusion ?
Je recommande de n'utiliser git reset
pour annuler une fusion que lorsque la fusion n'a eu lieu que localement et qu'elle n'a pas encore été poussée.
Les meilleurs cours d'ingénierie des données
cursus
Ingénieur de données associé
cursus