J’ai besoin de faire sauter un “middle” dans ma twig master. Comment puis-je le faire?

Par exemple, dans la twig principale suivante, je dois supprimer uniquement le commit af5c7bf16e6f04321f966b4231371b21475bc4da, qui est le second en raison du rebase précédent:

commit 60b413512e616997c8b929012cf9ca56bf5c9113 Author: Luca G. Soave  Date: Tue Apr 12 23:50:15 2011 +0200 add generic config/initializers/omniauth.example.rb commit af5c7bf16e6f04321f966b4231371b21475bc4da Author: Luca G. Soave  Date: Fri Apr 22 00:15:50 2011 +0200 show github user info if logged commit e6523efada4d75084e81971c4dc2aec621d45530 Author: Luca G. Soave  Date: Fri Apr 22 17:20:48 2011 +0200 add multiple .container at blueprint layout commit 414ceffc40ea4ac36ca68e6dd0a9ee97e73dee22 Author: Luca G. Soave  Date: Thu Apr 21 19:55:57 2011 +0200 add %h1 Fantastic Logo + .right for 'Sign in with Github' 

J’ai besoin de restr

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

“jeter” juste le deuxième engagement af5c7bf16e6f04321f966b4231371b21475bc4da

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

Rebase ou revert sont les options. Rebase supprimera en fait le commit de l’historique, donc il semblera que le second commit n’a jamais existé. Cela posera un problème si vous avez poussé la twig principale vers d’autres repos. Si vous essayez de pousser après une rebase dans ce cas, git vous donnera une erreur de rejet sans fusion rapide .

Revert est la solution correcte lorsque la twig a été partagée avec d’autres repos. git revert af5c7bf16 va faire un nouvel 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 d’autres repos acceptent la poussée.

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

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

 $ git rebase -i 414ceffc^ 

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

 $ git revert af5c7bf16 

Malgré tout le crédit que les réponses originales ont reçues ici, je ne les ai pas 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 un ensemble de commits datant du milieu de l’histoire, voici ce que je suggère:

  • Créez une nouvelle twig dans la tête de celui contenant tous les commits et activez-la.
  • Revenez à la nouvelle twig au point à partir duquel vous souhaitez démarrer une nouvelle base.
  • Ensuite, (voici le point clé) sélectionnez les commits suivants que vous voulez réellement appliquer après cela, de la twig d’origine à la nouvelle, et ignorez les validations que vous ne voulez plus (c’est-à-dire celles que vous supprimez).
  • Si vous le souhaitez, renommez la twig d’origine en quelque chose indiquant son ancien code, puis renommez votre nouvelle twig en fonction de son nom d’origine.
  • Enfin, transférez vos modifications sur votre repo distant (si vous en utilisez un). Vous devrez probablement utiliser un “push forcé”. Si vos collaborateurs rencontrent des problèmes lors de la récupération des révisions, il peut être plus simple pour eux de cloner à nouveau le repository à partir de la source distante. D’une manière ou d’une autre, vous voudrez probablement leur parler si vous extrayez des commits en plein milieu de votre histoire!

Voici des informations sur la sélection de cerises: Que signifie «choisir avec un git»?

En voici quelques exemples avec Tortoise Git (comme je viens de le faire). Il est certainement plus facile d’utiliser un utilitaire d’interface graphique pour ce genre d’opérations! Cherry pick en utilisant TortoiseGit