Il y a trois façons de faire cela, en fonction de ce que vous avez fait avec les changements du fichier A. Si vous n'avez pas encore ajouté les changements à l'index ou si vous ne les avez pas livrés, alors vous voulez juste utiliser la commande checkout - cela changera l'état de la copie de travail pour correspondre au dépôt :
git checkout A
Si vous l'avez déjà ajouté à l'index, utilisez reset :
git reset A
Si vous l'avez validé, alors vous utilisez la commande revert :
# the -n means, do not commit the revert yet
git revert -n <sha1>
# now make sure we are just going to commit the revert to A
git reset B
git commit
Si d'un autre côté, vous l'avez committé, mais que le commit impliquait un grand nombre de fichiers que vous ne voulez pas également rétablir, alors la méthode ci-dessus pourrait impliquer beaucoup de commandes "reset B". Dans ce cas, vous pouvez utiliser cette méthode :
# revert, but do not commit yet
git revert -n <sha1>
# clean all the changes from the index
git reset
# now just add A
git add A
git commit
Une autre méthode encore, nécessite l'utilisation de la commande rebase -i. Celle-ci peut être utile si vous avez plus d'un commit à modifier :
# use rebase -i to cherry pick the commit you want to edit
# specify the sha1 of the commit before the one you want to edit
# you get an editor with a file and a bunch of lines starting with "pick"
# change the one(s) you want to edit to "edit" and then save the file
git rebase -i <sha1>
# now you enter a loop, for each commit you set as "edit", you get to basically redo that commit from scratch
# assume we just picked the one commit with the erroneous A commit
git reset A
git commit --amend
# go back to the start of the loop
git rebase --continue