Git
Chapters ▾ 2nd Edition

2.3 Основите на Git - Прикажување на историјата на извршување

Прикажување на историјата на извршување

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

    changed the version number

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 16:40:33 2008 -0700

    removed unnecessary test

commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 10:31:28 2008 -0700

    first commit

Стандардно, без аргументи, git log ги наведува извршените обврски направени во тој репозиториум во обратен хронолошки редослед - односно, најновите залози се појавуваат прво. Како што можете да видите, оваа команда ги прикажува сите извршени со SHA-1 контролната сума, името на авторот и е-поштата, датумот напишан и пораката за извршување.

Голем број и различни опции за командата git log се достапни за да ви го покажат токму она што го барате. Еве, ќе ви покажеме некои од најпопуларните.

Една од покорисни опции е -p или` --patch`, што ја покажува разликата (patch output) воведена во секоја заложба. Исто така, можете да го ограничите бројот на прикажаните записи на дневникот, како што се употребува -2 за да се прикажат само последните две записи.

$ git log -p -2
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
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.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

    removed 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

    changed the 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

    removed 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

    first commit

 README           |  6 ++++++
 Rakefile         | 23 +++++++++++++++++++++++
 lib/simplegit.rb | 25 +++++++++++++++++++++++++
 3 files changed, 54 insertions(+)

Како што можете да видите, опцијата --stat отпечатоци под секој извршен запис го наведува списокот на изменети датотеки, колку датотеки се променети и колку линии во тие датотеки се додадени и отстранети. Исто така, на крајот го става резимето на информациите.

Друга навистина корисна опција е -трично. Оваа опција го менува излезот на дневникот во формати различни од стандардните. Неколку пред-изградени опции се достапни за вас. Опцијата online опција го печати секое извршување на една линија, што е корисно ако барате многу обврски. Покрај тоа, опциите кратки,` full` и fuller го прикажуваат излезот во приближно ист формат, но со помалку или повеќе информации, соодветно:

$ git log --pretty=oneline
ca82a6dff817ec66f44342007202690a93763949 changed the version number
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test
a11bef06a3f659402fe7563abf99ad00de2209e6 first commit

Најинтересната опција е format, која ви овозможува да го наведете вашиот сопствен излез формат. Ова е особено корисно кога генерирате излез за парсирање на машината - затоа што експлицитно го специфицирате формат, знаете дека нема да се промени со надградби на Git:

$ git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 6 years ago : changed the version number
085bb3b - Scott Chacon, 6 years ago : removed unnecessary test
a11bef0 - Scott Chacon, 6 years ago : first commit

Useful options for git log --pretty=format набројува некои од покорисни опции кои "format" ги зема.

Table 1. Useful options for git log --pretty=format
Option Description of Output

%H

Commit hash

%h

Abbreviated commit hash

%T

Tree hash

%t

Abbreviated tree hash

%P

Parent hashes

%p

Abbreviated parent hashes

%an

Author name

%ae

Author email

%ad

Author date (format respects the --date=option)

%ar

Author date, relative

%cn

Committer name

%ce

Committer email

%cd

Committer date

%cr

Committer date, relative

%s

Subject

Може да се прашувате што е разликата помеѓу author и committer. Авторот е лицето кое првично го напишало делото, а комисионерот е лицето кое последно ја применило работата. Значи, ако испратите во печ за проект и еден од клучните членови го примени крперот, и двајцата добиете кредит - вие како автор, и суштински член како обврска. Оваа разлика ќе ја покриеме малку повеќе во << ch05-distributed-git >>.

Опциите 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 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 - има многу повеќе. Common options to git log ги набројува опциите што ги опфативме досега, како и некои други заеднички опции за форматирање кои можат да бидат корисни, заедно со тоа како тие го менуваат излезот на командата за најавување.

Table 2. Common options to git log
Option Description

-p

Show the patch introduced with each commit.

--stat

Show statistics for files modified in each commit.

--shortstat

Display only the changed/insertions/deletions line from the --stat command.

--name-only

Show the list of files modified after the commit information.

--name-status

Show the list of files affected with added/modified/deleted information as well.

--abbrev-commit

Show only the first few characters of the SHA-1 checksum instead of all 40.

--relative-date

Display the date in a relative format (for example, “2 weeks ago”) instead of using the full date format.

--graph

Display an ASCII graph of the branch and merge history beside the log output.

--pretty

Show commits in an alternate format. Options include oneline, short, full, fuller, and format (where you specify your own format).

--oneline

Shorthand for --pretty=oneline --abbrev-commit used together.

Ограничување на излезот од дневникот

Во прилог на опциите за форматирање на излез, git log зема голем број корисни ограничувачки опции - т.е. опции кои ви овозможуваат да прикажете само подмножество на извршувања. Сте виделе една таква опција веќе - опцијата -2, која ги прикажува само последните две обврски. Всушност, можете да направите - <n>, каде што n е цел број за прикажување на последниот` n` извршува. Во реалноста, мала е веројатноста дека ќе го користите толку често, бидејќи Git стандардно ги цевнува сите излезници преку пејџер, така што ќе видите само една страница од излезот од дневникот во исто време.

Сепак, опциите за ограничување на времето, како што се --since и` --until` се многу корисни. На пример, оваа команда ја добива листата на обврски направени во последните две недели:

$ git log --since=2.weeks

Оваа команда работи со многу формати - можете да наведете одреден датум како "2008-01-15" `, или релативен датум, како што се "2 years 1 day 3 minutes ago".

Можете исто така да ја филтрирате листата за да извршите кои што одговараат на некои критериуми за пребарување. Опцијата -author' ви овозможува да филтрирате одреден автор, а опцијата --grep` ви овозможува да пребарувате клучни зборови во пораките за извршување.

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

Друг навистина корисен филтер е опцијата -S (колоквијално се нарекува опција за` pickaxe` на Git), која зема низа и покажува само оние кои се обврзаа дека го смени бројот на појавувања на тој стринг. На пример, ако сакавте да ја пронајдете последната обврска која додаде или отстрани референца за одредена функција, можете да повикате:

$ git log -S function_name

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

Во Options to limit the output of git log ние ќе ги наведеме овие и неколку други општи опции за вашата референца.

Table 3. Options to limit the output of git log
Option Description

-<n>

Show only the last n commits

--since, --after

Limit the commits to those made after the specified date.

--until, --before

Limit the commits to those made before the specified date.

--author

Only show commits in which the author entry matches the specified string.

--committer

Only show commits in which the committer entry matches the specified string.

--grep

Only show commits with a commit message containing the string

-S

Only show commits adding or removing code matching the string

На пример, ако сакате да видите кој извршува модифицирање на тест-датотеки во историјата на изворен код на 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 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 извршува во историјата на изворниот код на Git, оваа команда ги прикажува 6-те кои се совпаѓаат со тие критериуми.

Example 2. Овозможува прикажување на спојувањето

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