Показать все изменения блока кода с помощью git
В git
есть инструмент, который позволяет отследить все изменения одной функции по её имени.
По имени функции
Допустим у нас есть файл module.js
с таким содержимым:
function init() {
// ... init module
}
function exec(task) {
if (task.length > 0) {
// ... do some work
}
if (!result) {
// ... do other work
}
return result;
}
function finish() {
// ... stop module
}
Для отслеживания функции exec
достаточно просто указать её имя:
git log -L :exec:module.js
В это ситуации будут отслеживаться изменения функции exec
от ее начала и до конца. В git хороший инструмент определения блоков функций, который сам найдет и начало и конец функции.
Регулярные выражения
Если случай более сложный и надо найти изменения одного блока внутри функции, то можно использовать регулярные выражения. Ими надо указать начало блока и конец блока. Концом блока считается первое совпадение с регулярным выражением.
git log -L '/task.length/','/}/':module.js
Первая закрывающая фигурная скобка сработает как конец блока. Чтобы точнее сматчить блок, можно усложнять регулярки. Например использовать количество пробелов с начала строки /^ }/
.
Если указать только начальное выражение, то отображаться будут изменения с найденного места и до конца файла:
git log -L '/task.length/':module.js
Найти дату и автора последнего изменения блока
Вы уже подобрали регулярку для сопоставления блока, надо теперь использовать эти данные для поиска дополнительной информации. Например, нам надо найти кто и когда изменил выбранный блок. Используем ключ -s
, который скрывает измененный код. И используем --format
для изменения вывода. Также используем grep
, т.к. в старых версиях git
ключ -s
не работает для отформатированного вывода. head
возьмет первое значение, которое будет указывать самое последнее изменение. cut
отобразит все поля кроме первого. PGLU
- случайное значение, чтобы по нему произвести отсеивание.
git log -s -L :exec:module.js --format="PGLU %at %an %ae" | grep PGLU | head -n 1 | cut -d' ' -f 2-
Источник информации
man git-log
или https://git-scm.com/docs/git-log