Belov Solutions

Как просматривать историю коммитов в Git: подробное руководство

Введение в просмотр истории коммитов

Когда вы создали несколько коммитов или клонировали репозиторий с уже существующей историей, вам может понадобиться изучить, какие изменения были внесены. Для этого используется мощная команда git log, которая позволяет просматривать историю коммитов. В этой статье мы разберём, как использовать git log и её опции для анализа изменений в проекте.

Основы команды git log

Для примера возьмём простой проект simplegit. Чтобы клонировать его, выполните:

git clone https://github.com/schacon/simplegit-progit

После клонирования выполните git log в каталоге проекта, чтобы увидеть историю коммитов:

git log
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700
    Change version number
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 16:40:33 2008 -0700
    Remove unnecessary test
commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 10:31:28 2008 -0700
    Initial commit

По умолчанию git log выводит коммиты в обратном хронологическом порядке (последние — сверху). Вывод включает SHA-1 хеш коммита, имя и email автора, дату и сообщение коммита.

Просмотр изменений в коммитах

Для просмотра изменений, внесённых каждым коммитом, используйте опцию -p или --patch. Чтобы ограничить вывод, например, двумя последними коммитами, добавьте -2:

git log -p -2
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700
    Change version number
diff --git a/Rakefile b/Rakefile
index a874b73..8f94139 100644
--- a/Rakefile
+++ b/Rakefile
@@ -5,7 +5,7 @@ require 'rake/gempackagetask'
 spec = Gem::Specification.new do |s|
     s.platform  =   Gem::Platform::RUBY
     s.name      =   "simplegit"
-    s.version   =   "0.1.0"
+    s.version   =   "0.1.1"
     s.author    =   "Scott Chacon"
     s.email     =   "schacon@gee-mail.com"
     s.summary   =   "A simple gem for using Git in Ruby code."
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 16:40:33 2008 -0700
    Remove unnecessary test
diff --git a/lib/simplegit.rb b/lib/simplegit.rb
index a0a60ae..47c6340 100644
--- a/lib/simplegit.rb
+++ b/lib/simplegit.rb
@@ -18,8 +18,3 @@ class SimpleGit
     end
 end
-
-if $0 == __FILE__
-  git = SimpleGit.new
-  puts git.show
-end

Опция -p полезна для код-ревью или быстрого анализа изменений.

Статистика изменений

Для вывода краткой статистики по изменённым файлам используйте опцию --stat:

git log --stat
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700
    Change version number
 Rakefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 16:40:33 2008 -0700
    Remove unnecessary test
 lib/simplegit.rb | 5 -----
 1 file changed, 5 deletions(-)
commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 10:31:28 2008 -0700
    Initial commit
 README           |  6 ++++++
 Rakefile         | 23 +++++++++++++++++++++++
 lib/simplegit.rb | 25 +++++++++++++++++++++++++
 3 files changed, 54 insertions(+)

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

Форматирование вывода

Опция --pretty позволяет настроить формат вывода. Например, --pretty=oneline отображает каждый коммит в одной строке:

git log --pretty=oneline
ca82a6dff817ec66f44342007202690a93763949 Change version number
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 Remove unnecessary test
a11bef06a3f659402fe7563abf99ad00de2209e6 Initial commit

Опция --pretty=format позволяет задать пользовательский формат:

git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 6 years ago : Change version number
085bb3b - Scott Chacon, 6 years ago : Remove unnecessary test
a11bef0 - Scott Chacon, 6 years ago : Initial commit

Полезные спецификаторы формата:

  • %H — полный хеш коммита
  • %h — сокращённый хеш
  • %an — имя автора
  • %ae — email автора
  • %ad — дата автора
  • %ar — относительная дата
  • %s — сообщение коммита

Визуализация веток

Опция --graph добавляет ASCII-граф, показывающий ветвления и слияния:

git log --pretty=format:"%h %s" --graph
* 2d3acf9 Ignore errors from SIGCHLD on trap
*  5e3ee11 Merge branch 'master' of git://github.com/dustin/grit
|\
| * 420eac9 Add method for getting the current branch
* | 30e367c Timeout code and tests
* | 5a09431 Add timeout protection to grit
* | e1193f8 Support for heads with slashes in them
|/
* d6016bc Require time for xmlschema
*  11d191e Merge branch 'defunkt' into local

Это полезно для анализа сложных историй ветвления.

Ограничение вывода

Команда git log поддерживает фильтры для ограничения вывода. Например, чтобы показать последние два коммита:

git log -2

Для фильтрации по времени используйте --since и --until:

git log --since=2.weeks

Или по конкретной дате:

git log --since="2008-01-15" --until="2008-02-15"

Фильтрация по автору или ключевому слову в сообщении:

git log --author="Junio C Hamano" --grep="test"

Для поиска коммитов, где изменялась определённая строка кода, используйте -S:

git log -S function_name

Для фильтрации по файлам укажите путь после --:

git log -- path/to/file

Пример сложного фильтра (коммиты за октябрь 2008 года от Junio Hamano, без слияний, в каталоге t/):

git log --pretty="%h - %s" --author='Junio C Hamano' --since="2008-10-01" --before="2008-11-01" --no-merges -- t/
5610e3b - Fix testcase failure when extended attributes are in use
acd3b9e - Enhance hold_lock_file_for_{update,append}() API
f563754 - demonstrate breakage of detached checkout with symbolic link HEAD
d1a43f2 - reset --hard/read-tree --reset -u: remove unmerged new paths
51a94af - Fix "checkout --track -b newbranch" on detached HEAD
b0ad11e - pull: allow "git pull origin $something:$current_branch" into an unborn branch

Отзывы

Оставить отзыв

Ваша эл. почта не будет опубликована