Git
Chapters ▾ 2nd Edition

2.3 Osnove Git - Pregled zgodovine pošiljanja

Pregled zgodovine pošiljanja

Ko ste ustvarili nekaj pošiljanj ali če ste klonirali repozitorij z obstoječo zgodovino pošiljanj, boste verjetno želeli pogledati nazaj, da vidite, kaj se je zgodilo. Najosnovnejše in močno orodje za to je ukaz git log.

Te primeri uporabljajo zelo enostaven projekt imenovan “simplegit”. Da dobite projekt, poženite

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

Ko poženete git log v tem projektu, bi morali dobiti izpis, ki izgleda nekako takole:

$ 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

Privzeto brez argumentov git log izpiše pošiljanja, ki so bila narejena v tem repozitoriju v obratnem kronološkem vrstnem redu - to je, najnovejša pošiljanja se prikažejo prva. Kot vidite, ta ukaz izpiše vsako pošiljanje z njegovo SHA-1 preverjeno vsoto, avtorjevim imenom in e-pošto, napisanim datumom in sporočilom pošiljanja.

Veliko število in različne opcije ukaza git log so na voljo, da prikažejo točno to, kar iščete. Tukaj bomo prikazali nekaj najbolj popularnih.

Ena najbolj uporabnih opcij je -p, ki prikaže razlike predstavljene v vsakem pošiljanju. Lahko uporabite tudi -2, ki omeji izpis na samo zadnja dva vnosa:

$ 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
\ No newline at end of file

Ta opcija prikaže enake informacije vendar z razliko, ki direktno sledi vsakemu vnosu. To je zelo uporabno za pregled kode ali za hitro brskanje, kaj se zgodi med serijo pošiljanj, ki jih je sodelavec dodal. Lahko tudi uporabite serijo opcij povzetkov z git log. Na primer, če želite videti nekaj skrajšanih statistik za vsako pošiljanje, lahko uporabite opcijo --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(+)

Kot lahko vidite, opcija --stat izpiše pod vsakim vnosom pošiljanja seznam spremenjenih datotek, koliko datotek je bilo spremenjenih in koliko vrstic v teh datotekah je bilo dodanih ali odstranjenih. Doda tudi povzetek informacij na konec.

Druga resnično uporabna opcija je --pretty. Ta opcija spremeni izpis dnevnika v oblike druge kot privzete. Nekaj vnaprej vgrajenih opcij vam je na voljo za uporabo. Opcija oneline izpiše vsako pošiljanje na eno vrstico, ki je uporabna, če iščete veliko pošiljanj. Kot dodatek, opcije short, full in fuller prikažejo izpis v skoraj enaki obliki, vendar z manj ali več informacijami v zaporedju:

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

Najbolj zanimiva opcija je format, ki vam omogoča določiti vašo lastno obliko izpisa dnevnika. To je posebej uporabno, ko generirate izpis za strojno prevajanje - ker določate obliko eksplicitno, veste, da ne bo spremenilo s posoditvami Git-u:

$ 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 izpiše nekaj bolj uporabnih opcij, ki jih oblika vzame.

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 e-mail

%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

Lahko se sprašujete, kaj je razlika med author in commiter. Avtor (author) je oseb, ki je prvotno napisala delo, napram prispevalec (commiter) je oseba, ki je zadnja dodala delo. Torej, če ste poslali popravek projektu in eden izmed članov jedra doda popravek, oba od vas dobita zasluge - vi kot avtor, in član jedra kot pošiljatelj. To distribucijo bomo pokrili nekoliko bolj v Distribuirani Git.

Ena vrstica in oblika opcij so posebej uporabne z drugimi opcijami log, klicanimi --graph. Ta opcija doda lep manjši ASCII graf, ki prikazuje vašo vejo in zgodovino združevanj:

$ 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

Ta tip izpisa bo postal bolj zanimiv, ko bomo šli skozi razvejanje in združevanje v naslednjem poglavju.

To so samo nekatere enostavne opije oblike izpisa za git log - jih je pa še veliko več. Common options to git log izpisuje opcije, ki smo jih pokrili do sedaj, kot tudi nekatere ostale pogoste opcije oblikovanja, ki so lahko uporabne, skupaj s tem kako spremenijo izpis ukaza dnevnika.

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).

Omejevanje izpisa dnevnika

Kot dodatek k opcijam oblike izpisa, git log vzame število uporabnih opcij omejevanja - to so opcije, ki vam omogočajo prikazati samo podskupek pošiljanj. Videli ste že eno tako opcijo - opcija -2, ki prikaže samo zadnji dve pošiljanji. V bistvu lahko naredite -<n>, kjer je n katerokoli celo število za prikaz zadnjih n pošiljanj. V realnosti zelo verjetno ne boste uporabljali tega pogostokrat, ker Git privzeto preusmeri vse izpise skozi paginacijo, tako da lahko vidite samo eno stran izpisa dnevnika istočasno.

Vendar opcije časovnega omejevanja kot sta --since in --until sta zelo uporabni. Na primer ta ukaz dobi seznam pošiljanj, ki so bila narejena v zadnjih dveh tednih:

$ git log --since=2.weeks

Ta ukaz deluje z veliko oblikami - lahko določite določen datum kot je "2008-01-15" ali relativni datum kot je "2 year 1 day 3 minutes ago".

Lahko tudi filtrirate seznam pošiljanj, da se ujema z nekaterimi kriteriji. Opcija --author vam omogoča filtrirati na določenega avtorja in opcija --grep vam omogoča iskati za ključnimi besedami v sporočilih pošiljanj. (Bodite pozorni, da če želite določiti tako opciji author in grep, morate dodati --all-match drugače bo ukaz ujemal pošiljanja s katero koli opcijo.)

Drug resnično uporaben filter je opcija -S, ki vzame niz in samo prikaže ukaze, ki predstavljajo spremembe kodi, ki je bila dodana ali odstranjena nizu. Na primer, če ste želeli najti zadnje pošiljanje, ki je dodalo ali odstranilo referenco določeni funkciji, lahko kličete:

$ git log -Sfunction_name

Zadnja resnično uporabna opcija za podati git log kot filter je pot - path. Če določite direktorij ali ime datoteke, lahko omejite izpis dnevnika na pošiljanja, ki so predstavila spremembe tem datotekam. To je vedno zadnja opcija in je v splošnem dodana predhodno z dvojnim pomišljajem (--), da loči poti od opcij.

V Options to limit the output of git log bomo izipisali te in nekaj ostalih pogostih opcij za vašo referenco.

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

Na primer, če želite videti, katera pošiljanja, ki so spremenila datoteke testiranja v zgodovini Git izvorne kode so bila poslana od Junio Hamano in niso bila združena v mesecu oktrobru 2008, lahko poženete nekaj takega:

$ 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

Eden skoraj 40,000 pošiljanj v zgodovini Git izvorne kode, ta ukaz prikaže 6, ki se ujemajo tem kriterijem.