Почему ветка 'git bisect' не знает? - PullRequest
20 голосов
/ 09 сентября 2010

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

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

Чтобы проверить это поведение, я должен запустить свой сценарий зависимый.pl.Но когда bisect переходит на полпути вниз по коду, мой сценарий на 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, ожидая, что смогу найти то, что сломало мой код в зависимом .pl, я в конечном итоге на коммит 'sub f {return2} 'без моей истории изменений из feature-x (то есть, если я запускаю ls, все, что я вижу, - это main.pl, а файл absolute.pl отсутствует).

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

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

1 Ответ

27 голосов
/ 09 сентября 2010

Проблема здесь в том, что 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.

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

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

...