Подтвердить что ты не робот

Как `git bisect` только на одной ветки?

В проекте, над которым я сейчас работаю, мы сохраняем каждую функцию своей собственной привязкой и объединяем ее назад, чтобы освоить, когда функция готова. Коммиты внутри каждой ветки характеристики могут включать в себя множество "WIP" и ломать функциональность других функций, пока они не станут полными и стабильными.

В любом случае, поскольку главная ветвь commits является единственной (предположительно) стабильной, я хочу git bisect только на этой ветке.

Есть ли способ ограничить git bisect только одной ветвью?

4b9b3361

Ответ 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 начнет работать только с текущей ветвью

Продолжайте свой дефолт как обычно.