Я выбираю неписаный вариант (4): разделите ваш проект на узкоспециализированные сборки / библиотеки, чтобы несвязанные ошибки всегда находились в другом месте в дереве управления версиями.
Я прошу прощения, если вышесказанное звучит странно, но я имею в виду это искренне. Я съеживаюсь всякий раз, когда вижу монолитный проект с сотней форм и пространств имен, которые не имеют ничего общего друг с другом. Я часто сталкивался с той же самой дилеммой, задаваясь вопросом, нужно ли и как мне разбивать коммиты, имеющие дело с различными функциональными областями; только спустя много времени я понял, что наличие всех этих различных функциональных областей в одном коммитируемом проекте само по себе является серьезным недостатком дизайна.
Я все еще часто нахожу совершенно несвязанные ошибки, пока я работаю над определенной функцией. Я мог бы работать над пользовательским интерфейсом и найти ошибку в некоторой бизнес-логике, и мне нужно исправить ее, прежде чем я смогу двигаться дальше. Разница в том, что бизнес-логика всегда находится в сборке / проекте, отличном от пользовательского интерфейса, поэтому все, что мне нужно сделать, - это внести одно очень незначительное изменение в BL и выполнить одну очень незначительную фиксацию, а затем продолжить работу.
Наличие действительно хорошей организации проекта делает не только возможным, но и довольно простым решение этих проблем, не скрывая изменений, не нарушая сборку и не попадая в раздражающую ветвь / слияние (даже если вы используете DVCS, это не совсем безболезненно). ).
Если вам не хватает этой опции - то есть вы младший разработчик, который не имеет права голоса в организации проекта - тогда я бы просто пошел с # 1 и сделал соответствующие записи в журнале, чтобы другие люди знали, почему вы сделали то, что сделали. Если вы сделали серьезное изменение, то также подайте отчет об ошибке в вашей системе отслеживания ошибок, чтобы увидеть, что вы исправили и почему.