Git 🌙
Chapters â–Ÿ 2nd Edition

2.3 Grunder i Git - Visa historiken

Visa historiken

Efter att du har skapat flera versioner eller om du har klonat ett förvar med befintlig historik sÄ vill du sannolikt blicka bakÄt för att se vad som har hÀnt. Det mest grundlÀggande och kraftfulla verktyget för att göra detta Àr kommandot git log.

Dessa exempel anvĂ€nder ett vĂ€ldigt simpelt projekt kallat “simplegit”. För att hĂ€mta projektet, kör

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

NÀr du kör git log i projektet, sÄ skall du fÄ en utskrift som ser ut nÄgot liknande detta:

$ 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

Som standard, utan argument, listar git log alla förbindningar som Àr gjorda i förvaret i omvÀnd kronologisk ordning; det vill sÀga att de nyaste förbindningarna kommer först. Som du ser listar kommandot varje förbindning med sin SHA-1 kontrollsumma, författarens namn och e-post, datumet den skrevs och versionsmeddelandet.

Det finns en mÀngd vÀxlar tillgÀngliga för git log kommandot för att visa exakt det du eftersöker. HÀr kommer vi visa nÄgra av de vanligaste.

En av de mest hjÀlpfulla vÀxlarna Àr -p eller --patch som visar skillnaden (patch utskriften) som introducerades i varje förbindning. Du kan ocksÄ begrÀnsa antalet loggposter som visas genom att skriva -2 för att bara visa de tvÄ senaste posterna.

$ 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

Detta val visar samma information men med en diff som följer varje post. Detta Àr vÀldigt anvÀndbart för kodgranskning eller att snabbt skumma igenom vad som hÀnt under en serie av versioner som en medarbetare har lagt till. Du kan ocksÄ anvÀnda en serie av summerande val tillsammans med git log. Om du till exempel vill se lite kortfattad statistik för varje förbindning anvÀnder du vÀxeln --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(+)

Som du ser gör kommandot --stat att det under varje förbindningspost listas modifierade filer, hur mÄnga filer som Àndrats och hur mÄnga rader i filerna som lades till och togs bort. Den summerar Àven informationen pÄ slutet.

En annat vÀldigt anvÀndbar vÀxel Àr --pretty. Det gör att utskriftern formateras pÄ ett annat sÀtt Àn normalt. En del inbyggda val finns tillgÀngliga att anvÀnda. Valet oneline skriver varje version pÄ en rad, och Àr anvÀndbar om du tittar pÄ mÄnga versioner. Sedan finns Àven valen short, full och fuller som skriver ut i ungefÀr samma format med mindre respektive mer information:

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

Det mest spĂ€nnande valet Ă€r format, vilket lĂ„ter dig specificera ditt eget format. Det Ă€r sĂ€rskilt intressant nĂ€r du genererar utskrift för tolkning av ett program — eftersom du specificerar formatet uttryckligen sĂ„ vet du att det inte kommer att Ă€ndras i och med att Git sjĂ€lv uppdateras:

$ 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

AnvÀndbara val för git log --pretty=format listar nÄgra av de mer anvÀndbara val som format hanterar.

Tabell 1. AnvÀndbara val för 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

Du kanske undrar vad som Ă€r skillnaden mellan author och committer. Det förra Ă€r författare, det vill sĂ€ga den som ursprungligen gjorde arbetet, medan den senare Ă€r den som sparade versionen. Om du skickare en patch till ett projekt och nĂ„gon projektmedlem anvĂ€nder din patch, kommer bĂ„da ni att anses bidragande till Ă€ndringen. — Du som författare, och projhektmedlemmen som den som sparade versionen. Vi kommer att gĂ„ igenom distinktionen lite mer i Distributed Git.

Valen oneline och format Àr sÀrskilt anvÀndbara tillsammans med ett annat val till log, nÀmligen --graph. Detta valet visar en liten ASCII-graf som visar din versionshistorik:

$ 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

Denna typen av utskrift blir mer intressant nÀr vi gÄr igenom förgreningar och ihopslagningar i nÀsta kapitel.

Dessa Ă€r bara nĂ„gra av de simpla formateringsvalen till git log — det finns massa fler. Vanliga val till git log listar valen som vi tĂ€ckts hittils och nĂ„gra andra vanliga formateringsval som kan vara anvĂ€ndbara, samt hur de förĂ€ndrar utskriften av kommandot.

Tabell 2. Vanliga val till 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.

BegrÀnsa utskriften frÄn log

Utöver formateringsvalen tar kommandot git log Ă€ven ett antal anvĂ€ndbara begrĂ€nsande val; det vill sĂ€ga val som lĂ„ter dig visa ett urval av versioner. Du har redan sett ett sĂ„nt val — valet -2, som enbart visar de tvĂ„ senaste sparade versionerna. Faktum Ă€r att du kan göra -<n>, dĂ€r n Ă€r ett heltal för att visa de n senaste sparade versionerna. I realiteten kommer du förmodligen inte anvĂ€nda detta sĂ€rskilt ofta eftersom Git normalt skickar utskrifterna till en paginator, sĂ„ att du endast ser en sida av utskrifter Ă„t gĂ„ngen.

Dock sÄ Àr de tidsbegrÀnsande valen sÄsom --since och --until Àven vÀldigt anvÀndbara. Till exempel ger dig detta kommando en lista över sparade versioner de senaste tvÄ veckorna:

$ git log --since=2.weeks

Detta kommando fungerar tillsamans med en mĂ€ngd format — du kan specificera ett specifikt datum som till exempel "2008-01-15", eller ett relativt datum som till exempel "2 years 1 day 3 minutes ago".

Du kan ocksÄm filtrera listan över versioner som uppfyller ett sökvillkor. Valet --author lÄter dig filtrera pÄ en sÀrskild författare och --grep lÄter dig söka efter nyckelord i versionsmeddelanden.

Notera

Du kan specificera mer Àn en instans av bÄde --author och --grep, vilket kommer begrÀnsa versionsutskrifterna till de versioner som uppfyller nÄgot av textmönstren för --author och nÄgot av textmönstren för --grep; man kan Àven lÀgga till valet --match-all för att ytterligare begrÀnsa utskriften till bara de sparade versioner som uppfyller alla --grep mönster.

Et annat tacksamt filter Ă€r -S (allmĂ€nt kĂ€nt som Gits “hacka”), som tar en textstrĂ€ng och enbart visar de sparade versioer som Ă€ndrade antalet förekomster av den textstrĂ€ngen. Om du till exempel vill hitta den senaste versionen som lade till eller tog bort en referens till en specifik funktion, skulle du kunna skriva:

$ git log -S function_name

Det sista verkligt anvÀndbara valet att skicka till git log som ett filter Àr en sökvÀg. Om du specificerar en katalog eller ett filnamn kan du begrÀnsa utskriften till versioner som introdicerade en Àndring i de filerna. Detta Àr alltid det sista valet och föregÄs generellt av tvÄ dubbelstreck (--) för att separera sökvÀgarna frÄn valen.

I Val för att begrÀnsa utskriften av git log listas dessa och ett fÄtal andra vanliga val för referens.

Tabell 3. Val för att begrÀnsa utskriften av 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

Till exempel, om du bara vill se vilka versioner som modifierade testfiler i Gits kÀllkodshistorik som sparades av Junio Hamano under oktober 2008 och som inte Àr sammanslagningsversioner, kan du köra nÄgot liknande detta:

$ 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

Av de nÀstan 40 000 sparade versionerna i Gits kÀllkodshistorik listar detta kommando de 6 versioner som uppfyller dessa kriterierna.

Tips
Förhindra visning av sammanslagningsversioner

Beroende pÄ det arbetsflöde du anvÀnder i ditt förvar Àr det möjligt att en ansenlig andel av de sparade versionerna i din historik Àr just sammanslagningsversioner, vilka typiskt inte Àr sÀrskilt informativa. För att förhindra att sammanslagningsversioner gör din historik svÄrlÀslig, lÀgg bara till valet --no-merges.

scroll-to-top