Git
Chapters ▾ 2nd Edition

3.5 Git Branching - 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.

Örnek 7. ``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", git init komutunu çalıştırdığınızda başlangıç dalı için varsayılan isim olduğu için yaygın olarak kullanılır. Benzer şekilde, "origin" de git clone komutunu çalıştırdığınızda varsayılan uzak sunucu adıdır. Eğer git clone -o booyah şeklinde bir komut çalıştırırsanız, o zaman varsayılan uzak dalınız booyah/master olacaktır.

Kopyalamamadan sonra sunucu ve yerel repolar.
Görsel 30. Kopyalamamadan sonra sunucu ve yerel repolar

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.

Yerel ve uzak çalışma farklılaşabilir.
Görsel 31. Yerel ve uzak çalışma farklılaşabilir

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` zak takip dallarınızı günceller.
Görsel 32. 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 Basics 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.

Başka bir sunucuyu uzak olarak eklemek.
Görsel 33. Başka bir sunucuyu uzak olarak eklemek

Ş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.

`teamone/master` için uzak takip dalı.
Görsel 34. teamone/master` için uzak takip dalı

İ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 Git Internals 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.

Örnek 8. 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 git config --global credential.helper cache komutunu çalıştırarak yapabilirsiniz.

Çeşitli kimlik bilgisi önbelleği seçenekleri hakkında daha fazla bilgi için Credential Storage 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.
Örnek 9. Üstakım (upstream) kısayolu

Eğer kurulu bir takip dalınız varsa, onun üst-akım dalını @{upstream} veya @{u} kısaltmasıyla işaretleyebilirsiniz. Yani eğer master dalındaysanız ve bu dal origin/master 'ı takip ediyorsa, isterseniz git merge origin/master yerine git merge @{u} gibi bir şey söyleyebilirsiniz.

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.

scroll-to-top