74 votes

Comment puis-je fusionner plusieurs commits, mais en laisser un de côté ?

Supposons que j'ai cette branche de fonctionnalité "foo". Je veux maintenant la fusionner dans master, mais j'ai ajouté du code de débogage que je ne veux pas dans master.

Le code de débogage est dans son propre commit, donc je pourrais utiliser git cherry-pick sur chaque livraison et laisser de côté cette livraison. Mais ça va être assez fastidieux.

Existe-t-il une méthode de "sélection inverse" qui permet de faire cela, ou une fusion interactive ?

68voto

Charles Bailey Points 244082

Malgré ce que d'autres GCL utilisent comme signification, en git , git revert est un cherry-pick inverse.

53voto

Harry Vangberg Points 470

Utilisez le rebasement interactif :

git rebase -i SHA-OF-FIRST-COMMIT-IN-BRANCH

Cela ouvrira quelque chose comme ceci dans votre $EDITOR :

    pick 8ac4783 folders and folders
    pick cf8b1f5 minor refactor
    pick 762b37a Lots of improvement. Folders adn shit.
    pick 3fae6e1 Be ready to tableview
    pick b174dc0 replace folder collection view w/ table view
    pick ef1b65b more finish
    pick ecc407f responder chain and whatnot
    pick 080a847 play/pause video
    pick 6719000 wip: movie fader
    pick c5f2933 presentation window fade transition

    # Rebase e6f77c8..c5f2933 onto e6f77c8
    #
    # Commands:
    #  p, pick = use commit
    #  e, edit = use commit, but stop for amending
    #  s, squash = use commit, but meld into previous commit
    #
    # If you remove a line here THAT COMMIT WILL BE LOST.
    # However, if you remove everything, the rebase will be aborted.
    #

Donc ce que vous faites est simplement de supprimer la ligne contenant le commit de débogage, d'écrire le fichier et de fermer votre éditeur, et git vous dira quelque chose du genre :

Successfully rebased and updated refs/heads/master.

Maintenant vous pouvez juste fusionner cette branche avec master.

MISE À JOUR : Il convient de noter que la modification de l'historique à l'aide de la fonction rebase debe seulement se produisent sur les branches privées. Si cette branche a été exposée au public, utilisez git revert comme proposé par l'autre répondant.

7voto

Paul Pladijs Points 3630

Une autre idée est d'ajouter le commit reverted de celui avec le code de débogage et de le fusionner dans votre branche master. Ensuite, nous supprimons ce commit supplémentaire dans la branche foo.

git checkout foo
git revert COMMIT_REF_WITH_DEBUG_CODE

git checkout master
git merge foo

git checkout foo
git reset --hard HEAD~1

Assurez-vous que votre arbre de travail est propre. Créez d'abord le commit inversé. Puis fusionnez-le dans master. Ensuite, réinitialisez le pointeur de branche de la branche foo vers le parent du commit annulé, afin qu'il retrouve son état d'origine.

Si vous n'aimez pas utiliser git reset alors vous pouvez créer une branche temporaire où vous créez le commit annulé. A la fin, vous supprimez la branche temporaire.

2voto

Yang Zhao Points 579

Utilisez interactive rebase pour supprimer les commits que vous ne voulez pas.

Sur une nouvelle branche "foo-merge" créée à partir de "foo" :

git rebase -i master

Une fois que vous êtes en mode édition des commits, supprimez les lignes contenant les commits de débogage, enregistrez et quittez l'éditeur.

Après le rebasement, tirez simplement foo-merge dans master :

git checkout master
git pull . foo-merge

0voto

michaeljoseph Points 1494

J'ai eu du succès avec :

git rebase -p --onto SHA^ SHA

SHA est le commit que vous voulez supprimer.

via http://sethrobertson.github.io/GitFixUm/fixup.html#remove_deep

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