Введение в просмотр истории коммитов
Когда вы создали несколько коммитов или клонировали репозиторий с уже существующей историей, вам может понадобиться изучить, какие изменения были внесены. Для этого используется мощная команда 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
Отзывы