Chapters ▾ 2nd Edition

2.3 Git Basics - Die vasleggingsgeskiedenis (Commit History) bekyk

Die vasleggingsgeskiedenis (Commit History) bekyk

Nadat jy verskeie vasleggings (commits) geskep het, of as jy 'n bewaarplek (repository) met 'n bestaande vasleggingsgeskiedenis gekloon (cloned) het, sal jy waarskynlik wil terugkyk om te sien wat gebeur het. Die mees basiese en kragtige instrument om dit te doen, is die git log opdrag.

Hierdie voorbeelde gebruik 'n baie eenvoudige projek genaamd “simplegit”. Om die projek te kry, voer uit:

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

Wanneer jy git log in hierdie projek uitvoer, behoort jy afvoer (output) te kry wat min of meer so lyk:

$ 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

By verstek, sonder enige argumente, lys git log die vasleggings (commits) wat in daardie bewaarplek (repository) gemaak is in omgekeerde chronologiese volgorde; dit wil sê, die mees onlangse vasleggings wys eerste. Soos jy kan sien, lys hierdie opdrag elke vaslegging met sy SHA-1 kontrolesom (checksum), die outeur (author) se naam en e-pos, die datum geskryf, en die vasleggingsboodskap (commit message).

'n Groot aantal en verskeidenheid opsies vir die git log opdrag is beskikbaar om vir jou presies te wys waarna jy soek. Hier sal ons jou 'n paar van die gewildstes wys.

Een van die nuttiger opsies is -p of --patch, wat die verskil (die patch afvoer) wys wat in elke vaslegging (commit) ingestel is. Jy kan ook die aantal log-inskrywings (log entries) wat vertoon word beperk, soos om -2 te gebruik om slegs die laaste twee inskrywings te wys.

$ 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

Hierdie opsie vertoon dieselfde inligting, maar met 'n verskil (diff) wat direk na elke inskrywing volg. Dit is baie nuttig vir kodehersiening (code review) of om vinnig te blaai deur wat gebeur het tydens 'n reeks vasleggings (commits) wat 'n medewerker bygevoeg het. Jy kan ook 'n reeks opsommende opsies saam met git log gebruik. Byvoorbeeld, as jy 'n paar verkorte statistieke vir elke vaslegging (commit) wil sien, kan jy die --stat opsie gebruik:

$ 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(+)

Soos jy kan sien, druk die --stat opsie onder elke vasleggingsinskrywing 'n lys van gewysigde lêers af, hoeveel lêers verander is, en hoeveel reëls in daardie lêers bygevoeg en verwyder is. Dit plaas ook 'n opsomming van die inligting aan die einde.

'n Ander baie nuttige opsie is --pretty. Hierdie opsie verander die log-afvoer na ander formate as die verstek. 'n Paar voorafgeboude opsiewaardes is beskikbaar vir jou om te gebruik. Die oneline waarde vir hierdie opsie druk elke vaslegging (commit) op 'n enkele reël af, wat nuttig is as jy na baie vasleggings kyk. Daarbenewens wys die short, full, en fuller waardes die afvoer in min of meer dieselfde formaat, maar met onderskeidelik minder of meer inligting:

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

Die mees interessante opsiewaarde is format, wat jou toelaat om jou eie log-afvoerformaat te spesifiseer. Dit is veral nuttig wanneer jy afvoer genereer vir masjienontleding (machine parsing) — omdat jy die formaat eksplisiet spesifiseer, weet jy dit sal nie verander met opdaterings aan Git nie:

$ 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

Nuttige spesifiseerders vir git log --pretty=format lys van die nuttiger spesifiseerders (specifiers) wat format neem.

Table 1. Nuttige spesifiseerders vir git log --pretty=format
Spesifiseerder Beskrywing van Afvoer

%H

Vaslegging-hash (Commit hash)

%h

Verkorte vaslegging-hash (Abbreviated commit hash)

%T

Boom-hash (Tree hash)

%t

Verkorte boom-hash

%P

Ouer-hashes (Parent hashes)

%p

Verkorte ouer-hashes

%an

Outeur (author) se naam

%ae

Outeur (author) se e-pos

%ad

Outeur-datum (formaat respekteer die --date=option)

%ar

Outeur-datum, relatief

%cn

Vaslêer (committer) se naam

%ce

Vaslêer (committer) se e-pos

%cd

Vaslêer-datum (Committer date)

%cr

Vaslêer-datum, relatief

%s

Onderwerp (Subject)

Jy wonder dalk wat die verskil tussen outeur (author) en vaslêer (committer) is. Die outeur is die persoon wat oorspronklik die werk geskryf het, terwyl die vaslêer die persoon is wat die werk laaste toegepas het. Dus, as jy 'n pleister (patch) na 'n projek instuur en een van die kernlede (core members) pas die patch toe, kry julle albei erkenning — jy as die outeur, en die kernlid as die vaslêer (committer). Ons sal hierdie onderskeid 'n bietjie meer dek in Distributed Git.

Die oneline en format opsiewaardes is veral nuttig saam met 'n ander log opsie genaamd --graph. Hierdie opsie voeg 'n oulike klein ASCII-grafiek by wat jou tak- en saamsmeltingsgeskiedenis (branch and merge history) wys:

$ git log --pretty=format:"%h %s" --graph
* 2d3acf9 Ignore errors from SIGCHLD on trap
*  5e3ee11 Merge branch 'master' of https://github.com/dustin/grit.git
|\
| * 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

Hierdie tipe afvoer sal meer interessant word soos ons in die volgende hoofstuk deur vertakking (branching) en saamsmelting (merging) gaan.

Dit is slegs 'n paar eenvoudige afvoerformateringsopsies vir git log — daar is baie meer. Algemene opsies vir git log lys die opsies wat ons tot dusver gedek het, sowel as 'n paar ander algemene formateringsopsies wat nuttig kan wees, saam met hoe dit die afvoer van die log opdrag verander.

Table 2. Algemene opsies vir git log
Opsie Beskrywing

-p

Wys die pleister (patch) wat met elke vaslegging (commit) ingestel is.

--stat

Wys statistieke vir lêers wat in elke vaslegging gewysig is.

--shortstat

Vertoon slegs die veranderings/invoegings/skrappings reël van die --stat opdrag.

--name-only

Wys die lys van gewysigde lêers na die vasleggingsinligting.

--name-status

Wys ook die lys van geaffekteerde lêers tesame met bygevoegde/gewysigde/geskrapte inligting.

--abbrev-commit

Wys slegs die eerste paar karakters van die SHA-1 kontrolesom in plaas van al 40.

--relative-date

Vertoon die datum in 'n relatiewe formaat (byvoorbeeld, “2 weeks ago”) in plaas daarvan om die volle datumformaat te gebruik.

--graph

Vertoon 'n ASCII-grafiek van die tak- en saamsmeltingsgeskiedenis (branch and merge history) langs die log-afvoer.

--pretty

Wys vasleggings (commits) in 'n alternatiewe formaat. Opsiewaardes sluit in oneline, short, full, fuller, en format (waar jy jou eie formaat spesifiseer).

--oneline

Kortpad vir --pretty=oneline --abbrev-commit wat saam gebruik word.

Log-afvoer Beperk (Limiting Log Output)

Benewens afvoerformateringsopsies, neem git log 'n aantal nuttige beperkingsopsies (limiting options); dit wil sê, opsies wat jou toelaat om slegs 'n subset van vasleggings (commits) te wys. Jy het reeds een so 'n opsie gesien — die -2 opsie, wat slegs die laaste twee vasleggings vertoon. Trouens, jy kan -<n> doen, waar n enige heelgetal (integer) is om die laaste n vasleggings te wys. In werklikheid is dit onwaarskynlik dat jy dit dikwels sal gebruik, omdat Git by verstek (by default) alle afvoer deur 'n blaai-program (pager) stuur sodat jy net een bladsy log-afvoer op 'n slag sien.

Die tydsbeperkingsopsies (time-limiting options) soos --since en --until is egter baie nuttig. Byvoorbeeld, hierdie opdrag kry die lys van vasleggings wat in die afgelope twee weke gemaak is:

$ git log --since=2.weeks

Hierdie opdrag werk met baie formate — jy kan 'n spesifieke datum soos "2008-01-15" spesifiseer, of 'n relatiewe datum soos "2 years 1 day 3 minutes ago".

Jy kan ook die lys filter na vasleggings (commits) wat by sekere soekkriteria pas. Die --author opsie laat jou toe om op 'n spesifieke outeur te filter, en die --grep opsie laat jou soek na sleutelwoorde in die vasleggingsboodskappe (commit messages).

Note

Jy kan meer as een instansie van beide die --author en --grep soekkriteria spesifiseer, wat die vasleggingsafvoer sal beperk tot vasleggings wat by enige van die --author patrone en enige van die --grep patrone pas; die byvoeging van die --all-match opsie beperk die afvoer egter verder tot slegs daardie vasleggings wat by alle --grep patrone pas.

'n Ander baie nuttige filter is die -S opsie (in die volksmond bekend as Git se “pickaxe” opsie), wat 'n string neem en slegs daardie vasleggings (commits) wys wat die aantal voorkomste van daardie string verander het. Byvoorbeeld, as jy die laaste vaslegging wil vind wat 'n verwysing na 'n spesifieke funksie bygevoeg of verwyder het, kan jy dit oproep:

$ git log -S function_name

Die laaste baie nuttige opsie om as 'n filter na git log deur te gee, is 'n pad (path). As jy 'n gids (directory) of lêernaam spesifiseer, kan jy die log-afvoer beperk tot vasleggings wat 'n verandering aan daardie lêers ingestel het. Dit is altyd die laaste opsie en word gewoonlik voorafgegaan deur dubbele koppeltekens (--) om die paaie van die opsies te skei:

$ git log -- path/to/file

In Opsies om die afvoer van git log te beperk sal ons hierdie en 'n paar ander algemene opsies vir jou verwysing lys.

Table 3. Opsies om die afvoer van git log te beperk
Opsie Beskrywing

-<n>

Wys slegs die laaste n vasleggings (commits).

--since, --after

Beperk die vasleggings tot dié wat na die gespesifiseerde datum gemaak is.

--until, --before

Beperk die vasleggings tot dié wat voor die gespesifiseerde datum gemaak is.

--author

Wys slegs vasleggings waar die outeur-inskrywing pas by die gespesifiseerde string.

--committer

Wys slegs vasleggings waar die vaslêer-inskrywing (committer entry) pas by die gespesifiseerde string.

--grep

Wys slegs vasleggings met 'n vasleggingsboodskap (commit message) wat die string bevat.

-S

Wys slegs vasleggings wat kode byvoeg of verwyder wat by die string pas.

Byvoorbeeld, as jy wil sien watter vasleggings (commits) wat toetslêers in die Git-bronkodegeskiedenis wysig, in die maand Oktober 2008 deur Junio Hamano vasgelê (committed) is en nie saamsmeltingsvasleggings (merge commits) is nie, kan jy iets soos hierdie uitvoer:

$ 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

Van die byna 40,000 vasleggings (commits) in die Git-bronkodegeskiedenis, wys hierdie opdrag die 6 wat by daardie kriteria pas.

Tip
Voorkom die vertoning van saamsmeltingsvasleggings (merge commits)

Afhangende van die werkvloei (workflow) wat in jou bewaarplek (repository) gebruik word, is dit moontlik dat 'n aansienlike persentasie van die vasleggings in jou log-geskiedenis net saamsmeltingsvasleggings (merge commits) is, wat tipies nie baie insiggewend is nie. Om te verhoed dat die vertoning van saamsmeltingsvasleggings jou log-geskiedenis bemors, voeg bloot die log opsie --no-merges by.