2010-03-25 16 views
11

J'ai un commit, je l'ai stocké dans une branche, car cela ne devrait aller qu'à une case spécifique.Git exclure un commit dans une branche

Je l'ai fusionné avec le maître de branche, mais pas le dev de branche, que j'utilise localement.

Maintenant, par erreur, j'ai fusionné master à dev et qui a introduit ce commit à dev.

Je sais que git peut retourner sha, à dev dev; mais puisque cela va introduire un commit qui annule ce commit (je devine, je n'ai pas vraiment essayé cela), quand je fusionnerai master, ce commit sera-t-il annulé aussi?

Si oui, comment annuler cette validation uniquement à partir du dev de la branche.

Et oh, git reset HEAD^1 --hard n'est pas une option car il y a d'autres validations sur le maître, après la validation inutile.

Si la réinitialisation et l'application sont la seule option, alors comment puis-je seulement fusionner ces commits supplémentaires de maître autre que la validation non nécessaire.

Mise à jour:

Voici l'arbre de validation. Ça a l'air complexe. J'ai indiqué le commit, dont je n'ai pas besoin dans le dev. (J'ai également enlevé toute information personnellement identifiable, merci pour la compréhension.Il est tellement plus simple de capturer gitk que d'art ascii.) alt text

Merci d'avance!

+1

Est-il possible de ascii-art ce que je ne suis pas totalement clair où les commits de fusion sont en relation avec le commit indésirable? –

+0

Dans svn, vous pouvez fusionner des plages de révisions, 1-19, 49, 52-90 ... Je suis sûr que vous pouvez le faire aussi dans git. – SeanJA

+1

@SeanJA: Je ne suis pas sûr que l'analogie avec svn soit le meilleur moyen d'obtenir une réponse. En particulier, avec git, si vous commencez par 'A - B - C' et supprimez' B' pour obtenir 'A - C '', le commit 'C'' n'est pas le même que le commit' C', car il n'a pas le même parent. Tellement sûr, vous pouvez construire une deuxième branche consistant des commits originaux avec celui voulu, puis fusionner cela, mais vous n'aurez pas fusionné la branche originale. – Cascabel

Répondre

16

Sur une copie de travail de votre branche, git rebase --interactive et supprimez la validation indésirable. Vous pouvez également créer une nouvelle branche en amont de la validation non désirée et git cherry-pick les validations souhaitées sur celle-ci.

Il y a probablement plus de façons d'y parvenir.

2

git reflog, puis git reset --hard sont tes amis pour annuler les erreurs.

Afin d'éviter un engagement lors de la fusion d'une branche, ce que je viens d'utiliser dans mon projet:

  • On suppose: fusion de la branche B à la tête.
  • Identifier revid de commettre à éviter (R0)
  • Identifier revid de commettre juste avant R0 (R1)

    git merge <R1> 
    git merge -s ours R0 
    git merge B