Git
Chapters ▾ 2nd Edition

2.3 Osnove Gita - Pregled istorije komitova

Pregled istorije komitova

Kada ste napravili nekoliko komitova, ili ste klonirali repozitorijum sa postojećom istorijom komitova, verovatno ćete hteti da pogledate unazad da vidite šta se dešavalo. Najosnovniji i najmoćniji alat za ovo je komanda git log.

Ovi primeri koriste veoma jednostavan projekat koji se zove "simplegit". Da pribavite projekat, pokrenite

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

Kada pokrenete git log komandu u ovom projektu, treba da dobijete izlaz koji liči ovom:

$ 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

Po podrazumevanim podešavanjima, bez argumenata, git log će izlistati komitove koji su napravljeni u tom repozitorijumu u obrnutom hronološkom redosledu — odnosno, najskoriji komit će se pojaviti prvi. Kao što vidite, ova komanda na izlazu daje listu svih komitova sa SHA-1 čeksumom, autorovim imenom i mejlom, datumom kada je napisan i komit porukom.

Postoji veliki broj opcija za komandu git log koje će vam pomoći da nađete tačno ono što tražite. Ovde ćemo predstaviti neke najpopularnije.

Jedna od opcija koje su od najveće pomoći je -p, koje prikazuje razliku uvedenu u svakom komitu. Možete da koristite i -2, što limitira prikaz na samo dva poslednja komita.

$ 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

Ova opcija prikazuje istu informaciju s tim što razlika prati svaku stavku. Ovo je veoma korisno radi brzog upoznavanja sa kodom koji se primenio tokom serija komitova koje je kolaborator dodao. Možete da koristite i seriju opcija za sumarizaciju sa git log. Na primer, ako želite da vidite neke skraćene statuse za svaki komit, možete iskoristiti --stat opciju.

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

Kao što vidite, opcija --stat ispod svakog komita štampa listu modifikovanih fajlova, koliko je fajlova promenjeno i koliko linija u tim fajlovima je dodato i obrisano. Štampa i rezime informacija na kraju.

Još jedna veoma korisna opcija je --pretty. Ova opcija menja izlaz loga u neki format koji nije podrazumevani. Pripremljeno je nekoliko opcija koje možete da koristite. Opcija oneline štampa svaki komit u jednu liniju, što je veoma korisno ako gledate puno komitova. Tu su i opecije short, full i fuller koje štampaju u sličnom formatu ali sa manje ili više informacija, respektivno.

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

Najzanimljivija je opcija format, koja dopušta da specificirate sopstveni format za izlaz loga. Ovo je posebno korisno kada generišete izlaz koji treba da parsuje mašina — pošto eksplicitno specificirate format, znate da se neće promeniti kada se Git apdejtuje.

$ 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

Korse opcije za git log --pretty=format predstavlja listu nekih korisnijih opcija koje uzima format.

Table 1. Korse opcije za git log --pretty=format
Opcija Opis izlaza

%H

Komit heš

%h

Skraćeni komit heš

%T

Stablo heš

%t

Skraćeni stablo heš

%P

Roditeljski hešovi

%p

Skraćeni roditeljski hešovi

%an

Ime autora

%ae

Mejl autora

%ad

Datum autora (format poštuje --date=option)

%ar

Datum autora, relativan

%cn

Ime komitera

%ce

Mejl komitera

%cd

Datum komitera

%cr

Datum komitera, relativan

%s

Naslov

Možda se pitate koja je razlika između autora i komitera. Autor je osoba koja je prvobitno napravila fajl, a komiter je osoba koja je poslednja doprinela promene. Znači ako pošaljete zakrpu projektu i jedan od glavnih članova prihvati zakrpu, obojica dobijate priznanje — vi kao autor, a on ili ona kao komiter. Ovu razliku ćemo detaljnije razmotriti u Distribuirani Git.

Opcije online i format su posebno korisne sa još jednom log opcijom koja se zove --graph. Ova opcija dodaje mali ASCII grafik koji prikazuje vašu granu i istoriju spajanja.

$ 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

Ovakav izlaz će postati zanimljiviji kada prođemo kroz grananje i spajanje u sledećem poglavlju.

To su samo neke jednostavne opcije za formatiranje izlaza koje idu uz komandu git log - ima ih još puno. U Česte opcije koje idu uz git log su izlistane opcije koje smo dosad prošli, kao i neke druge koje bi mogle da budu korisne, uz kratko objašnjenje o načinu na koji menjaju izlaz.

Table 2. Česte opcije koje idu uz git log
Opcija Opis

-p

Pokazuje zakrpu koja je dodata uz svaki komit.

--stat

Prikazuje statistiku za fajlove koji su modifikovani u svakom komitu.

--shortstat

Prikazuje samo linije koje su promenjen/dodate/obrisane iz --stat komande.

--name-only

Prikazuje listu fajlova koji su modifikovani posle informacije o komitu.

--name-status

Prikazuje i listu fajlova sa informacijom o linijama koje su promenjene/dodate/obrisane.

--abbrev-commit

Prikazuje samo prvih nekoliko slova iz SHA-1 čeksume umesto svih 40.

--relative-date

Prikazuje datum u relativnom formatu (na primer, “2 weeks ago”) umesto celog formata.

--graph

Prikazuje ASCII grafikon grane i istorije spajanja pored loga.

--pretty

Pokazuje komitove u alternativnom formatu. Među opcijama su oneline, short, full, fuller, i format (gde treba da specificirate sopstveni format).

Limitiranje loga

Pored opcija za formatiranje izlaza, git log prima i veliki broj korisnih opcija za limitiranje — drugim rečima, opcija kojima nalažete prikaz samo jednom podskupu komitova. Već ste videli jednu takvu — opciju -2, koja prikazuje samo poslednja dva komita. Zapravo, možete da ukucate -n, gde je n bilo koji prirodan broj i na taj način prikažete poslednjih n komitova. U stvarnosti je nećete često koristiti jer Git podrazumevano pajpuje sav izlaz kroz pejdžer tako da ćete videti samo jednu stranicu u jednom trenutku.

Međutim, opcije koje limitiraju vreme kao što su --since i --until su veoma korisne. Na primer, ova komanda pribavlja listu komitova koji su se odigrali u poslednje dve nedelje:

$ git log --since=2.weeks

Ova komanda radi sa puno formata — možete da specificirate tačan datum kao "2008-01-05" ili relativni datum kao "2 years 1 day 3 minutes ago".

Listu komitova možete filtrirati i tako da zadovolji neki kriterijum pretrage. Opcija --author vam omogućava da prikažete komitove samo od specificiranog autora, a sa --grep možete tražiti ključne reči u komit porukama. (Obratite pažnju na to da ako želite da specificirate i autora i grep opcije, morate da dodate --all-match ili će komanda gađati komitove sa bar jednom uslovom.)

Još jedan veoma koristan filter je -S opcija koja uzima string i pokazuje samo komitove koji su uveli promenu u kodu koja je dodala ili obrisala taj string. Na primer, ako želite da nađete poslednji komit koji je dodao ili obrisao referencu na neku određenu funkciju, možete da pozovete

$ git log -Sfunction_name

Poslednja veoma korisna opcija koju možete proslediti opciji git log kao filter je putanja. Ako specificirate direktorijum ili ime fajla, možete da limitirate log samo na komitove koji su uveli izmene tim fajlovima. Ovo je uvek poslednja opcija i generalno se prefiksuje sa duplom crtom (--) da bi se odvojile putanje od ostalih opcija.

Opcije za limitiranje komande git log sadrži nekoliko ovih i nekoliko drugih čestih opcija kao referncu.

Table 3. Opcije za limitiranje komande git log
Opcija Opis

-(n)

Prikazuje samo poslednjih n komitova.

--since, --after

Pokazuje komitove koji su napravljeni posle specificiranog datuma.

--until, --before

Pokazuje komitove koji su napravljeni pre specificiranog datuma.

--author

Prikazuje samo komitove kod kojih specificirani string gađa ime autora.

--committer

Prikazuje samo komitove kod kojih specificirani string gađa ime komitera.

--grep

Pokazuje samo komitove kod kojih komit poruka sadrži specificirani string.

-S

Prikazuje samo komitove koji dodaju ili brišu kod koji se poklapa sa stringom.

Na primer, ako želite da vidite koji komitovi koji su modifikovali test fajlove u Git istoriji izvornog koda su počinjeni od strane korisnika Junio Hamano, a nisu bili spojeni u oktobru 2008, možete da pokrenete ovakvu komadu:

$ 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

Od skoro 40.000 komitova u istoriji Gitovog izvornog koda, ova komanda je prikazala 6 onih koji zadovoljavaju specificirane uslove.