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
"jeter" juste le deuxième commit af5c7bf16e6f04321f966b4231371b21475bc4da
Comment puis je faire ça? Merci d'avance Luca
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.
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
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:
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