Поиск проблем - Git Bisect

Предположим версия 2.6.18 вашего проекта работала, но версия в ветке master падает. Иногда самый лучший способ найти причину этой регрессии(проблемы) это выполнить брут-форс поиск сквозь всю историю проекта, чтобы найти тот коммит который вызывает крах приложения. Команда git bisect поможет вам в этом:

$ git bisect start
$ git bisect good v2.6.18
$ git bisect bad master
Bisecting: 3537 revisions left to test after this
[65934a9a028b88e83e2b0f8b36618fe503349f8e] BLOCK: Make USB storage depend on SCSI rather than selecting it [try #6]

Если вы выполните "git branch" в этот момент, вы увидите что git переместил вас временно в новую ветку с имененм "bisect". Эта ветка указывает на коммит (коммит с id 65934...) который можно достичь из ветки "master" но не из v2.6.18. Скомпилируйте и протестируйте его, и узнайте падает ли программа. Положим что да, тогда:

$ git bisect bad
Bisecting: 1769 revisions left to test after this
[7eff82c8b1511017ae605f0c99ac275a7e21b867] i2c-core: Drop useless bitmaskings

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

После приблизительно 13 тестов (в этом случае), вы получите в результате id коммита-виновника аварий. Вы можете затем исследовать коммит с помощью git show, чтобы найти того кто создал его, и написать отчет об ошибке с id коммита. В заключении выполните

$ git bisect reset

чтобы вернуть вас в ветку в которой вы были до этого и удалить временную ветку "bisect".

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

$ git bisect visualize

которая выполнит gitk и укажет выбранный ею коммит маркером который говорит "bisect". Выберите безопасно выглядящий коммит рядом, отметьте id этого коммита, и извлеките его выполнив:

$ git reset --hard fb47ddb2db...

затем протестируйте, выполните "bisect good" или "bisect bad" как более подходящее, и продолжите.



github logo