Git
Chapters ▾ 2nd Edition

2.3 Основе програма Гит - Преглед историје комитова

Преглед историје комитова

Када сте направили неколико комитова, или сте клонирали репозиторијум са постојећом историјом комитова, вероватно ћете хтети да погледате уназад да видите шта се дешавало. Најосновнији и најмоћнији алат за ово је команда 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 контролном сумом, ауторовим именом и мејлом, датумом када је написан и комит поруком.

Постоји велики број опција за команду git log које ће вам помоћи да се прикаже тачно оно што тражите. Овде ћемо представити неке најпопуларније.

Једна од опција које су од највеће помоћи је -p или --patch, која приказује разлику (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

Ова опција приказује исту информацију с тим што разлика директно следи након сваке ставке. Ово је веома корисно када се врши преглед кода или да се брзо сазна шта се догодило са кодом након низа комитова које је урадила особа која даје допринос пројекту. Са git log можете да употребите и низ опција за скраћење. На пример, ако желите да видите неке скраћене статистике за сваки комит, можете искористити опцију --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(+)

Као што видите, опција --stat испод сваког комита исписује листу измењених фајлова, колико је фајлова промењено и колико је линија у тим фајловима додато и обрисано. На крају исписује и резиме информација.

Још једна веома корисна опција је --pretty. Ова опција мења излаз лога у неки формат који није подразумевани. Припремљено је неколико опција које можете да користите. Вредност oneline за ову опцију исписује сваки комит у једну линију, што је веома корисно ако гледате пуно комитова. Ту су и вредности short, full и fuller које исписују у сличном формату али са мање или више информација, респективно:

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

Најзанимљивија вредност опције је 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

Корисне опције за git log --pretty=format представља листу неких од кориснијих спецификатора које узима format.

Табела 1. Корисне опције за git log --pretty=format
Спецификатор Опис излаза

%H

Хеш комита

%h

Скраћени хеш комита

%T

Хеш стабла

%t

Скраћени хеш стабла

%P

Хешеви родитеља

%p

Скраћени хешеви родитеља

%an

Име аутора

%ae

Мејл аутора

%ad

Датум аутора (формат поштује --date=option)

%ar

Датум аутора, релативан

%cn

Име комитера

%ce

Мејл комитера

%cd

Датум комитера

%cr

Датум комитера, релативан

%s

Наслов

Можда се питате која је разлика између аутора и комитера. Аутор је особа која је првобитно направила фајл, а комитер је особа која је последња допринела промене. Значи ако пошаљете закрпу пројекту и један од главних чланова је примени, обојица добијате признање — ви као аутор, а главни члан пројекта као комитер. Ову разлику ћемо детаљније размотрити у Дистрибуирани Гит.

Вредности опције online и format су посебно корисне са још једном log опцијом која се зове --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

Ова врста излаза ће постати занимљивија када у следећем поглављу прођемо кроз гранање и спајање.

To су само неке једноставне опције за форматирање излаза команде git log - има их још пуно. У Честе опције команде git log су наведене опције које смо досад прошли, као и неке друге које би могле да буду корисне, уз кратко објашњење о начину на који мењају излаз.

Табела 2. Честе опције команде git log
Опција Опис

-p

Показује закрпу која је уведена сваким комитом.

--stat

Приказује статистику фајлове измењених у сваком комиту.

--shortstat

Приказује само линију промене/додавања/брисања из --stat команде.

--name-only

Приказује листу измењених фајлова након информације о комиту.

--name-status

Приказује листу промењених фајлова из информацију о линијама које су промењене/додате/обрисане.

--abbrev-commit

Приказује само првих неколико слова из SHA-1 контролне суме уместо свих 40.

--relative-date

Приказује датум у релативном формату (на пример, „2 weeks ago”) уместо комплетног формата датума.

--graph

Приказује ASCII графикон гране и историје спајања поред лога.

--pretty

Приказује комитове у алтернативном формату. Међу вредностима опције су oneline, short, full, fuller, и format (где би требало да наведете сопствени формат).

Ограничавање исписа лога

Поред опција за форматирање излаза, git log прима и велики број корисних опција за ограничавање — другим речима, опција којима можете задати приказ само једног подскупа комитова. Већ сте видели једну од њих — опцију -2, која приказује само последња два комита. Заправо, можете да укуцате -<n>, где је n било који природан број и на тај начин прикажете последњих n комитова. У стварности је нећете често користити јер програм Гит подразумевано пајпује сав излаз кроз пејџер тако да ћете излаз лога увек гледати страну по страну.

Међутим, опције које ограничавају време, као што су --since и --until, су веома корисне. На пример, следећа команда враћа листу комитова који су урађени у последње две недеље:

$ git log --since=2.weeks

Ова команда ради са пуно формата — можете да наведете тачан датум као „2008-01-15” или релативни датум као „2 years 1 day 3 minutes ago”.

Листу комитова можете филтрирати и тако да задовољи неки критеријум претраге. Опција --author вам омогућава да прикажете комитове само од наведеног аутора, а са --grep можете тражити кључне речи у комит порукама.

Белешка

Можете да задате и више од једне инстанце --author и --grep критеријума претраге који ће онда да ограниче излаз комитова тако да се подударају са било којим од --author шаблона и било којим од --grep шаблона; међутим, додавање --all-match опције додатно ограничава излаз на само оне комитове који се подударају са свим --grep шаблонима.

Још један веома користан филтер је -S опција (која се у жаргону назива Гитова „pickaxe” тј. пијук опција) која узима стринг и показује само комитове који су променили број појављивања тог стринга у коду. На пример, ако желите да нађете последњи комит који је додао или обрисао референцу на неку одређену функцију, можете да позовете

$ git log -S име_функције

Последња веома корисна опција коју као филтер можете проследити команди git log је путања. Ако наведете директоријум или име фајла, излаз лога можете да ограничите само на комитове који су увели измене над тим фајловима. Ово је увек последња опција и генерално се испред ње стављају две цртице (--) да би се путање одвојиле од осталих опција:

$ git log -- путања/до/фајла

Опције за ограничавање команде git log као подсетник приказује неколико ових и неколико других честих опција.

Табела 3. Опције за ограничавање команде git log
Опција Опис

-<n>

Приказује само последњих n комитова.

--since, --after

Приказује комитове који су направљени после наведеног датума.

--until, --before

Приказује комитове који су направљени пре наведеног датума.

--author

Приказује само комитове код којих се наведени стринг подудара са именом аутора.

--committer

Приказује само комитове код којих наведени стринг подудара са именом комитера.

--grep

Приказује само комитове код којих комит порука садржи наведени стринг.

-S

Приказује само комитове који додају или бришу код који се подудара са стрингом.

На пример, ако желите да видите комитове који су изменили тест фајлове у Гит историји изворног кода, а урадио их је корисник Junio Hamano у октобру 2008 и нису комити спајања, можете да извршите овакву команду:

$ 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

Од скоро 40.000 комитова у Гит историји изворног кода, ова команда је приказује оних 6 који задовољавају наведене услове.

Савет
Спречавање приказа комита спајања

Зависно од процеса рада који се користи у вашем репозиторијуму, може бити да поприличан проценат комита у лог историји представљају комити спајања, који обично не пружају корисне информације. Ако желите да спречите затрпавање лог историје комитима спајања, једноставно додајте лог опцију --no-merges.