Education 1.1 Help

Анализ истории изменений

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

Но так происходит не всегда. Код может вызывать вопросы. Почему он написан именно так, кто его написал и когда.

Ответить на эти вопросы помогает история изменений. Хорошо сделанные коммиты имеют понятное описание, и каждый из них делает ровно одну законченную вещь — в таком случае история становится мощным инструментом для анализа кода. Именно поэтому так важно хорошо понимать философию Git и следовать лучшим практикам при работе с ним.

Git предоставляет целую пачку команд со множеством опций, позволяющих вытащить невероятное количество информации и показать все, что скрыто. С ними мы познакомимся в этом уроке.

Команда git log

Самая простая аналитика выполняется командой git log. Она показывает список всех выполненных коммитов, отсортированных по дате добавления. Сверху мы видим самые последние коммиты:

git log # Ниже неполный вывод истории проекта commit 5120bea3e5528c29f8d1da43731cbe895892eb6d Author: tirion <tirion@got.com> Date: Thu Sep 17 18:04:19 2020 -0400 add new content commit e6f625cf8433c8b1f1aaed58cd2b437ec8a60f27 Author: tirion <tirion@got.com> Date: Thu Sep 17 16:14:09 2020 -0400 add INFO.md commit 273f81cf2117044f1973ea80ce1067a94bea3f80 Author: tirion <tirion@got.com> Date: Thu Sep 17 16:08:39 2020 -0400 remove NEW.md # Этот вывод показывается через пейджер

Из этого вывода мы можем узнать кто, когда и какие коммиты делал. Если коммиты оформлены хорошо, то по их описанию уже многое понятно. Оформление коммитов — отдельная тема, которую мы рассмотрим позже.

У команды git log есть полезный флаг -p, который сразу выводит диф для каждого коммита:

Команда git show

У каждого коммита есть уникальный набор символов — идентификатор (еще говорят «хеш»). С помощью хеша можно посмотреть все изменения, сделанные в рамках одного коммита:

git show 5120bea3e5528c29f8d1da43731cbe895892eb6d # Тут выводится диф между этим коммитом и предыдущим diff --git a/INFO.md b/INFO.md index d5225f8..40f51f1 100644 --- a/INFO.md +++ b/INFO.md @@ -1 +1,2 @@ git is awesome! +new line diff --git a/README.md b/README.md index ffe7ece..00fd294 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -Hello, my dear Friend! +Hello, Friend! How are you? # Здесь мы видим, что было изменено этим коммитом

Хеши коммитов в Git очень длинные, и ими бывает неудобно пользоваться. Поэтому разработчики Git добавили возможность указывать только часть хеша. Достаточно взять первые семь символов и подставить их в ту команду, которая работает с коммитами:

git show 5120bea

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

Команда git blame

А что если мы не знаем коммита, но нам интересно, кто последним менял конкретную строчку в файле? Для этого подойдет команда git blame <путь до файла>. Эта команда выводит файл и рядом с каждой строчкой показывает того, кто ее менял и в каком коммите:

git blame INFO.md e6f625cf (tirion 2020-09-17 16:14:09 -0400 1) git is awesome! 5120bea3 (tirion 2020-09-17 18:04:19 -0400 2) new line

Важно помнить, что изменение строчки — не то же самое, что ее написание. Вполне возможно, что программист исправил небольшую опечатку, а саму строчку написал кто-то до него. Имея такой вывод, уже легко пойти дальше и изучить конкретный коммит.

Команда git grep

Команда git grep ищет совпадение с указанной строкой во всех файлах проекта. Это очень удобная команда для быстрого анализа из терминала. Она удобнее обычного grep, потому что знает про игнорирование и не смотрит в директорию .git, а еще умеет искать по истории:

git grep line INFO.md:new line # Флаг `i` позволяет искать без учета регистра git grep -i friend README.md:Hello, Firend! How are you? # Поиск в конкретном коммите git grep Friend 5120bea # Поиск по всей истории # Возвращаем список хешей коммитов `rev-list` git grep Friend $(git rev-list --all)

asciinema

GitHub

В простых ситуациях анализировать проект можно прямо на GitHub. Он позволяет просматривать историю коммитов, изменения в конкретном коммите и многое другое.

Самостоятельная работа

  1. Выполните все команды из урока в нашем репозитории

  2. Изучите историю репозитория ru-local-communities

Дополнительные материалы

  1. Просмотр истории коммитов

  2. Поиск ошибок

  3. Поиск по коду и истории

Last modified: 12 June 2024