2009-12-28 4 views
22

Plus tôt, j'ai commis du code qui à l'époque semblait être une bonne idée, mais en fait cela a empiré les choses. Je voudrais supprimer le changement de l'historique car il n'est pas utile, et rebaser tous les commits puisque - ils devraient tous fusionner sans problèmes.GIT annule un commit qui n'est pas le plus récent, rebase tous les validations depuis

J'ai essayé de créer une nouvelle branche (appelée newMaster) immédiatement avant le mauvais commit (avec GitX), le vérifier et fonctionnement:

git rebase -i master 

Ce qui AFAICS devrait me donner une liste des commits sur maître et l'option pour fusionner ou ne pas les fusionner, mais à la place il a dit noop, et a rapidement transféré newMaster pour être égal à master.

Quelle est la manière la plus simple de faire ce dont j'ai besoin?

Répondre

12

git rebase -i est la bonne commande, mais vous voulez le faire à partir de la branche avec les dernières modifications, et passez la révision qui est la "base" de l'opération de rebasage (la révision immédiatement avant la mauvaise validation). Donc, si vous avez créé une branche last-good-commit qui pointe à la dernière bonne commit, vous voulez exécuter le tout en suivant le master:

git rebase -i last-good-commit 
+3

Fournir plus d'arguments peut aussi rendre la chose plus intuitive - 'git rebase -i last-good-commit master' fait la même chose (vérifie le maître puis rebase en utilisant le dernier-bon-commit comme base). – Cascabel

29

La façon la plus simple de faire ce que vous voulez est de rester (ou re-vérifier) ​​la branche que vous voulez modifier et d'exécuter quelque chose comme ça.

git rebase --onto <sha1-of-bad-commit>^ <sha1-of-bad-commit> 

Cela rebasage tout depuis le mauvais commettras sur le mauvais parent Engageons, éliminer efficacement la mauvaise commiit de l'histoire de votre succursale. Bien sûr, vous devrez résoudre tous les conflits s'ils se produisent.

+7

à distance Un point de données: ce détruit mon dépôt . – Malvolio

+1

Vous devez faire un 'git push --force' pour que ça marche. Mais soyez * très * prudent avec ça. – redolent

2

En utilisant rebase, je ne pouvais pas pousser les changements à la télécommande, et ma rebase a été annulée à chaque tirage.

je réussi à revenir une précision commit (pas le dernier) avec, tout simplement:

git revert <sha-of-bad-commit> 

Et puis j'étais aussi capable de pousser sur le

+0

Si vous rebassez après un push, vous devez forcer le push en utilisant 'git push -f'. Utilisez-le avec une extrême prudence car vous pouvez supprimer les changements d'autres personnes sur la destination. – rjmunro

Questions connexes