Skip to content
Опубликовано: 2021-02-08
Обновлено: 2021-02-08
Теги: git

Показать все изменения блока кода с помощью 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