Как `git bisect` только на одной ветки?
В проекте, над которым я сейчас работаю, мы сохраняем каждую функцию своей собственной привязкой и объединяем ее назад, чтобы освоить, когда функция готова. Коммиты внутри каждой ветки характеристики могут включать в себя множество "WIP" и ломать функциональность других функций, пока они не станут полными и стабильными.
В любом случае, поскольку главная ветвь commits является единственной (предположительно) стабильной, я хочу git bisect
только на этой ветке.
Есть ли способ ограничить git bisect
только одной ветвью?
Ответы
Ответ 1
Нет простого способа сделать это без дальнейшей работы. Поработав немного, у меня есть кое-что, что может вам помочь.
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
Это начинает git bisect с f9d5924
как ваш хороший коммит и 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
был фиксацией слияния, на которой он не выполнен.
Примечание: это не будет работать, если у вас есть слияние осьминога (слияние, объединяющее более двух ветвей).
Ответ 2
Я думаю, что 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 [email protected]{1}; done
Это делает ветку bisecttemp от команды <first>
, которую мы заботимся, получает список только хэшей между <first>
и <last>
, которые совершаются в диапазоне, о котором мы заботимся, посещает каждый, сбрасывается обратно на bisecttemp ветвь после каждого, не меняя рабочего дерева, совершает все по-другому с хэшем взятого из нее коммита, снова проверяет bisecttemp и затем сбрасывает его обратно до последнего места, в котором была голова, которая является новой фиксацией.
Возможно, существует более разумный способ сделать все это, но основы заключаются в том, что он создает новую ветвь от начала диапазона коммитов, о которых мы заботимся, а затем фиксирует состояние транзакций только для ветки (регулярные коммиты и слияния, но не всякая суб-ветвь) для этого, в порядке. Вы не можете просто выбрать вишню, потому что вишневые кирки смотрят на родителей, и это не сработает при компрометации.
Это действительно не проверено, и все может быть не так. Это просто мысль. Он может быть свернут в функции, которая принимает ряд коммитов.
Ответ 3
Мне тоже хотелось бы найти правильное и родное для git решение этого вопроса, проверяя только фиксацию на одной ветки и, таким образом, "обвиняя" все слияние и/или запрос Pull. Однако:
так как главная ветвь commits является единственной (предположительно) стабильной, я хочу, чтобы git делился только по этой ветке.
Если проблема, вызвавшая этот вопрос, заключается в том, что некоторые из полученных вами коммитов нарушены, и вы не можете проверить, вы можете использовать:
git bisect skip
Чтобы пропустить этот коммит полностью и проверить другой. Это решит проблему, с которой вы столкнулись со сломанными коммитами. Как только вы обнаружите коммит, который нарушил эту функцию, вы можете перейти к слиянию в ветку, которую вы отслеживаете.
Я полагаю, вы могли бы даже git bisect skip
ВСЕ коммиты, которые не сливаются, либо вручную, либо через script. Это дало бы поведение, заданное в вопросе.
Ответ 4
Использовать git bisect на одной ветке без проверки хозяина:
Будьте в ветке, которую хотите проверить.
git bisect start --no-checkout
Это приведет к тому, что bisect начнет работать только с текущей ветвью
Продолжайте свой дефолт как обычно.