148 votes

git remove merge commit from history

Mon historique Git ressemble à cela :

Git history

Je voudrais regrouper les commits violets en un seul. Je ne veux plus jamais les voir dans mon journal de commit.

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

Comment puis-je supprimer complètement la branche violette (dans le journal de commit) ?

139voto

Schleis Points 9098

Faites git rebase -i <sha before the branches diverged> cela vous permettra de supprimer le commit de fusion et le journal sera d'une seule ligne comme vous le souhaitiez. Vous pouvez également supprimer tous les commits dont vous ne voulez plus. La raison pour laquelle votre rebasement ne fonctionnait pas était que vous ne retourniez pas assez loin en arrière.

AVERTISSEMENT : Vous réécrivez l'histoire en faisant cela. Faire ceci avec des changements qui ont été poussés vers un dépôt distant causera des problèmes. Je recommande de ne le faire qu'avec des commits locaux.

118voto

Allen Luce Points 4152

Commencer avec le repo dans l'état original

Original repo history

Pour supprimer le commit de fusion et réduire la branche à un seul commit dans la ligne principale.

Squashed commits, no merge commit

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

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

Pour conserver un commit de fusion mais écraser les commits de branche en un seul :

Squashed commits, retained merge commit

Utilisez ces commandes (en remplaçant 5, 1 et C par les SHAs 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 le commit de fusion et le remplacer par des commits individuels de la branche

Branch moved into mainline, no merge commit

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

git rebase 5 master

Et enfin, pour supprimer entièrement la branche

Branch removed entirely

Utilisez cette commande (en remplaçant C et D par les SHAs des commits correspondants) :

git rebase --onto C D~ master

38voto

Warren Points 355

Pour supprimer simplement un engagement de fusion

Si tout ce que vous voulez faire est de supprimer un commit de fusion (2) pour que ce soit comme s'il n'avait jamais eu lieu, la commande est simplement la suivante

git rebase --onto <sha of 1> <sha of 2> <blue branch>

Et maintenant la branche violette n'est pas du tout dans le journal de commit de la bleue et vous avez à nouveau deux branches séparées. Vous pouvez alors écraser la branche violette indépendamment et faire toutes les autres manipulations que vous voulez sans que le commit de fusion ne vous gêne.

22voto

prem Points 326

Il y a deux façons d'aborder cette question en fonction de ce que vous voulez :

Solution 1 : Supprimer les commits violets, en préservant l'historique (au cas où vous voudriez revenir en arrière)

git revert -m 1 <SHA of merge>

-m 1 spécifie la ligne parentale à choisir

Les commits violets seront toujours présents dans l'historique mais puisque vous avez fait marche arrière, vous ne verrez pas le code de ces commits.


Solution 2 : Supprimer complètement les commits violets (changement perturbateur si le repo est partagé).

git rebase -i <SHA before branching out>

et supprimer (enlever les lignes) correspondant aux commits violets.

Cela serait moins délicat si les modifications n'étaient pas effectuées après la fusion. Les commits supplémentaires augmentent les chances de conflits lors de la revert/rebase .

5voto

squall3d Points 831

Pour un contrôle total de l'opération et pour préserver tout commit de fusion que vous souhaitez conserver en cours de route, l'approche moderne est d'utiliser

git rebase -i -r

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