web-dev-qa-db-fra.com

J'ai besoin de faire apparaître et de supprimer une validation «intermédiaire» dans ma branche principale. Comment puis-je le faire?

Par exemple, dans la branche principale suivante, j'ai besoin de supprimer uniquement le commit af5c7bf16e6f04321f966b4231371b21475bc4da, qui est le deuxième en raison du rebase précédent:

commit 60b413512e616997c8b929012cf9ca56bf5c9113
Author: Luca G. Soave <[email protected]>
Date:   Tue Apr 12 23:50:15 2011 +0200

    add generic config/initializers/omniauth.example.rb

commit af5c7bf16e6f04321f966b4231371b21475bc4da
Author: Luca G. Soave <[email protected]>
Date:   Fri Apr 22 00:15:50 2011 +0200

    show github user info if logged

commit e6523efada4d75084e81971c4dc2aec621d45530
Author: Luca G. Soave <[email protected]>
Date:   Fri Apr 22 17:20:48 2011 +0200

    add multiple .container at blueprint layout

commit 414ceffc40ea4ac36ca68e6dd0a9ee97e73dee22
Author: Luca G. Soave <[email protected]>
Date:   Thu Apr 21 19:55:57 2011 +0200

    add %h1 Fantastic Logo + .right for 'Sign in with Github'

J'ai besoin de garder

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

"jeter" juste le deuxième commit af5c7bf16e6f04321f966b4231371b21475bc4da

Comment puis je faire ça? Merci d'avance Luca

86
BBJ3

Rebase ou revert sont les options. Rebase supprimera le commit de l'historique, il semblera donc que le deuxième commit n'a jamais existé. Ce sera un problème si vous avez poussé la branche principale vers un autre référentiel. Si vous essayez de pousser après un rebase dans ce cas, git vous donnera une erreur rejeter les fusions non rapides .

Revert est la bonne solution lorsque la branche a été partagée avec d'autres référentiels. git revert af5c7bf16 fera un nouveau commit qui annule simplement les changements introduits par af5c7bf16. De cette façon, l'historique n'est pas réécrit, vous conservez un enregistrement clair de l'erreur et les autres repos accepteront le Push.

Voici un bon moyen d'effacer: git rebase -i <commit>^ Cela vous amène au commit juste avant celui que vous souhaitez supprimer. L'éditeur interactif vous montrera une liste de tous les commits à ce point. Vous pouvez sélectionner, écraser, etc. Dans ce cas supprimez la ligne du commit que vous souhaitez effacer et enregistrez le fichier. Rebase terminera son travail.

91
JCotton

Si le rebase est une option, vous pouvez rebaser et simplement le déposer:

$ git rebase -i 414ceffc^

Si le rebase n'est pas une option, vous pouvez simplement le rétablir:

$ git revert af5c7bf16
30
mipadi

Malgré tout le crédit que les réponses originales ont reçues ici, je ne les ai pas tout à fait trouvées pour répondre de manière satisfaisante à la question. Si vous vous trouvez dans une situation où vous devez supprimer un commit, ou une collection de commits du milieu de l'histoire, voici ce que je suggère:

  • Créez une nouvelle branche à partir de la tête de celle contenant tous les commits et passez-y.
  • Retournez la nouvelle branche au point à partir duquel vous souhaitez démarrer une nouvelle base.
  • Ensuite, (voici le point clé) Cherry Pick les validations suivantes que vous souhaitez réellement appliquer après cela de la branche d'origine à la nouvelle, et ignorez les commits dont vous ne voulez plus (c'est-à-dire ceux que vous supprimez).
  • Si vous le souhaitez, renommez la branche d'origine en quelque chose indiquant qu'il s'agit d'un ancien code, puis renommez votre nouvelle branche sous le nom de celle d'origine.
  • Enfin, envoyez vos modifications à votre référentiel distant (si vous en utilisez un). Vous devrez probablement utiliser un "Push forcé". Si vos collaborateurs ont des problèmes pour extraire les révisions, il 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 leur parler si vous extrayez des commits du milieu de votre histoire de toute façon!

Voici des informations sur Cherry Picking: Que signifie la sélection d'un commit avec git?

Voici quelques conseils pour le faire avec Tortoise Git (comme je viens de le faire). Il est certainement plus facile d'utiliser un utilitaire gui pour ce genre d'opérations! choix de cerise en utilisant TortoiseGit

26
BuvinJ