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

Почему не известно сообщение "git bisect"?

Я пытаюсь найти источник ошибки, появившейся после фиксации в прошлый день на долговечной ветке (которая будет выпущена намного позже), названной feature-x.

Там есть ошибка. Я нахожу поведение, которого я не ожидаю от своего script, который мог бы быть введен в любой из коммитов до сих пор, особенно потому, что черты master используются сильно в feature-x, но в меньшей степени на самом Мастере.

Чтобы проверить это поведение, мне нужно запустить my script, depend.pl. Но когда bisect прыгает наполовину вниз по коду, мой script не существует на Master, и поэтому его невозможно проверить.

Я считаю, что это связано с тем, что bisect вытаскивает вас в безголовое состояние, но в этом случае я действительно хочу быть в контексте этой другой истории/набора изменений, а не плавать в эфире.

Прежде чем кто-либо скачет, что вы делаете неправильный зуммер, нашей команде нравится слияние ветвей в этих ситуациях, так как метафора хорошо работает для этой ситуации, а не для переустановки.

Я продемонстрирую это, создав образец репо:

git init

echo 'sub f { print $_; }' > main.pl
git add .
git commit -a -m "inital commit"

git branch feature-x
git checkout feature-x
echo 'main::f(1)' > dependent.pl
git add .
git commit -a -m "Starting work on feature X"
git tag dev-1.0

git checkout master
echo "sub f { return 1; }" > main.pl
git commit -a -m "sub f { return 1; }"
echo "sub f { return 2; }" > main.pl
git commit -a -m "sub f { return 2; }"
echo "sub f { return 3; }" > main.pl
git commit -a -m "sub f { return 3; }"

git tag release-1.0

git checkout feature-x
git merge master

echo 'print main::f();' > dependent.pl
git commit -a -m "Updating call to f"

Итак, теперь вы получаете репо, которое выглядит так:

o Updating call to f ( Head of branch 'feature-x' )
o Merge branch master onto feature-x
|\
| o sub f { return 3; } (TAG release-1.0) ( Head of branch 'master' )
| o sub f { return 2; }
| o sub f { return 1; }
o | Starting work on feature X ( TAG 'dev-1.0' )
 \|
  o initial commit

Итак, я запустил команду git bisect start feature-x dev-1.0, ожидая, что смогу найти то, что сломало мой код в файле depend.pl, и я заканчиваю на commit 'sub f {return 2}' без моей истории изменений с feature-x (т.е. если я запустил ls, все, что я вижу, это main.pl и depend.pl отсутствует).

Это ставит меня в непроверенное состояние. Я не могу знать, нарушила ли текущая битка моя работа или нет, и я не могу сказать, что фиксация на хозяине нарушила ее, поэтому я не могу сказать, что это коммит хорошо или плохо.

Как я могу проверить, что сломало мою текущую ветку?

4b9b3361

Ответ 1

Проблема заключается в том, что git bisect - это ветвь. Когда вы говорите ему, что "зависимый" хорош, а "тест" плох, и одно из изменений между ними происходит слиянием, он знает, что для выяснения, где была введена проблема, нужно будет посмотреть Записывает a, b и c - в противном случае все, что он мог бы сказать вам, - это то, нарушено ли это слияние слиянием.

Похоже, что вы ожидаете проверить комбинацию commit b с изменениями из другой ветки, которая является контентом, который не существует в какой-либо фиксации, и git bisect позволяет вам проверять фиксации! Чтобы протестировать этот контент, вам нужно будет выполнить серию тестовых слияний - проверьте b, смените зависимость, дайте вам протестировать, а затем проверьте a или c, зависимые от слияния, дайте вам снова протестировать. Вы можете легко сделать git merge --no-commit dependent после того, как он оставил вас при фиксации b, затем выполните git reset --hard, когда закончите тестирование перед запуском git bisect good/bad.

В противном случае, если я не понял, вы ожидаете, что он не будет проверять какие-либо коммиты в объединенной ветке и проверять только само объединение слиянием (вам все равно, какой из них, b или c сломал его), просто скажите это то, что все на объединенной ветке хорошо. Еще лучше, если вы знаете, что a, b и c не имеют к этому никакого отношения. Тогда вы знаете, даже не проверяя, что они хорошие!

Но одно, чего вы не можете ожидать, - это git, чтобы полностью игнорировать совершает a, b и c. У него нет абсолютно никакого способа узнать, соответствуют ли их изменения вашей "ошибке", и их изменения являются частью разницы между вашими хорошими и плохими коммитами.