Mon histoire Git ressemble à ça:
Je voudrais écraser les commits violets en un seul. Je ne veux plus jamais les revoir dans mon journal de validation.
J'ai essayé de faire un git rebase -i 1
, mais même si 1
c'est sur la branche bleue (cf. image), je vois toujours tous les commit sur ma branche violette.
Comment puis-je supprimer complètement la branche violette (du journal de validation)?
git
git-merge
git-rebase
Benjamin Toueg
la source
la source
Réponses:
Cela
git rebase -i <sha before the branches diverged>
vous permettra de supprimer la validation de fusion et le journal sera une seule ligne comme vous le souhaitez. Vous pouvez également supprimer les validations dont vous ne voulez plus. La raison pour laquelle votre rebase ne fonctionnait pas était que vous ne retourniez pas assez loin.AVERTISSEMENT: vous réécrivez l'historique en faisant cela. Faire cela avec des modifications qui ont été transmises à un référentiel distant entraînera des problèmes. Je recommande de ne faire cela qu'avec des commits locaux.
la source
git rebase
et ils seront supprimés.À partir du repo dans son état d'origine
Pour supprimer le commit de fusion et écraser la branche en un seul commit dans la ligne principale
Utilisez ces commandes (en remplaçant 5 et 1 par les SHA des commits correspondants):
Pour conserver un commit de fusion mais écraser la branche commit en un:
Utilisez ces commandes (en remplaçant 5, 1 et C par les SHA des commits correspondants):
Pour supprimer le commit de fusion et le remplacer par des commits individuels de la branche
Faites simplement (en remplaçant 5 par le SHA du commit correspondant):
Et enfin, pour supprimer entièrement la branche
Utilisez cette commande (en remplaçant C et D par les SHA des commits correspondants):
la source
git rebase 5 master
cas où, pourquoi ce n'est pas l'ordre "ABC 1 2 3 4 5 D ..."?master
n'ont pas de commun avec5
et les place par-dessus5
. Le commit àC
ne fait pas partie de la lignée de5
, c'est le premier à être déplacé dessus5
.git rebase C 5; git rebase 5 master
Il existe 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 (au cas où vous voudriez revenir en arrière)
-m 1
spécifie quelle ligne parent choisirLes commits violets seront toujours là dans l'histoire, mais puisque vous êtes revenu, vous ne verrez pas le code de ces commits.
Solution 2 : supprimer complètement les commits violets (changement perturbateur si le dépôt est partagé)
et supprimer (supprimer les lignes) correspondant aux commits violets.
Ce serait moins délicat si les validations n'étaient pas effectuées après la fusion. Les commits supplémentaires augmentent les risques de conflits pendant
revert/rebase
.la source
1 - 1 = 0
. Mais si vous rebasez ensuite les commits violets, vous laissez le correctif rétabli, à moins que vous ne le rebasiez également. Si vous ne le faites pas, c'est comme s'appliquer-1
à votre historique, non0
, donc vous laisserez derrière vous les changements dont vous ne voulez pas.Pour supprimer simplement une validation de fusion
Si tout ce que vous voulez faire est de supprimer un commit de fusion (2) pour que ce soit comme si cela ne s'était jamais produit, 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 validation de bleu et vous avez à nouveau deux branches séparées. Vous pouvez ensuite écraser le violet indépendamment et faire toutes les autres manipulations que vous voulez sans la validation de fusion.
la source