Git
Chapters ▾ 2nd Edition

2.3 Osnove Git - Pregled zgodovine potrditev

Pregled zgodovine potrditev

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

Ti primeri uporabljajo zelo enostaven projekt imenovan »simplegit«. Da pridobite projekt, poženite:

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

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

$ 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

Privzeto brez argumentov git log izpiše potrditve, ki so bile narejene v tem repozitoriju v obratnem kronološkem vrstnem redu — to je, najnovejše potrditve se prikažejo prve. Kot vidite, ta ukaz izpiše vsako potrditev z njeno kontrolno vsoto SHA-1, avtorjevim imenom in e-pošto, napisanim datumom in sporočilom potrditve.

Na voljo je veliko število raznolikih možnosti ukaza git log, da prikaže točno to, kar iščete. Tukaj bomo prikazali nekaj najbolj popularnih.

Ena najbolj uporabnih možnosti je -p ali --patch, ki prikaže razlike (izpis popravkov) uvedene v vsaki potrditvi. 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

    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

Ta možnost prikaže enake informacije vendar z razliko, ki neposredno sledi vsakemu vnosu. To je zelo uporabno za pregled kode ali za hitro brskanje, kaj se je zgodilo med serijo potrditev, ki jih je dodal sodelavec. Z git log lahko uporabite tudi možnosti serije povzetkov. Na primer, če želite videti nekaj skrajšanih statistik za vsako potrditev, lahko uporabite možnost --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(+)

Kot lahko vidite, možnost --stat izpiše pod vsakim vnosom potrditve seznam spremenjenih datotek, koliko datotek je bilo spremenjenih in koliko vrstic v teh datotekah je bilo dodanih ali odstranjenih. Na konec doda tudi povzetek informacij.

Druga resnično uporabna možnost je --pretty. Ta možnost spremeni izpis dnevnika v druge oblike od privzetih. Za uporabo imate nekaj vnaprej vgrajenih možnosti. Vrednost oneline za to možnost izpiše vsako potrditev na eno vrstico, kar je uporabno, če gledate veliko potrditev. Poleg tega, vrednosti short, full in fuller prikažejo izpis v skoraj enaki obliki, vendar z več ali manj informacijami:

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

Najbolj zanimiva vrednost možnosti je format, ki vam omogoča določiti lastno obliko izpisa dnevnika. To je posebej uporabno, ko generirate izpis za strojno prevajanje — ker določate obliko eksplicitno, veste, da se ne bo spremenila s posodobitvami Git:

$ 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

Uporabni specifikatorji za git log --pretty=format izpiše seznam nekaj bolj uporabnih specifikatorjev, ki jih sprejme format.

Tabela 1. Uporabni specifikatorji za git log --pretty=format
Specifikator Opis izpisa

%H

Zgoščena vrednost potrditve

%h

Okrajšana zgoščena vrednost potrditve

%T

Zgoščena vrednost drevesa

%t

Okrajšana zgoščena vrednost drevesa

%P

Nadrejene zgoščene vrednosti

%p

Okrajšane nadrejene zgoščene vrednosti

%an

Ime avtorja

%ae

E-pošta avtorja

%ad

Datum avtorja (format spoštuje --date=option)

%ar

Datum avtorja, relativno

%cn

Ime potrjevalca

%ce

E-pošta potrjevalca

%cd

Datum potrjevalca

%cr

Datum potrjevalca, relativno

%s

Zadeva

Lahko se sprašujete, kaj je razlika med avtorjem in potrjevalcem. Avtor (angl. author) je oseba, ki je prvotno napisala delo, potrjevalec (angl. commiter) je pa oseba, ki je zadnja dodala delo. Torej, če ste poslali programski popravek projektu in eden izmed osrednjih članov ekipe doda ta popravek, oba dobita zasluge — vi kot avtor in osrednji član kot potrjevalec. To razlikovanje bomo pokrili nekoliko podrobneje v poglavju Porazdeljeni Git.

Vrednosti možnosti oneline in format sta posebej uporabni z drugimi možnostmi log imenovanimi --graph. Ta možnost doda lep manjši graf ASCII, 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 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

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

To so samo nekatere enostavne možnosti oblike izpisa za git log — jih je pa še veliko več. Pogoste možnosti za git log izpisuje možnosti, ki smo jih pokrili do sedaj kot tudi nekatere ostale pogoste možnosti oblikovanja, ki so lahko uporabne skupaj s tem, kako spremenijo izpis ukaza log.

Tabela 2. Pogoste možnosti za git log
Možnost Opis

-p

Prikaži programski popravek, ki je bil uveden v vsaki potrditvi.

--stat

Prikaži statistiko za spremenjene datoteke v vsaki potrditvi.

--shortstat

Prikaži samo vrstice sprememb/vstavkov/izbrisov iz ukaza --stat.

--name-only

Prikaži seznam spremenjenih datotek za informacijo potrditve.

--name-status

Prikaži seznam datotek, na katere je informacija tudi vplivala z dodajanjem/spremembo/izbrisom.

--abbrev-commit

Prikaži samo prvih nekaj znakov kontrolne vsote SHA-1 namesto vseh 40.

--relative-date

Prikaži datum v relativni obliki (na primer, »2 weeks ago«) namesto uporabe polne oblike datuma.

--graph

Prikaži graf ASCII zgodovine veje in združevanja poleg izpisa dnevnika.

--pretty

Prikaži potrditve v drugi obliki. Vrednosti možnosti vključujejo oneline, short, full, fuller in format (kjer lahko določite svojo lastno obliko).

--oneline

Bližnjica za skupaj uporabljeno --pretty=oneline --abbrev-commit.

Omejevanje izpisa dnevnika

Poleg možnosti oblike izpisa, git log sprejme tudi vrsto uporabnih možnosti omejevanja; to so možnosti, ki vam omogočajo prikazati samo podskupek potrditev. Eno tako možnost ste že videli — možnost -2, ki prikaže samo zadnji dve potrditvi. V bistvu lahko naredite -<n>, kjer je n katerokoli celo število za prikaz zadnjih n potrditev. V resnici tega zelo verjetno ne boste uporabljali pogostokrat, ker Git privzeto preusmeri vse izpise skozi oštevilčenje strani, tako da vidite samo eno stran izpisa dnevnika naenkrat.

Vendar pa so možnosti časovnega omejevanja, kot sta --since in --until, zelo uporabne. Na primer ta ukaz dobi seznam potrditev, ki so bile narejene 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 years 1 day 3 minutes ago«.

Seznam potrditev lahko tudi filtrirate, da se prilega nekaterim merilom. Možnost --author vam omogoča filtrirati po določenem avtorju in možnost --grep vam omogoča iskati za ključnimi besedami v sporočilih potrditev.

Opomba

Določite lahko eno instanco obeh meril iskanja --author in --grep, kar bo omejilo izpis potrditev na tiste, ki se prilegajo katerim koli vzorcem --author in katerim koli vzorcem --grep; vendar pa dodajanje možnosti --all-match nadalje omeji izpis na samo tiste potrditve, ki se prilegajo vsem vzorcem --grep.

Drug resnično uporaben filter je možnost -S (pogovorno imenovana kot Gitova možnost »krampa in lopate«), ki vzame niz in prikaže samo tiste potrditve, ki so spremenili število pojavljanj tega niza. Na primer, če ste želeli najti zadnjo potrditev, ki je dodala ali odstranila referenco določeni funkciji, lahko kličete:

$ git log -S function_name

Zadnja resnično uporabna možnost za podati ukazu git log kot filter, je pot. Če določite direktorij ali ime datoteke, lahko omejite izpis dnevnika na potrditve, ki so uvedle spremembe tem datotekam. To je vedno zadnja možnost in je v splošnem dodana predhodno z dvema pomišljajema (--), da loči poti od ostalih možnosti:

$ git log -- path/to/file

V Možnosti za omejitev izpisa git log bomo za vašo referenco izpisali te možnosti skupaj s še nekaj pogostih ostalih.

Tabela 3. Možnosti za omejitev izpisa git log
Možnost Opis

-<n>

Prikaži samo zadnjih n potrditev.

--since, --after

Omeji potrditve na tiste, ki so bile narejene po določenem datumu.

--until, --before

Omeji potrditve na samo tiste, ki so bile narejene pred določenim datumom.

--author

Prikaži samo potrditve, kjer se vnos avtorja prilega določenemu nizu.

--committer

Prikaži samo potrditve, kjer se vnos potrditelja prilega določenemu nizu.

--grep

Prikaži samo potrditve, kjer sporočilo vsebuje niz.

-S

Prikaži samo potrditve, ki odstranjujejo ali dodajajo kodo, ki se prilega nizu.

Na primer, če želite videti, katere potrditve, ki so spremenile datoteke testiranja v zgodovini izvorne kode Git, je naredil Junio Hamano v mesecu oktobru 2008 in niso bile potrditve združevanja, lahko poženete nekaj takega:

$ 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

Ta ukaz prikaže 6 od skoraj 40000 potrditev v zgodovini izvorne kode Git, ki se prilegajo tem merilom.

Namig
Preprečitev prikaza potrditev združevanj

Odvisno od uporabljenega delovnega načina v vašem repozitoriju je možno, da je zajeten delež potrditev v vašem dnevniku zgodovine zgolj potrditev združevanj, kar običajno ni preveč informativno. Da preprečite prikaz potrditev združevanj, ki delajo nered v vaši zgodovini dnevnika, enostavno dodajte ukazu log možnost --no-merges.

scroll-to-top