git remove merge commit de l’historique

Mon histoire de Git ressemble à ça:

Histoire de Git

Je voudrais écraser le violet en un seul. Je ne veux plus les voir dans mon journal de validation.

J’ai essayé de faire un git rebase -i 1 , mais même si 1 est sur la twig bleue (cf. photo), je vois toujours chaque commit sur ma twig mauve.

Comment puis-je supprimer complètement la twig mauve (du journal de validation)?

Ne git rebase -i cela vous permettra de supprimer la validation de fusion et le journal sera une seule ligne comme vous le souhaitez. Vous pouvez également supprimer tous les commits dont vous ne voulez plus. La raison pour laquelle votre rebase ne fonctionnait pas était que vous ne reveniez pas assez loin.

ATTENTION: Vous réécrivez l’historique en procédant de la sorte. Faire ceci avec des changements qui ont été poussés à un repo distant causera des problèmes. Je recommande de ne le faire qu’avec des commits locaux.

Commençant par le repo dans l’état d’origine

Historique de repo original

Pour supprimer la validation de la fusion et écraser la twig en un seul commit dans la ligne principale

Squashed commits, pas de fusion commit

Utilisez ces commandes (en remplaçant 5 et 1 par les SHA des validations correspondantes):

 git checkout 5 git reset --soft 1 git commit --amend -m '1 2 3 4 5' git rebase HEAD master 

Pour conserver une validation de fusion mais écraser la twig s’engage en une:

Squashed commits, conserver la fusion commit

Utilisez ces commandes (en remplaçant 5, 1 et C par les SHA des commits correspondants):

 git checkout -b tempbranch 5 git reset --soft 1 git commit --amend -m '1 2 3 4 5' git checkout C git merge --no-ff tempbranch git rebase HEAD master 

Pour supprimer la validation de fusion et la remplacer par des validations individuelles de la twig

Branche déplacée dans la ligne principale, pas de validation de fusion

Il suffit de faire (en remplaçant 5 par le SHA du commit correspondant):

 git rebase 5 master 

Et enfin, pour supprimer complètement la twig

Branche enlevée entièrement

Utilisez cette commande (en remplaçant C et D par les SHA des validations correspondantes):

 git rebase --onto CD~ master 

Il y a deux façons de résoudre ce problème en fonction de ce que vous voulez:

Solution 1 : Supprimez les commits violets, en préservant l’historique (si vous souhaitez annuler)

 git revert -m 1  

-m 1 spécifie quelle ligne parent choisir

Les commits violets seront toujours présents dans l’histoire, mais depuis que vous avez annulé, vous ne verrez plus de code de ces commits.


Solution 2 : Supprimez complètement les commits mauves (modification perturbasortingce si le référentiel est partagé)

 git rebase -i  

et supprimer (supprimer des lignes) correspondant aux commits mauves.

Ce serait moins compliqué si les validations n’étaient pas effectuées après la fusion. Des commits supplémentaires augmentent les risques de conflits lors du revert/rebase .

Pour supprimer simplement une fusion

Si tout ce que vous voulez faire est de supprimer un commit de fusion (2) pour qu’il ne soit jamais arrivé, la commande est simplement la suivante:

git rebase --onto

Et maintenant, la twig mauve n’est plus dans le journal de validation du bleu et vous avez deux twigs séparées à nouveau. Vous pouvez ensuite écraser le violet indépendamment et faire les autres manipulations que vous voulez sans que la fusion soit validée.