Найти в Дзене
"Мы"-Прогер

Отлаживаем программы с помощью... истории Git

История Git - это не менее полезная фича гита, чем объединение работ нескольких программистов. Большинство ошибок, внесённых в код, были внесены недавно. Потому что тестировщики непрерывно тестируют приложение, и, если бы ошибка появилась несколько месяцев назад, то они бы её обнаружили намного раньше. Чтобы найти, какой код менялся недавно, и тем самым сузить круг поиска ошибки, можно нажать на файле правой кнопкой мыши и выбрать Git - Show History (показать историю). Если же вам известно, что ошибка находится в конкретном куске кода, то можно выделить его и нажать Git - Show History for Selection (показать историю для выделения). Если вам непонятен какой-то кусок кода, то выделите его и нажмите Git - Show History for Selection. Отобразится история изменений этого куска кода. Далее нажмите правой кнопкой мыши на интересующем вас коммите и выберите Show All Affected Files, чтобы увидеть все файлы, которые были изменены в этом коммите. Таким образом, изучив весь коммит, вы лучше поймёте
Оглавление

История Git - это не менее полезная фича гита, чем объединение работ нескольких программистов.

Недавняя ошибка

Большинство ошибок, внесённых в код, были внесены недавно. Потому что тестировщики непрерывно тестируют приложение, и, если бы ошибка появилась несколько месяцев назад, то они бы её обнаружили намного раньше.

Чтобы найти, какой код менялся недавно, и тем самым сузить круг поиска ошибки, можно нажать на файле правой кнопкой мыши и выбрать Git - Show History (показать историю). Если же вам известно, что ошибка находится в конкретном куске кода, то можно выделить его и нажать Git - Show History for Selection (показать историю для выделения).

Окно истории гита
Окно истории гита

Непонятный код

Если вам непонятен какой-то кусок кода, то выделите его и нажмите Git - Show History for Selection. Отобразится история изменений этого куска кода. Далее нажмите правой кнопкой мыши на интересующем вас коммите и выберите Show All Affected Files, чтобы увидеть все файлы, которые были изменены в этом коммите. Таким образом, изучив весь коммит, вы лучше поймёте, что имел в виду автор.

На каждом коммите указан автор. Вы можете обратиться к автору, чтобы он объяснил вам что-то относительно своего кода. Это очень эффективно: за короткое время вы узнаете всё самое нужное для вас. Поэтому история гита - важный элемент командной работы.

Метод половинного деления отрезка

Если вам дали исправлять какой-то баг, а по коду не вполне понятно, в каком файле его искать, кода много, причём он сложный - тогда можно попробовать найти коммит, в котором впервые возник баг. Так мы сузим изучение кода до одного коммита.

Итак, предположим, что в текущей версии кода ошибка есть. Открываем Git Log (окно внизу PyCharm / Rider / IntelliJIDEA / ...). Слева него находится список веток. HEAD - это условная ветка, на которой мы сейчас находимся. Жмём дважды на неё, чтобы применить фильтр. Останутся только те коммиты, которые есть в текущей ветке. Нам так и нужно: коммиты, которые ещё не были включены в нашу версию программы, не могут содержать искомую ошибку. Ошибка где-то среди коммитов, присутствующих у нас.

Мы знаем, что в последнем коммите ошибка уже есть. Найдём среди недавних коммитов тот, в котором ошибки ещё нет. Чтобы переключиться на коммит, нажмём на нём правой и выберем Checkout.

Тогда мы получим отрезок, один конец которого с ошибкой (красный), а другой без ошибки (зелёный). Что же происходит в середине отрезка, мы ещё не знаем (белый):

-2

Делим наш условный отрезок пополам и проверяем средний коммит. Допустим, ошибки там ещё нет. Тогда можно сделать логический вывод, что вся половина отрезка снизу до середины - без ошибки:

-3

Про половину отрезка от середины до верха мы ещё ничего не знаем. Возьмём её в качестве нового отрезка. И снова история повторяется: на нижнем конце нового отрезка ошибки ещё нет, на верхнем - есть, внутри - непонятно что. Делим отрезок пополам и проверяем средний коммит. Допустим, ошибка в нём есть:

-4

Тогда в верхней половине отрезка ошибка уже есть, а про нижнюю половину - непонятно. Берём нижнюю половину отрезка в качестве нового отрезка. На нижнем конце ошибки нет, на верхнем - есть. В середине - неизвестно. Проверяем его средний коммит, и так далее. Каждый раз мы делим отрезок пополам, и про одну из половин мы сразу можем сказать, есть там ошибка или нет, а другую половину мы берём в качестве следующего отрезка.

Итак, проверив оставшиеся два коммита, мы нашли коммит, в котором впервые появилась ошибка - это "Изменения-2":

-5

В итоге вместо 11 коммитов мы проверили только 6, а иногда бывает ещё меньше.

Теперь мы можем открыть коммит, в котором впервые появилась ошибка, и изучить его код - мы знаем, что ошибка именно в этом участке кода.