Git
Chapters ▾ 2nd Edition

2.3 Git Basics - Katkı Geçmişini Görüntüleme

Katkı Geçmişini Görüntüleme

Birkaç katkı işledikten veya halihazırda katkı geçmişine sahip bir repoyu kopyaladıktan sonra muhtemelen neler olup bittiğini görmek için kod geçmişine bakmak isteyeceksiniz. Bunu yapmanın en temel ve güçlü aracı git log komutudur.

Bu örneklerde ``simplegit`` adı verilen çok basit bir proje kullanılmaktadır. Projenin bir kopyasını elde etmek için aşağıdaki komutu çalıştırın:

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

Bu projede git log komutunu çalıştırdığınızda, şuna benzer bir çıktı almanız beklenir:

$ 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

Hiçbir argüman almadan kullanılan git log komutu, varsayılan olarak bu repoda yapılan katkıları ters kronolojik sırayla listeler (Yani en son katkı en üstte görünür). Gördüğünüz gibi, bu komut her bir işlemi SHA-1 kimliği, geliştiricinin adı ve e-postası, katkı tarihi ve mesajıyla birlikte listeler.

Tam olarak aradığınızı bulabilmeniz için git log komutuna ilişkin çok sayıda ve çeşitli seçenekler mevcuttur. Burada size en popüler olanlardan bazılarını göstereceğiz.

Kullanışlı seçeneklerden biri, her bir katkıda ortaya çıkan farkı (the patch output) gösteren -p veya `--patch`tir. Ayrıca yalnızca en son 5 katkıyı görmek için -5 kullanmak gibi. Görüntülenecek günlük katkı sayısını da sınırlayabilirsiniz.

$ 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

Bu seçenek aynı bilgileri ancak her bir katkıyla yapılan değişikliklerle birlikte görüntüler. Bu yöntem, kod incelemesi veya bir ortak çalışanın eklediği bir dizi katkı sırasında neler olduğuna hızlı bir şekilde göz atmak için oldukça faydalıdır. Ayrıca git log ile bir dizi özetleme seçeneğini de kullanabilirsiniz. Örneğin, her bir katkı işlemine ilişkin bazı kısaltılmış istatistikleri görmek istiyorsanız --stat seçeneğini kullanabilirsiniz:

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

Gördüğünüz gibi, --stat seçeneği her bir katkı girişinin altında değiştirilen dosyaların listesini, kaç dosyanın değiştirildiğini ve bu dosyalara kaç satırın eklendiğini ve kaldırıldığını yazdırır. Ayrıca en sona bilgilerin bir özetini de koyar.

Bir diğer kullanışlı seçenek ise --pretty`dir. Bu seçenek, günlük çıktısını varsayılanın dışındaki formatlara çevirir. Kullanmanız için önceden oluşturulmuş birkaç seçenek mevcuttur. `oneline seçeneği her bir katkıyı tek bir satıra yazdırır (eğer çok sayıda katkıya bakıyorsanız özellikle kullanışlıdır). Ek olarak, short (kısa), full (tam), ve fuller (tastamam) seçenekleri çıktıyı aşağı yukarı aynı şekilde ancak daha az veya daha fazla bilgiyle gösterir. Sırasıyla:

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

En ilginç seçenek, kendi günlük çıktı formatınızı belirlemenize olanak tanıyan format'tır. Bu, özellikle makine ayrıştırması için çıktı oluşturduğunuzda kullanışlıdır. Biçimi açıkça belirttiğiniz için Git’teki güncellemelerle değişmeyeceğini bilirsiniz.

$ 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

Kullanışlı git log --pretty=format seçenekleri format'ın gerektirdiği daha kullanışlı seçeneklerden bazılarını listeler.

Tablo 1. Kullanışlı git log --pretty=format seçenekleri
Seçenek Çıktı Tanımı

%H

katkı hash kimliği

%h

katkı hash kimliği (kısa)

%T

Çalışma ağacı hash kimliği

%t

Çalışma ağacı hash kimliği (kısa)

%P

Ana hashler

%p

Ana hashler (kısa)

%an

Yazar adı

%ae

Yazar e-posta adresi

%ad

Yazım tarihi (--date=option)

%ar

Yazım tarihi, göreli

%cn

Geliştirici adı

%ce

Geliştirici e-posta adresi

%cd

Geliştirme tarihi

%cr

Geliştirme tarihi, göreli

%s

Konu

yazar ve geliştirici arasındaki farkın ne olduğunu merak ediyor olabilirsiniz. Yazar, kodu ilk yazan kişi, geliştirici ise kodu son değiştiren yani katkılayan kişidir. Yani, bir projeye bir yama gönderirseniz ve çekirdek üyelerden biri yamayı uygularsa, her ikiniz de kredi alırsınız (yazar olarak siz ve katkılayan olarak çekirdek üye). Bu ayrımı Distributed Git bölümünde biraz daha ele alacağız.

Bu, oneline ve format seçenekleri --graph adı verilen başka bir log seçeneğiyle birlikte kullanıldığında özellikle kullanışlıdır. Bu seçenek çıktıya, dallanma ve birleştirme geçmişinizi gösteren küçük bir ASCII grafiği ekler:

$ 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

Bir sonraki bölümde dallanma ve birleştirme işlemlerine geçtikçe bu tür çıktılar daha ilginç hale gelecektir.

Bunlar git log için yalnızca bazı basit çıktı biçimlendirme seçenekleridir fakat çok daha fazlası vardır. Yaygın git log seçenekleri şu ana kadar ele aldığımız seçeneklerin yanı sıra faydalı olabilecek diğer bazı yaygın biçimlendirme seçeneklerini ve bunların log komutunun çıktısını nasıl değiştirdiklerini listeler.

Tablo 2. Yaygın git log seçenekleri
Seçenek Tanım

-p

Her bir katkıda tanıtılan yamayı göster

--stat

Her katkıda değiştirilen dosyalara ilişkin istatistikleri göster

--shortstat

--stat komutundan yalnızca değiştirilen/eklenenler/silenler satırını göster

--name-only

katkı bilgisinden sonra değiştirilen dosyaların listesini göster

--name-status

Eklenen/değiştirilen/silinmiş bilgilerle birlikte değiştirilen dosyaların listesini de göster

--abbrev-commit

SHA-1 kimliğinin tüm 40 karakteri yerine sadece ilk bir kaç karakterini göster

--relative-date

Tarihi, tam tarih biçimini kullanmak yerine göreli bir biçimde göster (ör. ``2 hafta önce``)

--graph

Günlük (log) çıktısının yanında dal ve birleştirme geçmişinin ASCII grafiğini de göster

--pretty

Katkıları alternatif bir formatta göster. Seçenekler arasında tek satırlı (oneline), kısa (short), tam (full), daha kapsamlı (fuller) ve kendi oluşturduğunuz format da yer alır.

--oneline

--pretty=oneline --abbrev-commit birlikte kullanımı için kısayoldur

Günlük (Log) Çıktısını Sınırlama

git log çıktı biçimlendirme seçeneklerine ek olarak, bir dizi yararlı sınırlama seçeneğini de beraberinde getirir. Bu katkıların yalnızca belli bir alt kümesini göstermenize izin veren seçeneklerdir. Böyle bir seçeneği zaten gördünüz: yalnızca son iki işlemi görüntüleyen -2 seçeneği. Aslında, -<n> işlemini yapabilirsiniz, buradaki -n, en son yapılan n sayıdaki katkıyı gösteren herhangi bir tam sayıdır. Gerçekte, bunu sık kullanmanız pek mümkün değildir, çünkü Git varsayılan olarak tüm çıktıları bir "pager" (sayfa düzenleyici) üzerinden yönlendirir ve böylece bir kerede yalnızca bir sayfalık günlük çıktısı görürsünüz.

Yine de, --since ve --until gibi zaman sınırlayıcı seçenekler çok kullanışlıdır. Örneğin, aşağıdaki komut son iki hafta içinde yapılan katkıların listesini yazdırır:

$ git log --since=2.weeks

Bu komut birçok formatla çalışır: "2008-01-15" gibi belirli bir tarih veya "2 yıl 1 gün 3 dakika önce" gibi göreli bir tarih belirtebilirsiniz.

Listeyi, bazı arama kriterleriyle eşleşen katkılara göre de süzebilirsiniz. --author seçeneği belirli bir yazara göre süzmenizi sağlar ve --grep seçeneği katkı mesajlarındaki anahtar kelimeleri aramanızı sağlar.

Hem --author hem de --grep arama koşullarının birden fazla örneğini de aynı anda kullanabilirsiniz. Bu katkı çıktısını sadece uygun düşen --author ve --grep kalıplarıyla eşleşen katkılarla sınırlayacaktır. Ancak, --all-match seçeneğinin eklenmesi çıktıyı all --grep kalıplarıyla eşleşen katkılar yüzünden daha da sınırlandıracaktır.

Gerçekten faydalı bir diğer süzgeç (filter) ise bir dize (string) alan ve yalnızca o dizenin oluşum sayısını değiştiren katkıları gösteren -S seçeneğidir (yazılımcılar arasında Git’in "kazma" seçeneği olarak anılır). Örneğin, belirli bir işleve referans ekleyen veya kaldıran son katkıyı bulmak istiyorsanız şunu arayabilirsiniz:

$ git log -S function_name

git log komutuna süzme argümanı olarak yazabileceğimiz son faydalı seçenek ise dosya yoludur (path). Eğer bir dizin veya dosya adı belirtirseniz günlük çıktısını, bu dosyalarda değişiklik yapan katkılarla sınırlayabilirsiniz. Bu her zaman son seçenektir ve dosya yollarını seçeneklerden (bayraklardan) ayırmak için genellikle önünde çift çizgi (--) bulunur.

git log komutunun çıktılarını sınırlama seçeneği bölümünde bunları ve diğer birkaç genel seçeneği örnek olması açısından listeleyeceğiz.

Tablo 3. git log komutunun çıktılarını sınırlama seçeneği
Seçenek Tanım

-<n>

Sadece en son n sayıdaki katkıyı göster

--since, --after

Katkı listesini belirli bir tarihten sonra yapılan katkılarla sınırla

--until, --before

Katkı listesini belirli bir tarihe kadar yapılan katkılarla sınırla

--author

Sadece yazar (author) kısmı, verilen dizeyle eşleşen katkıları göster

--committer

Sadece geliştirici (committer) kısmı, verilen dizeyle eşleşen katkıları göster

--grep

Sadece katkı mesajında, girilen dize bulunan katkıları göster

-S

Sadece kodda verilen dizeyi ekleyen veya çıkaran katkıları göster

Örneğin, Git kaynak kodu geçmişindeki test dosyalarını değiştiren hangi katkıların Ekim 2008 ayında Junio Hamano tarafından işlendiğini ve birleştirme katkıları olmadığını görmek istiyorsanız, şöyle bir komut çalıştırabilirsiniz:

$ 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

Bu komutla, Git kaynak kodu geçmişindeki yaklaşık 40.000 katkıdan, bu kıstaslara uyan sadece 6’sını görebilirsiniz.

Örnek 1. Birleştirme katkılarının gösterilmesini engelleme

Reponuzda kullanılan iş akışına bağlı olarak, günlük geçmişinizdeki katkıların büyük bir yüzdesinin yalnızca birleştirme katkıları olması mümkündür ve bunlar genellikle pek bilgilendirici değildir. Birleştirme işlemlerinin görüntülenmesinin, günlük geçmişinizi karmaşık hale getirmesini önlemek için, --no-merges seçeneğini eklemeniz yeterlidir.

scroll-to-top