2017-08-09 1 views
2

Supposons la branche git suivante: A -> B -> C -> D -> E -> F -> Gje peux synthétiser une branche dans git qui saute un seul changement réglé

j'ai déterminé par git bisect que commettre C a introduit un bogue, mais en inversant les changements introduits par C en haut de la branche ne résout pas le problème. Ceci m'a indiqué qu'il y a d'autres bogues dans des commits postérieurs sur cette branche.

Existe-t-il un moyen de synthétiser la branche suivante: A -> B -> D1 -> E1 -> F1 -> G1, où 1 indique que les changements introduits dans la validation C n'existent pas? Je voudrais ensuite exécuter git bisect sur cette branche ainsi pour déterminer trouver l'autre bogue. [Nous espérons que cela ne serait pas nécessaire de répéter plusieurs fois]

Répondre

4

Oui:

git checkout -b newbranch <specifier-for-B> 
git cherry-pick <specifier-for-C>..<specifier-for-G> 

Ces <specifier> s peuvent être des ID de hachage brutes, ou les noms des succursales ou des noms de branche avec ~number compter dos number premier -commits, et ainsi de suite. L'astuce consiste à créer une nouvelle branche qui se termine au dernier commit, puis à sélectionner les autres commit-good, à l'exclusion du commit connu-bad.

Une fois que vous avez cette nouvelle branche, vous pouvez utiliser git rebase -i ou git rebase --onto <target> <exclude> pour annuler encore plus de validations, si vous le souhaitez.

+1

Note, en passant, que [méthode de Jonathan.Brink] (https://stackoverflow.com/a/45600474/1256452) est fondamentalement la même, sauf qu'il commence avec la nouvelle branche au même astuce que l'ancienne branche, puis vous a remove commits. Si vous devez faire des suppressions répétées, cela peut vous sembler plus pratique. Il a cependant besoin d'une étape de rebasage interactif (ou de fantaisie 'rebase --onto' footwork). – torek

2

Vous pouvez rebaser et supprimer ce commit de manière interactive.

d'abord créer la branche de test:

git checkout -b test 

Ensuite, démarrer le rebasage:

git rebase -i C^ # the parent of C 

Lorsque vous êtes dans l'écran de rebasage interactif, supprimez la ligne qui contient commettre C.

Cela permettra à la branche save de correspondre effectivement à A -> B -> D1 -> E1 -> F1 -> G1 et vous pourrez continuer vos tests.

Si vous trouvez que C était le seul que vous commettez devez supprimer, une autre option serait de revenir si vous n'avez pas besoin de pousser toute l'histoire qui modifie commits déjà: poussé

git checkout master # get back to where you started 
git revert C  # will create a revertion commit 
git push   # will only push 1 new commit, the inverse of C