102 votes

Je dois faire apparaître et supprimer un "commit" "intermédiaire" dans ma branche master. Comment puis-je le faire ?

Par exemple, dans la branche principale suivante, je dois juste annuler le commit af5c7bf16e6f04321f966b4231371b21475bc4da, qui est le deuxième en raison d'un rebase précédent :

commit 60b413512e616997c8b929012cf9ca56bf5c9113
Author: Luca G. Soave 
Date:   Tue Apr 12 23:50:15 2011 +0200

    ajouter config/initializers/omniauth.example.rb générique

commit af5c7bf16e6f04321f966b4231371b21475bc4da
Author: Luca G. Soave 
Date:   Fri Apr 22 00:15:50 2011 +0200

    afficher les informations utilisateur github si connecté

commit e6523efada4d75084e81971c4dc2aec621d45530
Author: Luca G. Soave 
Date:   Fri Apr 22 17:20:48 2011 +0200

    ajouter plusieurs .container à la mise en page blueprint

commit 414ceffc40ea4ac36ca68e6dd0a9ee97e73dee22
Author: Luca G. Soave 
Date:   Thu Apr 21 19:55:57 2011 +0200

    ajouter %h1 Fantastic Logo + .right pour 'Connectez-vous avec Github'

J'ai besoin de conserver

  • le premier commit 60b413512e616997c8b929012cf9ca56bf5c9113,
  • le troisième commit e6523efada4d75084e81971c4dc2aec621d45530 et
  • le dernier commit 414ceffc40ea4ac36ca68e6dd0a9ee97e73dee22

"jetant" juste le deuxième commit af5c7bf16e6f04321f966b4231371b21475bc4da

Comment puis-je faire cela ?

108voto

JCotton Points 4256

Rebase ou revert sont les options. Rebase supprimera réellement le commit de l'historique de sorte qu'il semblera que le deuxième commit n'a jamais existé. Cela posera problème si vous avez poussé la branche principale vers d'autres dépôts. Si vous essayez de pousser après un rebase dans ce cas, git vous donnera une erreur de rejet de fusions non fast-forward.

Revert est la solution correcte lorsque la branche a été partagée avec d'autres dépôts. git revert af5c7bf16 créera un nouveau commit qui inverse simplement les modifications introduites par af5c7bf16. De cette façon, l'historique n'est pas réécrit, vous conservez un enregistrement clair de l'erreur et les autres dépôts accepteront la poussée.

Voici une bonne façon d'effacer : git rebase -i ^ Cela vous emmènera au commit juste avant celui que vous voulez supprimer. L'éditeur interactif vous montrera une liste de tous les commits jusqu'à ce point. Vous pouvez sélectionner, écraser, etc. Dans ce cas, supprimez la ligne du commit que vous voulez effacer et enregistrez le fichier. Rebase terminera son travail.

38voto

mipadi Points 135410

Si le rebase est une option, vous pouvez rebaser et simplement le laisser tomber :

$ git rebase -i 414ceffc^

Si le rebase n'est pas une option, vous pouvez simplement le revert :

$ git revert af5c7bf16

32voto

BuvinJ Points 21

Malgré tout le crédit accordé aux réponses originales reçues ici, je n'ai pas trouvé qu'elles répondaient de manière satisfaisante à la question. Si vous vous retrouvez dans une situation où vous avez besoin de supprimer un commit, ou une collection de commits du milieu de l'historique, voici ce que je suggère :

  • Créez une nouvelle branche à partir de celle contenant tous les commits et basculez dessus.
  • Revenez en arrière sur la nouvelle branche jusqu'au point où vous souhaitez commencer une nouvelle base.
  • Ensuite, (c'est là le point clé) cherry pick les commits suivants que vous souhaitez réellement appliquer après cela de la branche originale vers la nouvelle, et sautez les commits que vous ne voulez plus (c'est-à-dire ceux que vous supprimez).
  • Si nécessaire, renommez la branche originale pour indiquer qu'il s'agit de vieux code, puis renommez votre nouvelle branche avec le nom de l'original.
  • Enfin, poussez vos changements vers votre dépôt distant (si vous en utilisez un). Vous devrez probablement utiliser un "push forcé". Si vos collaborateurs rencontrent des problèmes pour récupérer les révisions, il sera peut-être plus facile pour eux de simplement cloner à nouveau le dépôt à partir de la source distante. D'une manière ou d'une autre, vous voudrez probablement en discuter avec eux si vous supprimez des commits du milieu de votre historique de toute façon !

Voici des informations sur le Cherry Picking : Que signifie cherry-picking un commit avec git ?

En voici quelques-unes sur la façon de le faire avec Tortoise Git (comme je viens de le faire). Il est certainement plus facile d'utiliser un utilitaire graphique pour ce type d'opérations ! Cherry pick using TortoiseGit

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