220 votes

Comment enlever une révision spécifique dans l’histoire de git ?

Supposons que votre histoire ressemble à ceci:

1 2 3 4 5

Où 1-5 sont des révisions distinctes. Vous devez supprimer 3 tout en conservant 1, 2, 4 et 5. Comment le faire?

Existe-t-il une méthode efficace lorsqu'il existe des centaines de révisions après celle à supprimer?

132voto

kareem Points 265

Selon ce commentaire (et j'ai vérifié que cela est vrai), la réponse de rado est très proche mais laisse Git dans un état de tête détaché. Au lieu de cela, supprimez HEAD et utilisez-le pour supprimer <commit-id> de la branche sur laquelle vous vous trouvez:

 git rebase --onto <commit-id>^ <commit-id>
 

125voto

rado Points 1709

Voici un moyen de supprimer de manière non interactive un <commit-id> spécifique, en ne connaissant que les <commit-id> vous souhaitez supprimer:

 git rebase --onto <commit-id>^ <commit-id> HEAD
 

78voto

garethm Points 1465

Combiner la révision 3 et 4 en une seule révision, vous pouvez utiliser git rebase. Si vous souhaitez supprimer les modifications dans la révision 3, vous devez utiliser la commande modifier dans le rebase interactif mode. Si vous souhaitez combiner les changements en une seule révision, l'utilisation de squash.

J'ai utilisé avec succès cette courge technique, mais n'ont jamais eu besoin de supprimer une révision avant. Git-git rebase documentation dans le cadre du "Splitting s'engage" devrait vous donner assez d'une idée pour le comprendre. (Ou quelqu'un d'autre peut le savoir).

Depuis le git de la documentation:

Démarrez avec le dernier commit que vous voulez à retenir est:

git rebase -i <after-this-commit>

Un éditeur sera tiré, avec tous les changements dans votre branche courante (en ignorant fusion s'engage), qui intervient après la validation donnée. Vous pouvez réorganiser les commits dans cette liste le contenu de votre coeur, et vous pouvez les supprimer. La liste semble plus ou moins comme ceci:

choisissez deadbee La oneline de ce commit
choisissez fa1afe1 La oneline du prochain commit
...

Le oneline descriptions sont purement pour votre plaisir; git-git rebase ne sera pas regarder à eux, mais à la validation des noms ("deadbee" et "fa1afe1" dans cet exemple), afin de ne pas supprimer ou modifier les noms.

En remplaçant la commande "ramasser" avec la commande "edit", vous pouvez indiquer à git-git rebase pour arrêter après l'application qui s'engagent, de sorte que vous pouvez modifier les fichiers et/ou le message de commit modifier le commettre, et continuer de rebasage.

Si vous voulez plier en deux, ou plus, s'engage dans une, remplacer la commande "sélection" avec "squash" pour la deuxième et les suivantes s'engager. Si les commits avait différents auteurs, il attribue l'écrasé de s'engager à l'auteur de la première validation.

77voto

Rares Vernica Points 798

Comme indiqué avant git-git rebase(1) est votre ami. En supposant que les commits sont dans votre master direction générale, vous devez faire:

git rebase --onto master~3 master~2 master

Avant:

1---2---3---4---5  master

Après:

1---2---4'---5' master

À partir de git-git rebase(1):

Une série de commits pourrait également être supprimé avec rebase. Si nous avons l' situation suivante:

E---F---G---H---I---J  topicA

la commande

git rebase --onto topicA~5 topicA~3 topicA

entraînerait la suppression de s'engage F et G:

E---H'---I'---J'  topicA

Ceci est utile si F et G étaient entachées d'irrégularités dans certains façon, ou ne devrait pas être partie de topicA. Notez que l'argument --sur et le paramètre peut être tout valide commit-ish.

22voto

SpoonMeiser Points 6211

Si tout ce que vous voulez faire est de supprimer les modifications effectuées dans la révision 3, vous pouvez utiliser git revert.

Git revert crée simplement une nouvelle révision avec les changements que d'annuler tous les changements dans la révision que vous restaurez.

Ce que cela signifie, c'est que vous conservez des informations sur les indésirables s'engager, et de la validation qui supprime ces changements.

C'est sans doute beaucoup plus sympathique si c'est possible que quelqu'un a tiré à partir du référentiel dans le temps de le dire, depuis le revert est fondamentalement juste un standard de commettre.

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