Développer ce que j'ai écrit dans un commentaire
La règle générale est que vous ne devez pas réécrire (modifier) l'historique que vous avez publié, car quelqu'un a peut-être basé son travail dessus. Si vous réécrivez (modifiez) l'historique, vous rencontrez des problèmes avec la fusion de leurs modifications et leur mise à jour.
La solution consiste donc à créer un nouveau commit qui annule les modifications dont vous souhaitez vous débarrasser. Vous pouvez le faire en utilisant la commande git revert .
Vous avez la situation suivante:
A <- B <- C <- D <- master <- HEAD
(les flèches se réfèrent ici à la direction du pointeur: la référence "parent" dans le cas des validations, la validation supérieure dans le cas de la tête de branche (référence de branche) et le nom de la branche dans le cas de la référence HEAD).
Ce que vous devez créer est le suivant:
A <- B <- C <- D <- [(BCD) ^ - 1] <- master <- HEAD
où "[(BCD) ^ - 1]" signifie le commit qui annule les changements dans les commits B, C, D. Les mathématiques nous disent que (BCD) ^ - 1 = D ^ -1 C ^ -1 B ^ -1, donc vous pouvez obtenir la situation requise en utilisant les commandes suivantes:
$ git revert --no-commit D
$ git revert --no-commit C
$ git revert --no-commit B
$ git commit -m "the commit message"
Une autre solution consisterait à extraire le contenu du commit A et à valider cet état:
$ git checkout -f A -- .
$ git commit -a
Vous auriez alors la situation suivante:
A <- B <- C <- D <- A '<- master <- HEAD
Le commit A 'a le même contenu que le commit A, mais est un commit différent (message de commit, parents, date de commit).
La solution de Jeff Ferland, modifiée par Charles Bailey s'appuie sur la même idée, mais utilise git reset :
$ git reset --hard A
$ git reset --soft @{1} # (or ORIG_HEAD), which is D
$ git commit
git push -f HEAD~4:master
(en supposant que la branche distante est master). Oui, vous pouvez pousser n'importe quel commit comme ça.