2017-08-09 8 views
2

を設定し合成することができ、次のgit枝を想定:A - > B - > C - > D - > E - > F - > Gは、私は単一の変更をスキップgitの中に分岐が

私は経由を決定しましたgit bisect Cをコミットするとバグが導入されましたが、ブランチの上部でCによって導入された変更を元に戻しても問題は解決しません。これは、そのブランチの後のコミットに他のバグがあることを私に示しました。 A - > B - > D1 - > E1 - > F1 - > G1ここで、1はコミットCに導入された変更が存在しないことを示します。私は他のバグを見つけることを決定するために、そのブランチにgit bisectを実行します。 [うまくいけば、これを複数回繰り返す必要がありません]

答えて

4

はい:

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

これら<specifier> sが最初に戻ってnumberをカウントする~numberと生のハッシュIDを、または支店名、支店名を指定できコミットなどがあります。このトリックは、最後の良いコミットで終了する新しいブランチを作成し、その後、既知の悪いコミットを除いた残りの多分良いコミットをチェリーピックすることです。

このブランチを作成したら、git rebase -iまたはgit rebase --onto <target> <exclude>を使用して、必要に応じてコミットをさらに減らすことができます。

+1

注意、ちなみに、[Jonathan.Brinkの方法](https://stackoverflow.com/a/45600474/1256452)は基本的に同じですが、彼は古いブランチと同じチップで新しいブランチから始めます。コミットを削除します。繰り返し削除する必要がある場合、これはより便利に感じるかもしれません。しかし、1つのインタラクティブ・リベース・ステップ(またはファンシーな 'rebase -onto'フットワーク)が必要です。 – torek

2

対話的に再コミットして、そのコミットを削除できます。

まず、テストブランチを作成します。

git checkout -b test 

次に、リベースを開始します。

git rebase -i C^ # the parent of C 

あなたはインタラクティブなリベース画面にある場合、Cをコミット含む行を削除します。

これにより、ブランチが効果的にA -> B -> D1 -> E1 -> F1 -> G1と一致するようになり、テストを続行できます。

あなたはCはあなたが削除する必要があるだけにコミットしていることが判明した場合、別のオプションは、すでにプッシュコミットを変更する任意の歴史をプッシュする必要はありませんので、それを元に戻すために、次のようになります。

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