-
1. Başlangıç
- 1.1 Sürüm Denetimi
- 1.2 Git’in Kısa Tarihçesi
- 1.3 Git Nedir?
- 1.4 Komut Satırı
- 1.5 Git’i Yüklemek
- 1.6 Git’i İlk Defa Kurmak
- 1.7 Yardım Almak
- 1.8 Özet
-
2. Git Temelleri
-
3. Git Dalları
- 3.1 Dallar
- 3.2 Kısaca Dallandırma ve Birleştirme Temelleri
- 3.3 Dal Yönetimi
- 3.4 İş Akışı Dallandırması
- 3.5 Uzak Dallar
- 3.6 Yeniden Temelleme (rebase)
- 3.7 Özet
-
4. Bir Sunucuda Git Kurma
- 4.1 İletişim Kuralları (Protocols)
- 4.2 Bir Sunucuda Git Kurma
- 4.3 SSH Ortak Anahtarınızı Oluşturma
- 4.4 Sunucu Kurma
- 4.5 Git Cini (Daemon)
- 4.6 Akıllı HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Üçüncü Taraf Barındırma (Hosting) Seçenekleri
- 4.10 Özet
-
5. Dağıtık Git
- 5.1 Dağıtık İş Akışları
- 5.2 Projenin Gelişiminde Rol Almak
- 5.3 Bir Projeyi Yürütme
- 5.4 Özet
-
6. GitHub
- 6.1 Bir Projeye Katkıda Bulunmak
- 6.2 Proje Bakımı
- 6.3 Kurumsal Yönetim
- 6.4 GitHub’ı otomatikleştirme
- 6.5 Özet
-
7. Git Araçları
- 7.1 Düzeltme Seçimi
- 7.2 Etkileşimli İzlemleme (Staging)
- 7.3 Saklama ve Silme
- 7.4 Çalışmanızı İmzalama
- 7.5 Arama
- 7.6 Geçmişi Yeniden Yazma
- 7.7 Reset Komutunun Gizemleri
- 7.8 İleri Seviye Birleştirme
- 7.9 Rerere
- 7.10 Git’le Hata Ayıklama
- 7.11 Alt Modüller
- 7.12 Demetleme (Bundling)
- 7.13 Git Nesnesini Değiştirme
- 7.14 Kimlik Bilgisi Depolama
- 7.15 Özet
-
8. Git’i Özelleştirmek
- 8.1 Git Yapılandırması
- 8.2 Git Nitelikleri
- 8.3 Git Kancaları (Hooks)
- 8.4 Bir Örnek: Mecburi Git Politikası
- 8.5 Özet
-
9. Git ve Diğer Sistemler
- 9.1 İstemci Olarak Git
- 9.2 Git’e Geçiş
- 9.3 Özet
-
10. Dahili Git Ögeleri
- 10.1 Tesisat ve Döşeme (Plumbing ve Porcelain)
- 10.2 Git Nesneleri
- 10.3 Git Referansları
- 10.4 Packfiles
- 10.5 Refspec
- 10.6 Transfer Protokolleri
- 10.7 Bakım ve Veri Kurtarma
- 10.8 Ortam Değişkenleri
- 10.9 Özet
-
A1. Ek bölüm A: Diğer Ortamlarda Git
- A1.1 Görsel Arayüzler
- A1.2 Visual Studio ile Git
- A1.3 Visual Studio Code ile Git
- A1.4 Eclipse ile Git
- A1.5 Sublime Text ile Git
- A1.6 Bash ile Git
- A1.7 Zsh ile Git
- A1.8 PowerShell ile Git
- A1.9 Özet
-
A2. Ek bölüm B: Git’i Uygulamalarınıza Gömmek
- A2.1 Git Komut Satırı
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
A3. Ek bölüm C: Git Komutları
- A3.1 Kurulum ve Yapılandırma Komutları
- A3.2 Proje Oluşturma Komutları
- A3.3 Kısaca Poz (Snapshot) Alma
- A3.4 Dallandırma ve Birleştirme Komutları
- A3.5 Projeleri Paylaşma ve Güncelleme Komutları
- A3.6 İnceleme ve Karşılaştırma Komutları
- A3.7 Hata Ayıklama (Debugging) Komutları
- A3.8 Yamalama (Patching)
- A3.9 E-Posta Komutları
- A3.10 Harici Sistemler
- A3.11 Yönetim
- A3.12 Tesisat (Plumbing) Komutları
7.5 Git Araçları - Arama
Arama
Herhangi bir boyuttaki bir kod tabanında, genellikle bir fonksiyonun nerede tanımlandığını veya çağrıldığını bulmanız, ya da bir mesela bir metodun geçmişini göstermeniz gerekebilir. Git, kendi veritabanına kayıtlı kod ve katkıları, hızlı ve kolay bir şekilde bulmanızı sağlayan birkaç kullanışlı araç sunar. Şimdi bunlardan birkaçını ele alalım.
Git Grep
Git, katkılanmış herhangi bir ağaç, çalışma dizini, hatta bir dize veya düzenli ifade (regex) için kolayca arama yapmanıza olanak tanıyan grep
adlı bir komutla birlikte gelir.
Aşağıdaki örnekler için, Git’in kendi kaynak kodu içinde arama yapacağız.
git grep
, varsayılan olarak çalışma dizininizdeki dosyalarda arama yapacaktır.
İlk varyant olarak, eşleşmelerin bulunduğu satır numaralarını yazdırmak için -n
veya --line-number
seçeneklerinden birini kullanabilirsiniz:
$ git grep -n gmtime_r
compat/gmtime.c:3:#undef gmtime_r
compat/gmtime.c:8: return git_gmtime_r(timep, &result);
compat/gmtime.c:11:struct tm *git_gmtime_r(const time_t *timep, struct tm *result)
compat/gmtime.c:16: ret = gmtime_r(timep, result);
compat/mingw.c:826:struct tm *gmtime_r(const time_t *timep, struct tm *result)
compat/mingw.h:206:struct tm *gmtime_r(const time_t *timep, struct tm *result);
date.c:482: if (gmtime_r(&now, &now_tm))
date.c:545: if (gmtime_r(&time, tm)) {
date.c:758: /* gmtime_r() in match_digit() may have clobbered it */
git-compat-util.h:1138:struct tm *git_gmtime_r(const time_t *, struct tm *);
git-compat-util.h:1140:#define gmtime_r git_gmtime_r
Yukarıda gösterilen temel arama işlemine ek olarak, git grep
birçok başka ilginç seçenek de destekler.
Örneğin, tüm eşleşmeleri yazdırmak yerine, git grep
komutuna, arama dizesini içeren yalnızca hangi dosyaların olduğunu ve her dosyada kaç eşleşme olduğunu göstermesi için -c
veya --count
seçeneğini ekleyebilirsiniz:
$ git grep --count gmtime_r
compat/gmtime.c:4
compat/mingw.c:1
compat/mingw.h:1
date.c:3
git-compat-util.h:2
Eğer bir arama dizesinin bağlamını görmek istiyorsanız, her eşleşen dize için kapsayıcı yöntemi veya fonksiyonu göstermek için -p
veya --show-function
seçeneklerinden birini ekleyebilirsiniz:
$ git grep -p gmtime_r *.c
date.c=static int match_multi_number(timestamp_t num, char c, const char *date,
date.c: if (gmtime_r(&now, &now_tm))
date.c=static int match_digit(const char *date, struct tm *tm, int *offset, int *tm_gmt)
date.c: if (gmtime_r(&time, tm)) {
date.c=int parse_date_basic(const char *date, timestamp_t *timestamp, int *offset)
date.c: /* gmtime_r() in match_digit() may have clobbered it */
Gördüğünüz gibi, gmtime_r
rutini date.c
dosyasındaki match_multi_number
ve match_digit
fonksiyonlarından çağrılır (üçüncü eşleşme, sadece bir yorum satırında görünen dizedir).
Ayrıca, --and
bayrağıyla karmaşık dize kombinasyonlarını arayabilirsiniz, bu da birden fazla eşleşmenin aynı metin satırında gerçekleşmesini sağlar.
Örneğin: özellikle, v1.8.0
etiketi ile temsil edilen Git kod tabanının eski bir sürümünde, içeriğinde ya ``LINK`` ya da ``BUF_MAX`` alt dizelerinden herhangi biri bulunan bir sabiti tanımlayan, herhangi bir satırı arayalım (çıktıyı daha okunabilir bir formata ayırmaya yardımcı olan --break
ve --heading
seçeneklerini de ekleyeceğiz):
$ git grep --break --heading \
-n -e '#define' --and \( -e LINK -e BUF_MAX \) v1.8.0
v1.8.0:builtin/index-pack.c
62:#define FLAG_LINK (1u<<20)
v1.8.0:cache.h
73:#define S_IFGITLINK 0160000
74:#define S_ISGITLINK(m) (((m) & S_IFMT) == S_IFGITLINK)
v1.8.0:environment.c
54:#define OBJECT_CREATION_MODE OBJECT_CREATION_USES_HARDLINKS
v1.8.0:strbuf.c
326:#define STRBUF_MAXLINK (2*PATH_MAX)
v1.8.0:symlinks.c
53:#define FL_SYMLINK (1 << 2)
v1.8.0:zlib.c
30:/* #define ZLIB_BUF_MAX ((uInt)-1) */
31:#define ZLIB_BUF_MAX ((uInt) 1024 * 1024 * 1024) /* 1GB */
git grep
komutunun, grep
ve ack
gibi normal arama komutlarına göre birkaç avantajı vardır.
İlk olarak, gerçekten hızlıdır; ikincisi ise, yalnızca çalışma dizinini değil, Git’teki herhangi bir ağacı arayabilirsiniz.
Yukarıdaki örnekte gördüğümüz gibi, Git kaynak kodunun daha eski bir sürümünde terimleri aradık, güncel sürümde değil.
Git Günlük (log) Araması
Belki bir terimin nerede olduğu değil, ne zaman var olduğu veya tanıtıldığına bakmak istiyorsunuz.
git log
komutu, belirli katkıları, katkı mesajlarının içeriği veya tanıttıkları fark içeriği ile bulmak için bir dizi güçlü araca sahiptir.
Örneğin, ZLIB_BUF_MAX
sabitinin orijinal olarak ne zaman tanıtıldığını bulmak istiyorsak, Git’e sadece o dizenin tekrar sayısını değiştiren katkıları göstermesini söylemek için -S
seçeneğini (genellikle Git "kazma (pickaxe)" seçeneği olarak adlandırılır) kullanabiliriz.
$ git log -S ZLIB_BUF_MAX --oneline
e01503b zlib: allow feeding more than 4GB in one go
ef49a7a zlib: zlib can only process 4GB at a time
Bu katkıların farkına baktığımızda, ef49a7a
katkısında sabitin tanıtıldığını ve e01503b
katkısında değiştirildiğini görebiliriz.
Daha belirleyici olmanız gerekiyorsa, -G
seçeneği ile aramak için bir düzenli ifade (regex) girebilirsiniz.
Çizgisel Günlük (log) Araması
Başka oldukça gelişmiş bir günlük araması da inanılmaz derecede faydalı olan "çizgisel geçmiş aramasıdır".
Basitçe git log
komutunu -L
seçeneği ile çalıştırın: kod tabanınızdaki bir fonksiyonun veya kod satırının geçmişini gösterecektir.
Örneğin, zlib.c
dosyasındaki git_deflate_bound
fonksiyonuna yapılan her değişikliği görmek istersek, git log -L :git_deflate_bound:zlib.c
komutunu çalıştırabiliriz.
Bu komut, bu işlevin sınırlarını bulmaya çalışacak ve ardından geçmişi inceleyerek, fonksiyonun ilk oluşturulduğu zamana kadar yapılan her değişikliği bize yama serisi olarak gösterecektir.
$ git log -L :git_deflate_bound:zlib.c
commit ef49a7a0126d64359c974b4b3b71d7ad42ee3bca
Author: Junio C Hamano <gitster@pobox.com>
Date: Fri Jun 10 11:52:15 2011 -0700
zlib: zlib can only process 4GB at a time
diff --git a/zlib.c b/zlib.c
--- a/zlib.c
+++ b/zlib.c
@@ -85,5 +130,5 @@
-unsigned long git_deflate_bound(z_streamp strm, unsigned long size)
+unsigned long git_deflate_bound(git_zstream *strm, unsigned long size)
{
- return deflateBound(strm, size);
+ return deflateBound(&strm->z, size);
}
commit 225a6f1068f71723a910e8565db4e252b3ca21fa
Author: Junio C Hamano <gitster@pobox.com>
Date: Fri Jun 10 11:18:17 2011 -0700
zlib: wrap deflateBound() too
diff --git a/zlib.c b/zlib.c
--- a/zlib.c
+++ b/zlib.c
@@ -81,0 +85,5 @@
+unsigned long git_deflate_bound(z_streamp strm, unsigned long size)
+{
+ return deflateBound(strm, size);
+}
+
Eğer Git programlama dilinizde bir fonksiyonu veya metodu nasıl eşleştireceğini bulamazsa, ona bir düzenli ifade (veya regex) sağlayabilirsiniz.
Mesela, şu örnek yukarıdaki örnekle aynı işi yapardı: git log -L '/unsigned long git_deflate_bound/',/^}/:zlib.c
.
Ayrıca, ona bir dize satır aralığı veya tek bir satır numarası verebilirsiniz ve aynı türde bir çıktı alırsınız.