-
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ı
10.8 Dahili Git Ögeleri - Ortam Değişkenleri
Ortam Değişkenleri
Git her zaman bir bash
kabuğu (shell) içinde çalışır ve nasıl davrandığını belirlemek için bir dizi shell ortam değişkeni kullanır.
Arada sırada, bunların neler olduğunu bilmek ve Git’in istediğiniz gibi davranmasını sağlamak için nasıl kullanılabileceğini bilmek faydalı olabilir. Bu, Git’in dikkate aldığı tüm ortam değişkenlerinin tam bir listesi olmasa da en yararlı olanları ele alacağız.
Genel (Global) Davranış
Git’in genel davranışlarının bazıları, ortam değişkenlerine bağlıdır.
GIT_EXEC_PATH
Git’in alt programlarını (örneğin git-commit
, git-diff
ve diğerleri) nerede arayacağını belirler.
Mevcut ayarı git --exec-path
komutunu çalıştırarak kontrol edebilirsiniz.
HOME
genellikle özelleştirilebilir olarak kabul edilmez (çok fazla başka şey buna bağlıdır), ancak Git’in global yapılandırma dosyasını aradığı yerdir.
Gerçekten taşınabilir bir Git kurulumu istiyorsanız, global yapılandırma ile birlikte taşınabilir Git’in shell profili içinde HOME
'u geçersiz kılabilirsiniz.
PREFIX
benzer şekilde, sistem genel yapılandırması için kullanılır.
Git, bu dosyayı $PREFIX/etc/gitconfig
konumunda arar.
GIT_CONFIG_NOSYSTEM
ayarlanmışsa, sistem genel yapılandırma dosyasının kullanımını devre dışı bırakır.
Bu, sistem yapılandırmanızın komutlarınızı etkilediği ancak değiştirme veya kaldırma yetkinizin olmadığı durumlarda faydalıdır.
GIT_PAGER
komut satırında çok sayfalı çıktıyı görüntülemek için kullanılan programı kontrol eder.
Bu belirtilmemişse, yedek olarak PAGER
kullanılır.
GIT_EDITOR
kullanıcının bazı metinleri düzenlemesi gerektiğinde (örneğin bir katkı mesajı) başlatacağı düzenleyicidir.
Manuel olarak ayarlanmadıysa EDITOR
kullanılır.
Reponun Yeri
Git mevcut repo ile nasıl etkileşime gireceğini belirlemek için çeşitli ortam değişkenleri kullanır.
GIT_DIR
.git
klasörünün konumunu belirtir.
Eğer belirtilmemişse, Git her adımda bir .git
dizini arayarak dizin ağacı ~
veya /
'ye ulaşana kadar yürür.
GIT_CEILING_DIRECTORIES
.git
dizinini arama davranışını kontrol eder.
Yüklenmesi yavaş olan dizinlere erişiyorsanız (tape sürücüsündekiler veya yavaş bir ağ bağlantısındakiler gibi) ve özellikle kabuk komut isteminizi oluştururken Git çağrıldıysa, Git’ten denemeyi daha erken durdurmasını isteyebilirsiniz.
GIT_WORK_TREE
yalın olmayan bir repo için çalışma dizini kökünün konumunu belirtir.
Eğer --git-dir
veya GIT_DIR
belirtilmiş ancak --work-tree
, GIT_WORK_TREE
veya core.worktree
belirtilmemişse; mevcut çalışma dizini, çalışma ağacınızın en üst düzeyi olarak kabul edilir.
GIT_INDEX_FILE
(yalın olmayan repolar için) dizin dosyasının yolunu belirtir.
GIT_OBJECT_DIRECTORY
genellikle .git/objects
içinde bulunan dizinin konumunu belirtmek için kullanılabilir.
GIT_ALTERNATE_OBJECT_DIRECTORIES
(biçimi /dir/bir:/dir/iki:…
gibi biçimlendirilmiştir) iki noktalı çizgiyle ayrılmış bir listedir ve Git’e GIT_OBJECT_DIRECTORY
dizininde olmayan nesneleri kontrol etmek için nereye bakılacağını söyler.
Eğer aynı içeriğe sahip büyük dosyalara sahip birçok projeniz varsa, bu komut fazlalık kopyaları saklamaktan kaçınmak için de kullanılabilir.
Pathspec
Bir "pathspec", Git’te şeylere yol belirtme şeklinizi ifade eder ve joker karakterlerin kullanımını içerir.
Bunlar .gitignore
dosyasında ve aynı zamanda komut satırında da (git add *.c
) kullanılır.
GIT_GLOB_PATHSPECS
ve *`GIT_NOGLOB_PATHSPECS
* joker karakterlerinin pathspecs içindeki varsayılan davranışını kontrol eder.
GIT_GLOB_PATHSPECS
1’e ayarlanmışsa, joker karakterleri joker karakterleri olarak hareket eder (bu varsayılandır); GIT_NOGLOB_PATHSPECS
1’e ayarlanmışsa, joker karakterleri yalnızca kendilerine eşleşir, yani *.c
gibi bir şey yalnızca bir dosya adı olan *.c
ile eşleşir, .c
ile biten herhangi bir dosyayla değil.
Bu davranışı, pathspec’i :(glob)
veya :(literal)
ile başlatarak belirli durumlarda geçersiz kılabilirsiniz, örneğin :(glob)*.c
.
GIT_LITERAL_PATHSPECS
yukarıdaki davranışların her ikisini de devre dışı bırakır; joker karakterleri çalışmaz ve geçersiz kılma ön ekleri devre dışı bırakılır.
GIT_ICASE_PATHSPECS
tüm pathspec’leri büyük-küçük harfe duyarsız bir şekilde çalışacak şekilde ayarlar.
Katkılama (Committing)
Git katkı nesnesinin nihai oluşturulması genellikle git-commit-tree
tarafından yapılır ve bu ortam değişkenleri ana bilgi kaynağı olarak kullanılmaktadır.
Bunlar mevcut değilse yapılandırma değerlerine geri düşer.
GIT_AUTHOR_NAME
"yazar" alanındaki insanlarca okunabilir (human-readable) adı ayarlar.
GIT_AUTHOR_EMAIL
"yazar" alanı için e-posta adresidir.
GIT_AUTHOR_DATE
"yazar" alanı için kullanılan zaman damgasıdır.
GIT_COMMITTER_NAME
"katkılayıcı" alanı için insan adını ayarlar.
GIT_COMMITTER_EMAIL
"katkılayıcı" alanı için e-posta adresidir.
GIT_COMMITTER_DATE
"katkılayıcı" alanındaki zaman damgasıdır.
EMAIL
alanı user.email
yapılandırma değeri ayarlanmamışsa yedek e-posta adresidir. Eğer bu ayarlanmamışsa, Git sistem kullanıcı ve ana bilgisayar adlarına geri düşer.
Ağ Oluşturma (Networking)
Git HTTP üzerinden ağ işlemleri yapmak için curl' kitaplığını kullanır, dolayısıyla *`GIT_CURL_VERBOSE
* Git’e o kitaplık tarafından oluşturulan tüm mesajları yaymasını söyler.
Bu, komut satırında curl -v işlemine benzer.
GIT_SSL_NO_VERIFY
Git’e SSL sertifikalarını doğrulamamasını söyler.
Git repolarına HTTPS üzerinden hizmet vermek için kendinden imzalı bir sertifika kullanıyorsanız veya bir Git sunucusu kuruyorsanız ancak henüz tam bir sertifika yüklemediyseniz bu bazen gerekli olabilir.
Bir HTTP işleminin veri hızı, GIT_HTTP_LOW_SPEED_TIME
saniyeden daha uzun bir süre boyunca saniyede GIT_HTTP_LOW_SPEED_LIMIT
bayttan düşükse, Git bu işlemi iptal edecektir.
Bu değerler, http.lowSpeedLimit
ve http.lowSpeedTime
yapılandırma değerlerini geçersiz kılar.
GIT_HTTP_USER_AGENT
, HTTP üzerinden iletişim kurarken Git tarafından kullanılan kullanıcı aracısı dizesini ayarlar.
Varsayılan değer `git/2.0.0 gibi bir şeydir.
Fark Alma ve Birleştirme
GIT_DIFF_OPTS
biraz yanlış bir isimdir.
Geçerli olan tek değer, bir git diff
komutunda gösterilen bağlam satırlarının sayısını kontrol eden -u<n>
veya --unified=<n>
değerleridir.
GIT_EXTERNAL_DIFF
, diff.external
yapılandırma değeri için geçersiz kılma olarak kullanılır.
Ayarlanmışsa, Git git diff
çağrıldığında bu programı çağıracaktır.
GIT_DIFF_PATH_COUNTER
ve GIT_DIFF_PATH_TOTAL
, GIT_EXTERNAL_DIFF
veya diff.external
tarafından belirtilen programın içinden kullanışlıdır.
İlki, bir serideki hangi dosyanın farklılaştırıldığını temsil eder (1’den başlayarak), ikincisi ise toplu işteki toplam dosya sayısıdır.
GIT_MERGE_VERBOSITY
özyinelemeli birleştirme stratejisinin çıktısını kontrol eder.
İzin verilen değerler aşağıdaki gibidir:
-
0 muhtemelen tek bir hata mesajı dışında hiçbir şey çıkarmaz.
-
1 yalnızca çakışmaları gösterir.
-
2 ayrıca dosya değişikliklerini de gösterir.
-
3 dosyaların değişmediğinden dolayı atlandığını gösterir.
-
4 işlenen tüm yolları gösterir.
-
5 ve üzeri ayrıntılı hata ayıklama bilgilerini gösterir.
Varsayılan değer 2’dir.
Hata Ayıklama (Debugging)
Git’in gerçekten ne yaptığını mı bilmek istiyorsun? Git’in gömülü olarak oldukça kapsamlı bir izleme seti bulunur ve bunları etkinleştirmeniz yeterlidir. Bu değişkenlerin olası değerleri aşağıdaki gibidir:
-
``true``, ``1``, veya ``2``: izleme kategorisi stderr’e yazılır.
-
/
ile başlayan mutlak bir yol: izleme çıktısı o dosyaya yazılır. -
GIT_TRACE
* herhangi bir belirli kategoriye uymayan genel izlemeleri kontrol eder. Bu, takma adların genişlemesini ve diğer alt programlara delegasyonu içerir.
$ GIT_TRACE=true git lga
20:12:49.877982 git.c:554 trace: exec: 'git-lga'
20:12:49.878369 run-command.c:341 trace: run_command: 'git-lga'
20:12:49.879529 git.c:282 trace: alias expansion: lga => 'log' '--graph' '--pretty=oneline' '--abbrev-commit' '--decorate' '--all'
20:12:49.879885 git.c:349 trace: built-in: git 'log' '--graph' '--pretty=oneline' '--abbrev-commit' '--decorate' '--all'
20:12:49.899217 run-command.c:341 trace: run_command: 'less'
20:12:49.899675 run-command.c:192 trace: exec: 'less'
-
GIT_TRACE_PACK_ACCESS
* paket dosyası erişiminin izlenmesini kontrol eder. İlk alan erişilen paket dosyasıdır, ikincisi ise bu dosyadaki konumdur:
$ GIT_TRACE_PACK_ACCESS=true git status
20:10:12.081397 sha1_file.c:2088 .git/objects/pack/pack-c3fa...291e.pack 12
20:10:12.081886 sha1_file.c:2088 .git/objects/pack/pack-c3fa...291e.pack 34662
20:10:12.082115 sha1_file.c:2088 .git/objects/pack/pack-c3fa...291e.pack 35175
# […]
20:10:12.087398 sha1_file.c:2088 .git/objects/pack/pack-e80e...e3d2.pack 56914983
20:10:12.087419 sha1_file.c:2088 .git/objects/pack/pack-e80e...e3d2.pack 14303666
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
-
GIT_TRACE_PACKET
* ağ işlemleri için paket düzeyinde izlemeyi etkinleştirir.
$ GIT_TRACE_PACKET=true git ls-remote origin
20:15:14.867043 pkt-line.c:46 packet: git< # service=git-upload-pack
20:15:14.867071 pkt-line.c:46 packet: git< 0000
20:15:14.867079 pkt-line.c:46 packet: git< 97b8860c071898d9e162678ea1035a8ced2f8b1f HEAD\0multi_ack thin-pack side-band side-band-64k ofs-delta shallow no-progress include-tag multi_ack_detailed no-done symref=HEAD:refs/heads/master agent=git/2.0.4
20:15:14.867088 pkt-line.c:46 packet: git< 0f20ae29889d61f2e93ae00fd34f1cdb53285702 refs/heads/ab/add-interactive-show-diff-func-name
20:15:14.867094 pkt-line.c:46 packet: git< 36dc827bc9d17f80ed4f326de21247a5d1341fbc refs/heads/ah/doc-gitk-config
# […]
-
GIT_TRACE_PERFORMANCE
* performans verilerinin kaydedilmesini kontrol eder. Çıktı, her belirligit
çağrısının ne kadar sürdüğünü gösterir.
$ GIT_TRACE_PERFORMANCE=true git gc
20:18:19.499676 trace.c:414 performance: 0.374835000 s: git command: 'git' 'pack-refs' '--all' '--prune'
20:18:19.845585 trace.c:414 performance: 0.343020000 s: git command: 'git' 'reflog' 'expire' '--all'
Counting objects: 170994, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (43413/43413), done.
Writing objects: 100% (170994/170994), done.
Total 170994 (delta 126176), reused 170524 (delta 125706)
20:18:23.567927 trace.c:414 performance: 3.715349000 s: git command: 'git' 'pack-objects' '--keep-true-parents' '--honor-pack-keep' '--non-empty' '--all' '--reflog' '--unpack-unreachable=2.weeks.ago' '--local' '--delta-base-offset' '.git/objects/pack/.tmp-49190-pack'
20:18:23.584728 trace.c:414 performance: 0.000910000 s: git command: 'git' 'prune-packed'
20:18:23.605218 trace.c:414 performance: 0.017972000 s: git command: 'git' 'update-server-info'
20:18:23.606342 trace.c:414 performance: 3.756312000 s: git command: 'git' 'repack' '-d' '-l' '-A' '--unpack-unreachable=2.weeks.ago'
Checking connectivity: 170994, done.
20:18:25.225424 trace.c:414 performance: 1.616423000 s: git command: 'git' 'prune' '--expire' '2.weeks.ago'
20:18:25.232403 trace.c:414 performance: 0.001051000 s: git command: 'git' 'rerere' 'gc'
20:18:25.233159 trace.c:414 performance: 6.112217000 s: git command: 'git' 'gc'
-
GIT_TRACE_SETUP
* Git’in etkileşimde bulunduğu repo ve ortam hakkında keşfettiği bilgileri gösterir.
$ GIT_TRACE_SETUP=true git status
20:19:47.086765 trace.c:315 setup: git_dir: .git
20:19:47.087184 trace.c:316 setup: worktree: /Users/ben/src/git
20:19:47.087191 trace.c:317 setup: cwd: /Users/ben/src/git
20:19:47.087194 trace.c:318 setup: prefix: (null)
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
Diğerleri
GIT_SSH
(belirtilmişse) Git bir SSH ana bilgisayarına bağlanmaya çalıştığında ssh
yerine çağrılan bir programdır.
$GIT_SSH [kullanıcıadı@]host [-p <port>] <komut>
şeklinde çağrılır.
Bunun, ssh
'in nasıl çağrıldığını özelleştirmenin en kolay yolu olmadığını unutmayın; ek komut satırı parametrelerini desteklemez, bu nedenle bir sarıcı betik yazmak ve GIT_SSH
'i ona işaret etmek zorunda kalırsınız.
Bunun yerine, ~/.ssh/config
dosyasını kullanmak daha kolaydır.
GIT_ASKPASS
core.askpass
yapılandırma değerini geçersiz kılar.
Bu Git’in kullanıcıdan kimlik bilgilerini sorması gerektiğinde çağrılan programdır ve bir komut satırı argümanı olarak bir metin işareti bekleyebilir ve cevabı stdout
üzerinden döndürmelidir (Bu alt sistem hakkında daha fazla bilgi için Kimlik Bilgisi Depolama'e bakın).
GIT_NAMESPACE
ad alanlı (namespace) referanslara erişimi kontrol eder ve --namespace
bayrağına eşdeğerdir.
Bu genellikle sunucu tarafında kullanışlıdır, tek bir repoya birden fazla çatallama depolamak isteyebilirsiniz, ancak referansları ayrı tutmayı tercih edebilirsiniz.
GIT_FLUSH
Git’in stdout’a aşamalı olarak yazarken tamponlanmamış G/Ç kullanmasını zorlamak için kullanılabilir.
1 değeri Git’in daha sık sıvama yapmasını sağlar, 0 değeri tüm çıktının tamponlanmasına neden olur.
Bu değişken belirtilmemişse varsayılan değer, etkinlik ve çıkış moduna bağlı olarak uygun bir tamponlama düzeni seçmektir.
GIT_REFLOG_ACTION
reflog’a yazılacak açıklayıcı metni belirlemenizi sağlar.
İşte bir örnek:
$ GIT_REFLOG_ACTION="my action" git commit --allow-empty -m 'my message'
[master 9e3d55a] my message
$ git reflog -1
9e3d55a HEAD@{0}: my action: my message