180 votes

Annulation d'une partie d'un commit avec git

Je veux annuler un commit particulier dans git. Malheureusement, notre organisation utilise toujours CVS comme norme. Par conséquent, lorsque je commets de nouveau dans CVS, plusieurs validations git sont combinées. Dans ce cas, j'aimerais choisir le git originel, mais c'est impossible.

Existe-t-il une approche similaire à git add --patch qui me permettrait de modifier de manière sélective les diffs afin de décider des parties d'un engagement à rétablir?

273voto

mipadi Points 135410

Utilisez l'option --no-commit ( -n ) pour git revert , puis annulez les modifications, puis utilisez git add --patch :

 $ git revert -n $bad_commit    # Revert the commit, but don't commit the changes
$ git reset HEAD .             # Unstage the changes
$ git add --patch .            # Add whatever changes you want
$ git commit                   # Commit those changes
 

Remarque: Les fichiers que vous ajoutez à l'aide de git add --patch sont les fichiers que vous souhaitez restaurer, pas les fichiers que vous souhaitez conserver.

52voto

user1338062 Points 1553

J'ai utilisé les éléments suivants avec succès:

 git revert --no-commit <sha1>
git reset -p                   # interactively remove the GOOD changes from index
git commit -m "Partially revert <sha1>..."
 

Commencez par annuler le commit complet (le met dans l'index) mais ne le commettez pas, puis supprimez les BONNES modifications (à ne pas inverser) de l'index, puis validez la diff inverse des modifications incorrectes.

8voto

Solution:

 git revert --no-commit <commit hash>
git reset -p        # every time choose 'y' if you want keep the change, otherwise choose 'n'
git commit -m "Revert ..."
git checkout -- .   # Don't forget to use it.
 

6voto

cookiecaper Points 1718

Personnellement, je préfère cette version, qui réutilise le message de validation généré automatiquement et donne à l'utilisateur la possibilité d'éditer et de coller le mot "Partiellement" avant de finalement valider.

 # generate a revert commit
# note the hash printed to console on success
git revert --no-edit <hash to revert>

# undo that commit, but not its changes to the working tree
# (reset index to commit-before-last; that is, one graph entry up from HEAD)
git reset HEAD~1

# interactively add reversions
git add -p

# commit with pre-filled message
git commit -c <hash from revert commit, printed to console after first command>

# reset the rest of the current directory's working tree to match git
# this will reapply the excluded parts of the reversion to the working tree
# you may need to change the paths to be checked out
# be careful not to accidentally overwrite unsaved work
git checkout -- .
 

1voto

William Pursell Points 56211

Vous pouvez utiliser git-revert -n, puis utiliser add --patch pour sélectionner des mecs.

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