-
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ı
3.5 Git Dalları - Uzak Dallar
Uzak Dallar
Uzak işaretçiler, uzak repolarınızdaki dalları, etiketleri ve benzerlerini içeren referanslardır.
git ls-remote [remote]
veya git remote show [remote]
komutları ile uzak işaretçilerin tam listesini alabilir ve daha fazla bilgi edinebilirsiniz.
Daha yaygın bir yöntem ise uzak izleme dallarından yararlanmaktır.
Uzak izleme dalları, uzak dalların durumunu gösteren işaretçilerdir. Bunlar, hareket ettiremeyeceğiniz yerel işaretçilerdir. Git, herhangi bir ağ iletişimi yaptığınızda bunları sizin için taşır ve bu sayede uzak repo durumunu doğru bir şekilde temsil ettiklerinden emin olur. Onları, son bağlandığınızda uzak repolarınızdaki dalların nerede olduğunu hatırlatan birer yer işareti gibi düşünebilirsiniz.
Uzaktan izlenen (remote-tracking) dal isimleri <remote>/<branch>
şeklindedir.
Örneğin, origin
uzak repo ile en son iletişim kurduğunuzda master
dalının ne durumda olduğunu görmek istiyorsanız, origin/master
dalına bir göz atarsınız.
Meslektaşlarınızla bir iş paketi üzerinde çalışıyorsanız ve onlar yeni bir katkı işleyerek iss53
dalını yukarı itmişse; kendi yerel iss53
dalınız olabilir ancak sunucuda yer alan dal, uzak izleme dalı olan origin/iss53
tarafından temsil edilir.
Bu biraz karışık olabileceği için bir örnekle inceleyelim.
Diyelim ki yerel ağınızdaki git.ourcompany.com
sayfası üzerinde bir Git sunucunuz var.
Eğer bu sunucudan kopyalama işlemi yapıyorsanız, git clone
komutu otomatik olarak ona origin
adını verir, tüm verilerini indirir, master
dalının bulunduğu yeri gösteren bir işaretçi oluşturur ve bu işaretçiyi yerelde origin/master
olarak adlandırır.
Git ayrıca üzerinde çalışabileceğiniz bir başlangıç noktası olabilmesi için sizin kendi yerel master
dalınızı da oluşturur.
Bu dal da origin
sunucusunun master
dalıyla aynı yerden başlar.
Not
|
``origin`` özel değildir
"Master" dal adının Git’te özel bir anlamı olmadığı gibi, "origin" adı da özel bir anlama sahip değildir.
"Master", |
Eğer yerel master
dalında çalışıyorsanız ve aynı zamanda başka birisi git.ourcompany.com
üzerine bir değişiklik itiyorsa, kendi master
dalını güncelledikce, geçmişleriniz farklı yönlere ilerler.
Ayrıca, kendi origin sunucunuzla iletişimde olmadığınız sürece, origin/master
işaretçisi yer değiştirmez.
Belirli bir uzak repo ile çalışmanızı eşzamanlamak (synchronize) için git fetch <remote>
komutunu çalıştırırsınız (bizim durumumuzda, git fetch origin
).
Bu komut, origin
'in hangi sunucuda olduğuna (bu durumda, git.ourcompany.com
) bakar, henüz alınmayan verileri getirir, yerel veritabanınızı günceller ve origin/master
işaretçisini yeni ve daha güncel konumuna taşır.
git fetch
uzak takip dallarınızı güncellerÇoklu uzak sunuculara sahip olmanın ve bu uzak projelerin uzak dallarının nasıl göründüğünü anlamak için, şu hayali senaryoya başvuralım: Diyelim ki sadece çevik (agile) takımlarınızdan birisi tarafından geliştirme amaçlı kullanılan başka bir iç Git sunucunuz var ve bu sunucu git.team1.ourcompany.com
adresinde bulunmaktadır.
Bunu şu an üzerinde çalıştığınız projeye Git Temelleri bölümünde ele aldığımız gibi git remote add
komutu ile yeni bir uzak işaretçi olarak ekleyebilirsiniz.
Bu uzak sunucuyu kısaca teamone
olarak adlandırın.
Şimdi, git fetch teamone
komutunu çalıştırarak, henüz sahip olmadığınız tüm verileri uzak teamone
sunucusundan getirebilirsiniz.
Bu sunucu şu anda origin
sunucunuzun sahip olduğu verilerin bir alt kümesine sahip olduğu için, Git hiç veri getirmez ancak teamone`ın kendi `master
dalındaki katkıya işaret eden teamone/master
adında bir uzak takip dalı ayarlar.
İtme
Bir dalı dünyayla paylaşmak istediğinizde, yazma erişimine sahip olduğunuz bir uzak sunucuya itmeniz gerekiyor. Yerel dallarınız, yazma işlemi yapabileceğiniz uzak sunuculara otomatik olarak eşzamanlandırılmaz; paylaşmak istediğiniz dalları açıkça itmeniz gerekir. Bu şekilde, paylaşmak istemediğiniz işler için özel (private) dallar kullanabilir ve yalnızca işbirliği yapmak istediğiniz tematik dalları itebilirsiniz.
Eğer diğerleriyle birlikte çalışmak istediğiniz serverfix
adında bir dalınız varsa, onu ilk dalınızı ittiğiniz şekilde itebilirsiniz.
git push <remote> <branch>
komutunu çalıştırın:
$ git push origin serverfix
Counting objects: 24, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (24/24), 1.91 KiB | 0 bytes/s, done.
Total 24 (delta 2), reused 0 (delta 0)
To https://github.com/schacon/simplegit
* [new branch] serverfix -> serverfix
Bu biraz kısayol gibidir.
Git otomatik olarak serverfix
dal ismini refs/heads/serverfix:refs/heads/serverfix
şeklinde genişletir: Bu Lütfen benim yerel serverfix
dalımı al ve onu uzaktaki serverfix
dalını güncellemek için it anlamına gelir.
refs/heads/
kısmını daha sonra Dahili Git Ögeleri bölümünde detaylı bir şekilde ele alacağız, ancak bunu genellikle belirtmenize gerek yoktur.
Aynı işlemi gerçekleştiren bir diğer yöntem de git push origin serverfix:serverfix
şeklinde kullanmaktır.
Bu da Lütfen benim serverfix
dalımı al ve onu uzaktaki serverfix
dalı yap anlamına gelir.
Bu formatı kullanarak, yerel bir dalı farklı bir isimdeki uzak bir dala itebilirsiniz.
Eğer uzakta serverfix
olarak adlandırılmış bir dal istemiyorsanız, bunun yerine yerel serverfix
dalınızı uzaktaki projedeki awesomebranch
dalına itmek için git push origin serverfix:awesomebranch
komutunu çalıştırabilirsiniz.
Not
|
Her defasında şifrenizi yazmayın
Eğer bir HTTPS URL’si kullanarak itme işlemi yapıyorsanız, Git sunucusu sizden kimlik doğrulaması için kullanıcı adı ve şifrenizi isteyecektir. Varsayılan olarak, Git bu bilgileri size terminal üzerinden sorması için bir istekte bulunur. Böylece sunucu itmeye izin verip vermediğinizi kontrol edebilir. Her itme işlemi yaparken bunu her seferinde yazmak istemiyorsanız, bir credential cache (kimlik bilgisi önbelleği) kurabilirsiniz. En basit olanı, bunu birkaç dakika boyunca bellekte tutmaktır ve bunu kolayca Çeşitli kimlik bilgisi önbelleği seçenekleri hakkında daha fazla bilgi için Kimlik Bilgisi Depolama bölümüne bakabilirsiniz. |
Bir sonraki seferde bir meslektaşınız sunucudan veri getirdiğinde, sunucunun serverfix
dalının versiyonuna dair referansı, uzak dal origin/serverfix
altında olacaktır:
$ git fetch origin
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0)
Unpacking objects: 100% (3/3), done.
From https://github.com/schacon/simplegit
* [new branch] serverfix -> origin/serverfix
Yeni uzak takip dallarını getiren bir getirme işlemi yaptığınızda, bunların düzenlenebilir yerel kopyalarına otomatik olarak sahip olmazsınız.
Yani bu durumda, yeni bir serverfix
dalınız olmaz — sadece üzerinde değişiklik yapamayacağınız bir origin/serverfix
işaretçiniz olur.
Bu çalışmayı mevcut çalışma dalınıza birleştirmek için git merge origin/serverfix
komutunu çalıştırabilirsiniz.
Eğer üzerinde çalışabileceğiniz kendi serverfix
dalınızı istiyorsanız, bunu uzak takip dalınızın üzerine kurabilirsiniz:
$ git checkout -b serverfix origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'
Böylelikle, origin/serverfix
'in başladığı yerden devam eden ve üzerinde çalışabileceğiniz bir yerel dal elde etmiş olursunuz.
Dalları Takip
Bir uzak takip dalından yerel bir dala geçmek, otomatik olarak bir takip dalı oluşturur (ve takip ettiği dal üst-akım dalı (upstream branch) olarak adlandırılır).
Takip eden dallar, bir uzak dal ile doğrudan ilişkisi olan yerel dallardır.
Bir takip dalındaysanız ve git pull
yazarsanız, Git otomatik olarak hangi sunucudan getirileceğini ve hangi dalın birleştirileceğini bilir.
Bir repoyu kopyaladığınızda, genellikle otomatik olarak origin/master
'ı takip eden bir master
dalı oluşturur.
Ancak isterseniz başka takip dalları da kurabilirsiniz (diğer uzaklardaki dalları takip edenler veya master
dalını takip etmeyenler).
Basit durum, az önce gördüğünüz gibidir: git checkout -b <dal> <uzak>/<dal>
.
Bu, Git’in --track
kısaltmasını sağlayan yaygın bir işlemdir:
$ git checkout --track origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'
Aslında, bu işlem o kadar yaygındır ki, bu kısayol için bile bir kısayol vardır. Eğer geçmeye çalıştığınız dal ismi (a) mevcut değilse ve (b) yalnızca bir uzak dalla tam olarak eşleşiyorsa, Git sizin için bir takip dalı oluşturacaktır:
$ git checkout serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'
Uzak daldan farklı bir isimle yerel bir dal kurmak için, ilk versiyonu kullanarak kolayca farklı bir yerel dal ismi kullanabilirsiniz:
$ git checkout -b sf origin/serverfix
Branch sf set up to track remote branch serverfix from origin.
Switched to a new branch 'sf'
Şimdi, yerel dalınız sf
, otomatik olarak origin/serverfix
'ten çekecek.
Eğer zaten bir yerel dala sahipseniz ve onu henüz çektiğiniz bir uzak dalıyla eşleştirmek veya takip ettiğiniz yukarı akış dalını değiştirmek istiyorsanız, git branch
komutunun -u
veya --set-upstream-to
seçeneğini kullanarak bunu istediğiniz zaman açıkça belirtebilirsiniz.
$ git branch -u origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Not
|
Üstakım (upstream) kısayolu
Eğer kurulu bir takip dalınız varsa, onun üst-akım dalını |
Takip eden dallarınızı görmek istiyorsanız, git branch
komutuna -vv
seçeneğini ekleyebilirsiniz.
Bu, her bir dalın takip ettiği bilgileri ve yerel dalınızın önde, geride veya her ikisinde olup olmadığını içeren daha fazla bilgiyle birlikte yerel dallarınızı listeleyecektir.
$ git branch -vv
iss53 7e424c3 [origin/iss53: ahead 2] forgot the brackets
master 1ae2a45 [origin/master] deploying index fix
* serverfix f8674d9 [teamone/server-fix-good: ahead 3, behind 1] this should do it
testing 5ea463a trying something new
Burada iss53
dalımızın origin/iss53
ü takip ettiğini ve 'önde (ahead) iki olduğunu görebiliriz.
Bu da lokalde henüz sunucuya gönderilmemiş iki katkı olduğu anlamına gelir.
Ayrıca, master
dalımızın origin/master
ı takip ettiğini ve güncel olduğunu görebiliriz.
Sonrasında, serverfix
dalımızın teamone
sunucusundaki server-fix-good
dalını takip ettiğini ve 'önde (ahead) üç, geride (behind) bir olduğunu görebiliriz.
Bu da henüz birleştirmediğimiz bir katkı olduğu ve lokalde henüz göndermediğimiz üç katkı olduğu anlamına gelir.
Son olarak, testing
dalımızın herhangi bir uzak dalı takip etmediğini görebiliriz.
Bu sayıların, her sunucudan en son getirme yaptığınızdan beri olan sayılar olduğunu unutmak önemlidir. Bu komut sunuculara ulaşmaz, size bunları yerel olarak önbellekten aldığı bilgileri söyler. Eğer tamamen güncel önde (ahead) ve geride (behind) sayıları istiyorsanız, bunu çalıştırmadan hemen önce tüm uzak sunuculardan getirmeniz gerekecektir. Bunu şu şekilde yapabilirsiniz:
$ git fetch --all; git branch -vv
Çekme
git fetch
komutu, henüz sahip olmadığınız sunucudaki tüm değişiklikleri getirir, ancak çalışma dizininizi hiç değiştirmez.
Sadece veriyi sizin için alır ve birleştirmenize izin verir.
Ancak, çoğu durumda git fetch
'in hemen ardından gelen bir git merge
işlemi olan git pull
adlı bir komut bulunmaktadır.
Son bölümde gösterildiği gibi bir takip dalınız varsa, bunu açıkça ayarlayarak veya clone
veya checkout
komutları tarafından sizin için oluşturulmuşsa, git pull
, mevcut dalınızın hangi sunucuyu ve dalı takip ettiğini araştırır, bu sunucudan veri çeker ve ardından bu uzak dalı birleştirmeye çalışır.
Genellikle git pull
komutunun sihirli davranışı sıklıkla karmaşıklığa neden olabileceğinden, açıkça fetch
ve merge
komutlarını kullanmak daha iyidir.
Uzak Dalları Silmek
Varsayalım ki bir uzak dal ile işiniz bitti - diyelim ki siz ve meslektaşlarınız bir özelliği tamamladınız ve onu uzaktaki master
dalınıza (veya kararlı kod çizginizin bulunduğu dal) birleştirdiniz.
Bir uzak dalı silmek için git push
komutuna --delete
seçeneğini ekleyebilirsiniz.
Eğer serverfix
dalınızı sunucudan silmek istiyorsanız, aşağıdaki komutu çalıştırabilirsiniz:
$ git push origin --delete serverfix
To https://github.com/schacon/simplegit
- [deleted] serverfix
Temelde, bu işlem sunucudan işaretçiyi kaldırır. Git sunucusu genellikle çöp toplama işlemi çalışana kadar veriyi orada tutar, bu nedenle eğer yanlışlıkla silinmişse genellikle kolaylıkla kurtarılabilir.