38

私が現在取り組んでいるプロジェクトでは、各機能を独自のブランチに保持し、機能の準備ができたらマスターにマージします。各機能ブランチ内のコミットには、完成して安定するまで、多くの「WIP」および他の機能の破壊的な機能が含まれる場合があります。

git bisectとにかく、マスター ブランチのコミットは唯一の (おそらく) 安定したものなので、そのブランチだけにしたいのです。

git bisect1 つのブランチだけに制限する方法はありますか?

4

4 に答える 4

27

さらなる作業なしにこれを達成する簡単な方法はありません。しばらくそれで遊んだ後、私はあなたを助けるかもしれない何かを持っています.

git bisect start master f9d5924

for rev in $(git rev-list f9d5924..master --merges --first-parent); do
  git rev-list $rev^2 --not $rev^
done | xargs git bisect skip

f9d5924これにより、良いコミットと悪いコミットとしてgit bisect が開始されmasterます。次に、左側にない各マージ コミットの右側の祖先を見つけます。それらの先祖をgit bisect skipスキップするために渡します。ただし、どのコミットが悪いかを判断すると、悪いマージコミットからスキップされた可能性のあるすべてのコミットが表示されます。次のように

$ git bisect good
There are only 'skip'ped commits left to test.
The first bad commit could be any of:
0622204625d8817c5d8fd1a2a68b3aa91f2dcdf9
0c771566b9e77e3bdc0a66a7404c8eae9f321a68
5098b44f43f84b213eaab110073a6acd26a5cc02
8b05a808d5e15852fbddaa529ba241fdac8ff693
b0c755c3fa57e3c8d527e76fae38bc9925c01353
We cannot bisect more!

この場合b0c755c3fa57e3c8d527e76fae38bc9925c01353、失敗したマージコミットでした。

注:タコのマージ (3 つ以上のブランチをマージするマージ) がある場合、これは機能しません。

于 2013-11-27T17:26:18.047 に答える
0

フラグを使えば簡単にできると思いますgit bisectが、--no-parent存在しません。

私が考えることができる唯一のことは、ブランチコミットだけを新しいブランチに再作成することです。Linux シェルでの例を次に示します。

$ git branch bisecttemp <first>
$ for h in `git log --oneline --decorate --first-parent --reverse --format=%H <first>..<last>`; do git checkout -f $h; sleep .5; git reset bisecttemp; git commit -am"$h"; git checkout testing; git reset --hard HEAD@{1}; done

これにより、関心のあるコミットから bisecttemp ブランチが作成され、関心のある範囲のとコミット<first>の間のハッシュのみのリストが取得され、それぞれにアクセスし、作業ツリーを変更せずに、それぞれの後に bisecttemp ブランチにリセットされ、すべてがコミットされます。元のコミットのハッシュとは異なり、bisecttemp を再度チェックアウトしてから、ヘッドが最後にあった場所 (新しいコミット) にリセットします。<first><last>

これらすべてを行うためのよりスマートな方法があるかもしれませんが、基本は、関心のあるコミットの範囲の開始から新しいブランチを作成し、ブランチのみのコミットの状態をコミットすることです (通常のコミットとマージ、ただし、サブブランチのコミットはありません)、順番に。チェリーピックは親を見て、マージコミットで失敗するため、ここでチェリーピックすることはできません。

これは実際にはテストされておらず、すべて間違っている可能性があります。それはただの考えです。一連のコミットを受け取る関数にすべてまとめることができます。

于 2013-12-02T11:00:46.190 に答える