-
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.9 Git Araçları - Rerere
Rerere
git rerere
işlevselliği biraz gizli bir özelliktir.
Adı, "kaydedilen çözümü yeniden kullan" anlamına gelir ve adından da anlaşılacağı gibi, bir hunk çakışmasını nasıl çözdüğünüzü Git’e hatırlatmanıza olanak tanır, böylece bir sonraki sefer aynı çakışmayı gördüğünde, Git otomatik olarak çözebilir.
Bu işlevselliğin gerçekten kullanışlı olabileceği birkaç senaryo bulunmaktadır.
Dokümentasyonda belirtilen örneklerden biri, uzun ömürlü bir konu dalını temiz bir şekilde birleştirilmesini istediğiniz, ancak katkı geçmişinizi karmaşıklaştıracak bir dizi ara birleştirme katkısı görmek istemediğiniz durumdur.
rerere
etkinleştirildiğinde, ara sıra birleştirme deneyebilir, çakışmaları çözebilir ve ardından birleştirmeyi geri alabilirsiniz.
Bu işlemi sürekli olarak yaparsanız, rerere
her şeyi otomatik olarak sizin için yapabileceği için son birleştirmenin kolay olması beklenir.
Bu aynı taktik, her seferinde aynı yeniden temelleme çakışmalarıyla uğraşmak zorunda kalmadan, bir dalı yeniden temellenmiş tutmak istediğiniz de de kullanılabilir. Ya da bir daldan birleştirdiğiniz ve bir sürü çakışmayı düzelttiğiniz bir dalı alıp yeniden temellemeye karar verirseniz — muhtemelen tüm aynı çakışmaları tekrar düzeltmenize gerek kalmaz.
rerere
'nin başka bir uygulaması, Git projesinin kendisinde sıklıkla olduğu gibi, zaman zaman birbirine dönüşen birçok konu dalını birleştirerek test edilebilir bir baş yapı oluşturmanızdır.
Testler başarısız olursa, birleştirmeleri geri alabilir ve çatışmaları tekrar çözmeden, başarısızlığa sebep olan konu dalını çıkararak testleri yeniden yürütebilirsiniz.
rerere
işlevselliğini etkinleştirmek için, yalnızca şu yapılandırma ayarını çalıştırmanız yeterlidir:
$ git config --global rerere.enabled true
Ayrıca, belirli bir repoda .git/rr-cache
dizinini oluşturarak da etkinleştirebilirsiniz, ancak yapılandırma ayarı daha açıklayıcıdır ve bu özelliği sizin için genel olarak etkinleştirir.
Şimdi basit bir örnek görelim, önceki örneğimize benzer.
Diyelim ki hello.rb
adında şöyle bir dosyamız var:
#! /usr/bin/env ruby
def hello
puts 'hello world'
end
Aynı daha önce yaptığımız gibi bir dalda "hello" kelimesini "hola" olarak değiştirirken, diğer bir dalda "world" kelimesini "mundo" olarak değiştiriyoruz, yine önceki gibi.
İki dalı birleştirdiğimizde, birleştirme çakışması alacağız:
$ git merge i18n-world
Auto-merging hello.rb
CONFLICT (content): Merge conflict in hello.rb
Recorded preimage for 'hello.rb'
Automatic merge failed; fix conflicts and then commit the result.
Orada Recorded preimage for FILE
yeni satırını fark etmişsinizdir.
Yoksa, bu normal birleştirme çakışmasıyla tamamen aynı görünmeliydi.
Bu noktada, rerere
bize birkaç bilgi verir.
Normalde, şu anda nelerin çakıştığını görmek için git status
komutunu çalıştırabilirsiniz:
$ git status
# On branch master
# Unmerged paths:
# (use "git reset HEAD <file>..." to unstage)
# (use "git add <file>..." to mark resolution)
#
# both modified: hello.rb
#
Ancak, git rerere
komutunun önişlem durumunu kaydettiği şeyleri git rerere status
ile görebilirsiniz:
$ git rerere status
hello.rb
Ve git rerere diff
komutu, çözümün mevcut durumunu gösterecektir (çözümlemeye başladığınız şeyi ve onun son halini).
$ git rerere diff
--- a/hello.rb
+++ b/hello.rb
@@ -1,11 +1,11 @@
#! /usr/bin/env ruby
def hello
-<<<<<<<
- puts 'hello mundo'
-=======
+<<<<<<< HEAD
puts 'hola world'
->>>>>>>
+=======
+ puts 'hello mundo'
+>>>>>>> i18n-world
end
Ayrıca (bunun rerere
ile ilgisi yoktur), git ls-files -u
komutunu kullanarak, çakışan dosyaları, önceki, sol ve sağ sürümleri görebilirsiniz:
$ git ls-files -u
100644 39804c942a9c1f2c03dc7c5ebcd7f3e3a6b97519 1 hello.rb
100644 a440db6e8d1fd76ad438a49025a9ad9ce746f581 2 hello.rb
100644 54336ba847c3758ab604876419607e9443848474 3 hello.rb
Şimdi bunu sadece puts 'hola mundo'
olarak çözebilir ve git rerere diff
komutunu tekrar çalıştırarak rerere’nin ne hatırlayacağını görebilirsiniz:
$ git rerere diff
--- a/hello.rb
+++ b/hello.rb
@@ -1,11 +1,7 @@
#! /usr/bin/env ruby
def hello
-<<<<<<<
- puts 'hello mundo'
-=======
- puts 'hola world'
->>>>>>>
+ puts 'hola mundo'
end
Bu temelde, Git bir hello.rb
dosyasında bir hunk çakışması gördüğünde, bir tarafta ``hello mundo`` ve diğer tarafta ``hola world`` olan durumda, onu ``hola mundo`` olarak çözecektir.
Artık bunu çözülmüş olarak işaretleyebilir ve katkı olarak işleyebiliriz:
$ git add hello.rb
$ git commit
Recorded resolution for 'hello.rb'.
[master 68e16e5] Merge branch 'i18n'
Görebileceğiniz gibi, "Recorded resolution for FILE" (Dosya için çözüm kaydedildi) ifadesini gösteriyor.
Şimdi, o birleştirmeyi geri alalım ve ardından onu master dalımızın üzerine yeniden temelleyelim.
Reset Komutunun Gizemleri bölümünde gördüğümüz gibi, git reset
komutunu kullanarak dalımızı geri alabiliriz.
$ git reset --hard HEAD^
HEAD is now at ad63f15 i18n the hello
Birleştirmemiz geri alındı. Şimdi konu dalını yeniden temelleyelim.
$ git checkout i18n-world
Switched to branch 'i18n-world'
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: i18n one word
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging hello.rb
CONFLICT (content): Merge conflict in hello.rb
Resolved 'hello.rb' using previous resolution.
Failed to merge in the changes.
Patch failed at 0001 i18n one word
Şimdi, beklendiği gibi aynı birleştirme çakışmasını aldık, ancak Resolved FILE using previous resolution
(Önceki çözüm kullanılarak DOSYA çözüldü) satırına bakın.
Dosyaya baktığımızda, zaten çözüldüğünü ve içinde birleştirme çatışma işaretçilerinin olmadığını göreceğiz.
#! /usr/bin/env ruby
def hello
puts 'hola mundo'
end
Ayrıca, git diff
komutu, size çakışmanın nasıl otomatik olarak yeniden çözüldüğünü gösterecektir:
$ git diff
diff --cc hello.rb
index a440db6,54336ba..0000000
--- a/hello.rb
+++ b/hello.rb
@@@ -1,7 -1,7 +1,7 @@@
#! /usr/bin/env ruby
def hello
- puts 'hola world'
- puts 'hello mundo'
++ puts 'hola mundo'
end
Ayrıca, git checkout
kullanarak çakışan dosya durumunu yeniden oluşturabilirsiniz:
$ git checkout --conflict=merge hello.rb
$ cat hello.rb
#! /usr/bin/env ruby
def hello
<<<<<<< ours
puts 'hola world'
=======
puts 'hello mundo'
>>>>>>> theirs
end
İleri Seviye Birleştirme bölümünde bunun bir örneğini gördük.
Ancak şimdilik, sadece git rerere
komutunu yeniden çalıştırarak tekrar çözeceğiz:
$ git rerere
Resolved 'hello.rb' using previous resolution.
$ cat hello.rb
#! /usr/bin/env ruby
def hello
puts 'hola mundo'
end
rerere
önbelleğindeki çözümü kullanarak dosyayı otomatik olarak çözdük.
Şimdi izleme alabilir ve yeniden temellemeyi tamamlamak için devam edebilirsiniz.
$ git add hello.rb
$ git rebase --continue
Applying: i18n one word
Dolayısıyla, birçok yeniden birleştirme yaparsanız veya bir konu dalınızı bir sürü birleştirmenin ardından güncel tutmak istiyorsanız, veya sık sık yeniden temelleme yapıyorsanız, rerere
'yi açarak işlerinizi biraz olsun kolaylaştırabilirsiniz.