После того, как вы создадите несколько коммитов, или же вы склонируете репозиторий с уже существующей историей коммитов, вы вероятно захотите оглянуться назад и узнать что же происходило с этим репозиторием. Наиболее простой и в то же время мощный инструмент для этого — команда
git log
.
Данные примеры используют очень простой проект названный simplegit
, который я часто использую для демонстраций. Чтобы получить этот проект выполните:
git clone git://github.com/schacon/simplegit-progit.git
В результате выполнения git log
в данном проекте, вы должны получить что-то вроде этого:
$ git log
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon
Date: Sat Mar 15 16:40:33 2008 -0700
removed unnecessary test code
commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon
Date: Sat Mar 15 10:31:28 2008 -0700
first commit
По умолчанию, без аргументов, git log
выводит список коммитов созданных в данном репозитории в обратном хронологическом порядке. То есть самые последние коммиты показываются первыми. Как вы можете видеть, эта команда отображает каждый коммит вместе с его контрольной суммой SHA-1, именем и электронной почтой автора, датой создания и комментарием.
Существует превеликое множество параметров команды git log
и их комбинаций, для того чтобы показать вам именно то, что вы ищете. Здесь мы покажем вам несколько наиболее часто применяемых.
Один из наиболее полезных параметров — это -p
, который показывает дельту(разницу/diff) привнесенную каждым коммитом. Вы также можете использовать -2
, что ограничит вывод до 2-х последних записей:
$ git log -p -2
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon
Date: Mon Mar 17 21:52:11 2008 -0700
changed the 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.version = "0.1.0"
+ s.version = "0.1.1"
s.author = "Scott Chacon"
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon
Date: Sat Mar 15 16:40:33 2008 -0700
removed unnecessary test code
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
\ No newline at end of file
Этот параметр показывает ту же самую информацию плюс внесённые изменения, отображаемые непосредственно после каждого коммита. Это очень удобно для инспекций кода или для того, чтобы быстро посмотреть что происходило в результате последовательности коммитов добавленных коллегой. С командой git log
вы также можете использовать группы суммирующих параметров. Например, если вы хотите получить некоторую краткую статистику по каждому коммиту, вы можете использовать параметр --stat
:
$ git log --stat
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number
Rakefile | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon
Date: Sat Mar 15 16:40:33 2008 -0700
removed unnecessary test code
lib/simplegit.rb | 5 -----
1 files changed, 0 insertions(+), 5 deletions(-)
commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon
Date: Sat Mar 15 10:31:28 2008 -0700
first commit
README | 6 ++++++
Rakefile | 23 +++++++++++++++++++++++
lib/simplegit.rb | 25 +++++++++++++++++++++++++
3 files changed, 54 insertions(+), 0 deletions(-)
Как видно из лога, параметр --stat
выводит под каждым коммитом список измененных файлов, количество измененных файлов, а также количество добавленных и удаленных строк в этих файлах. Он также выводит сводную информацию в конце. Другой действительно полезный параметр — это --pretty
. Он позволяет изменить формат вывода лога. Для вас доступны несколько предустановленных вариантов. Параметр oneline выводит каждый коммит в одну строку, что удобно если вы просматриваете большое количество коммитов. В дополнение к этому, параметры short
, full
, и fuller
практически не меняя формат вывода позволяют выводить меньше или больше деталей соответственно:
$ git log --pretty=oneline
ca82a6dff817ec66f44342007202690a93763949 changed the version number
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test code
a11bef06a3f659402fe7563abf99ad00de2209e6 first commit
Наиболее интересный параметр — это format
, который позволяет вам полностью создать собственный формат вывода лога. Это особенно полезно, когда вы создаете отчеты для автоматического разбора(парсинга) — поскольку вы явно задаете формат и уверены в том, что он не будет изменяться при обновлениях Git:
$ git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 11 months ago : changed the version number
085bb3b - Scott Chacon, 11 months ago : removed unnecessary test code
a11bef0 - Scott Chacon, 11 months ago : first commit
Таблица 2-1 содержит список наиболее полезных параметров формата.
Параметр Описание выводимых данных
`%H` Хеш коммита
`%h` Сокращенный хеш коммита
`%T` Хеш дерева
`%t` Сокращенный хеш дерева
`%P` Хеши родительских коммитов
`%p` Сокращенные хеши родительских коммитов
`%an` Имя автора
`%ae` Электронная почта автора
`%ad` Дата автора (формат соответствует параметру --date= )
`%ar` Дата автора, относительная (пр. "2 мес. назад")
`%cn` Имя коммитера
`%ce` Электронная почта коммитера
`%cd` Дата коммитера
`%cr` Дата коммитера, относительная
`%s` Комментарий
Вас может заинтересовать в чём же разница между автором и коммитером. Автор — это человек, изначально сделавший работу, тогда как коммитер — это человек, который последним применил эту работу. Так что если вы послали патч(заплатку) в проект и один из основных разработчиков применил этот патч, вы оба не будете забыты — вы как автор, а разработчик как коммитер. Мы чуть подробнее рассмотрим это различие в Главе Распределённый Git.
Параметры oneline
и format
также полезны с другим параметром команды log
— --graph
. Этот параметр добавляет миленький ASCII граф показывающий историю ветвлений и слияний. Один из таких можно увидеть для нашей копии репозитория проекта Grit:
$ 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 Added a 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
— их гораздо больше. Нижеслудующая таблица содержит как параметры уже рассмотренные нами так и другие могущие быть полезными параметры, вместе с описанием эффекта от их использования.
Параметр Описание
`-p` Выводит патч (заплатку/diff) внесенный каждым коммитом.
`--stat` Выводит статистику по файлам измененным в каждом коммите.
`--shortstat` Отображает только строку с changed/insertions/deletions от вывода команды `--stat`.
`--name-only` Выводит список измененных файлов после каждого коммита.
`--name-status` Выводит список файлов вместе с информацией о добавлении/изменении/удалении.
`--abbrev-commit` Выводит только первые несколько символов контрольной суммы SHA-1 вместо всех 40.
`--relative-date` Выводит дату в относительном формате (например, “2 недели назад”) вместо использования полного формата даты.
`--graph` Выводит ASCII граф истории ветвлений и слияний рядом с выводом лога.
`--pretty` Выводит коммиты в альтернативном формате. Параметры включают oneline, short, full, fuller, и format (где вы можете указать свой собственный формат).
Ограничение вывода команды log
Кроме опций для форматирования вывода,git log
имеет ряд полезных ограничительных параметров, то есть параметров, которые дают возможность отобразить часть коммитов. Вы уже видели один из таких параметров — параметр -2
, который отображает только два последних коммита. На самом деле, вы можете задать - , где n
это количество отображаемых коммитов. На практике вам вряд ли придётся часто этим пользоваться потому, что по умолчанию Git через канал (pipe) отправляет весь вывод на pager
, так что вы всегда будете видеть только одну страницу.
А вот, параметры ограничивающие по времени такие как --since
и --until
весьма полезны. Например, следующая команда выдаёт список коммитов сделаных за последние две недели:
$ git log --since=2.weeks
Такая команда может работать с множеством форматов — вы можете указать точную дату (“2008-01-15
”) или относительную дату такую как “2 years 1 day 3 minutes ago
”.
Вы также можете отфильтровать список коммитов так, чтобы получить те, которые удовлетворяют какому-то критерию поиска. Опция --author
позволяет фильтровать по автору, опция --grep
позволяет искать по ключевым словам в сообщении. (Заметим, что, если вы укажете и опцию author
, и опцию grep
, то будут найдены все коммиты, которые удовлетворяют первому ИЛИ второму критерию. Чтобы найти коммиты, которые удовлетворяют первому И второму критерию, следует добавить опцию --all-match
.)
Последняя действительно полезная опция-фильтр для git log
это путь. Указав имя директории или файла, вы ограничите вывод log
теми коммитами, которые вносят изменения в указанные файлы. Эта опция всегда указывается последней и обычно предваряется двумя минусами (--
), чтобы отделить пути от остальных опций.
В нижеследующей таблице для справки приведён список часто употребляемых опций.
Опция Описание
`-(n)` Показать последние n коммитов
`--since`, `--after` Ограничить коммиты теми, которые сделаны после указанной даты.
`--until`, `--before` Ограничить коммиты теми, которые сделаны до указанной даты.
В верхней части окна располагается история коммитов вместе с подробным графом наследников. Просмотрщик дельт в нижней половине окна отображает изменения сделанные выбранным коммитом. Указать коммит можно с помощью щелчка мышью.`--author` Показать только те коммиты, автор которых соответствует указанной строке.
`--committer` Показать только те коммиты, коммитер которых соответствует указанной строке.
Например, если вы хотите посмотреть из истории Git такие коммиты, которые вносят изменения в тестовые файлы, были сделаны Junio Hamano, не являются слияниями и были сделаны в октябре 2008го, вы можете выполнить что-то вроде такого:
$ git log --pretty="%h - %s" --author=gitster --since="2008-10-01" \
--before="2008-11-01" --no-merges -- t/
5610e3b - Fix testcase failure when extended attribute
acd3b9e - Enhance hold_lock_file_for_{update,append}()
f563754 - demonstrate breakage of detached checkout wi
d1a43f2 - reset --hard/read-tree --reset -u: remove un
51a94af - Fix "checkout --track -b newbranch" on detac
b0ad11e - pull: allow "git pull origin $something:$cur
Из примерно 20 000 коммитов в истории Git, данная команда выбрала всего 6 коммитов соответствующих заданным критериям.
Использование графического интерфейса для визуализации истории
Если у вас есть желание использовать какой-нибудь графический инструмент для визуализации истории коммитов, можно попробовать распространяемую вместе с Git программу gitk
, написанную на Tcl/Tk. В сущности gitk
— это наглядный вариант git log
, к тому же он принимает почти те же фильтрующие опции, что и git log
. Если набрать в командной строке gitk
находясь в проекте, вы увидете что-то наподобие Рис. 2-2.
Рисунок 2-2. Визуализация истории с помощью gitk
В верхней части окна располагается история коммитов вместе с подробным графом наследников. Просмотрщик дельт в нижней половине окна отображает изменения сделанные выбранным коммитом. Указать коммит можно с помощью щелчка мышью.
Pro Git