web-dev-qa-db-fra.com

git remove merge commit de l'historique

Mon histoire Git ressemble à ça:

Git history

Je voudrais écraser les commets 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 pourpre.

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

66
Benjamin Toueg

Faire git rebase -i <sha before the branches diverged> _ ceci vous permettra de supprimer la validation de fusion et le journal ne comportera qu'une seule ligne comme vous le souhaitez. Vous pouvez également supprimer les commits dont vous ne voulez plus. La raison pour laquelle votre base ne fonctionnait pas était que vous ne reveniez pas assez loin.

AVERTISSEMENT: vous réécrivez l’historique en procédant ainsi. Faire cela avec les modifications qui ont été poussées vers un référentiel distant causera des problèmes. Je recommande de ne faire cela qu'avec des commits locaux.

82
Schleis

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

Original repo history

Pour supprimer le commit de fusion et écraser la branche en un seul commit dans la ligne principale

Squashed commits, no merge commit

Utilisez ces commandes (en remplaçant 5 et 1 par les SHA 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 une validation de fusion tout en réduisant la validation de la branche en une seule:

Squashed commits, retained merge 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 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 complètement la branche

Branch removed entirely

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

git rebase --onto C D~ master
44
Allen Luce

Il y a deux façons de résoudre ce problème en fonction de vos souhaits:

Solution 1: Supprimer les commits violets en préservant l'historique (en cas d'annulation)

git revert -m 1 <SHA of merge>

-m 1 spécifie la ligne parent à choisir

Les commits violets seront toujours présents dans l’histoire, mais puisque vous avez annulé le code, vous ne verrez pas le code de ces commits.


Solution 2: Supprimer complètement les commits violets (modification perturbatrice si le référentiel est partagé)

git rebase -i <SHA before branching out>

et supprimez (supprimez les lignes) correspondant aux commits violets.

Ce serait moins compliqué si les commits n'étaient pas faits après la fusion. Des commits supplémentaires augmentent les risques de conflits pendant revert/rebase.

13
prem

Supprimer simplement un engagement de fusion

Si tout ce que vous voulez faire est de supprimer un commit de fusion (2) pour qu'il soit comme si rien ne s'était passé, la commande est simplement la suivante

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

Et maintenant, la branche violette ne figure plus dans le journal de validation bleu et vous avez à nouveau deux branches distinctes. Vous pouvez ensuite écraser le violet de manière indépendante et effectuer toutes les autres manipulations que vous souhaitez sans la validation de fusion.

8
Warren