GIT Branch Nedir ? GIT Merge Nasıl Yapılır? HEAD ve Master Nedir?

Burak Keçeci
4 min readJun 13, 2022

--

Versiyon kontrol sistemi olan GIT hakkında önceki yazımızda temel kavramları öğrenmiştik. Şimdi ise çoğu zaman projelerimizde kullandığımız diğer kavramlara göz atalım.

Bu serimizde yazarı olduğumuz kitap örneğinden devam ediyor olacağız. Örnekte şu ana kadar ne yaptığımızı buradan görebilirsiniz.

GIT sayesinde projelerimizde yaptığımız değişikleri kaydedebiliyor ve neler yaptığımızı aldığımız notlardan görebiliyorduk (commit). Peki projeye yeni bir özellik eklemek karar verdiniz fakat şu ana kadar yazdığınız çalışır kodunuzu da bozmak istemiyorsunuz. Ne yaparsınız? Git branch kavramı burada karşımıza çıkıyor.

‘Common base’ olarak işaretlenen bölüm bizim şu ana kadar yazdığımız her bir özellik için temel bilgileri içeren projemizdir. Eğer bu yapıyı bir ağaç gibi düşünürsek yeşil dal projemize eklediğimiz yeni bir özelliği (feature) temsil eder. Bu özelliği projemizin ana omurgasını (master) bozmamak adına yeni bir dal üzerinden oluşturuyoruz. Bu sayede projemizin ‘base’ haline rahatlıkla geri dönebiliriz. Diğer bir taraftan özelliği projemize eklemek istersek ‘merge’ özelliğini kullanarak ana omurgadaki projeyle birleştirebiliriz.

git branch kullanımı:

Bu komut oluşturduğumuz yapıdaki tüm dalları görmemizi sağlar. Eğer yeni bir dal oluşturmak istiyorsak ‘git branch dalAdi’ komutunu kullanabiliriz.

$ git branch
* master

‘ * master ‘ bize projemizde bir dal olduğunu ve şu an ‘master’ dalında işlem yaptığımızı gösteriyor.

Şimdi projemize arka kapak yazısı için yeni bir özellik ekleyelim.

$ git branch backcover

Oluşturduğumuz yeni dalı kontrol etmek için tekrardan ‘git branch’ komutunu çağıralım.

$ git branch
backcover
* master

Başarılı bir şekilde arka plan dalımız oluşturuldu. Fakat hala ‘master’ dalında işlem yaptığımızı belirtiyor (‘*’). Peki istediğimiz dala nasıl geçeriz?

git switch komutu:

Bu komut oluşturduğumuz yapıdaki dallar arasında geçiş yapmamızı sağlar.

Haydi oluşturduğumuz arka kapak dalına geçiş yapalım.

$ git switch backcover
Switched to branch 'backcover'

Bir adet arka kapak yazısı için döküman oluşturalım ve bu dökümanı git tarafından takip edilmesini sağlayalım.

$ touch backcover.txt   // 1 

$ git add backcover.txt // 2

$ git status // 3
On branch backcover
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: backcover.txt

$ git commit -m "Back cover created." // 4
[backcover 383541a] Back cover created.
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 backcover.txt

Birinci alanda dökümanı oluşturduk. İkinci alanda ise bunu Git tarafından takip edilmesini sağladık. Üçüncü alanda dosyamızın durumunu inceledik ve Git bize commit edilmeyen dosyaları belirledi. Son adım olarak da bu dosyayı commit ederek dosyamızı sahne (stage) alanına yönlendirdik.

Peki yaptığımız bu commit nereye gitti. Bizim ana projemizde de bulunuyor mu? ‘git log’ komutu ile hemen kontrol edelim.

$ git log
commit 383541aac4339b4509a3508e61f15fbcd9d07f94 (HEAD -> backcover)
Author: Burak Keçeci <burakdemo@gmail.com>
Date: Tue Jun 14 00:28:26 2022 +0300

Back cover created.

commit 7288a7066ddc76a2eb7e86c03973c4f94053591f (master)
Author: Burak Keçeci <burakdemo@gmail.com>
Date: Mon Jun 13 17:44:48 2022 +0300

Preface files updated.

commit 093e60890e60e19c4d53572127f3499c2ee90b3a
Author: Burak Keçeci <burakdemo@gmail.com>
Date: Mon Jun 13 17:40:50 2022 +0300

Preface files created

Dikkatinizi çektiyse eğer daha önce yaptığımız commit de (HEAD -> master) gösteriyordu. Şimdi ise (HEAD -> backcover) olarak belirtilmiş. ‘HEAD’ işlem yaptığımız dal işaret etmek için kullanılıyor.

Eklediğimiz yeni özelliğin olgunlaştığını ve artık ana omurgamıza (master) eklemeye karar verdik.

git merge komutu :

Bu komut oluşturduğumuz yapıdaki dalları birleştirmemizi sağlar.

Kitap dosyamızdaki arka kapak yazısını artık projemize ekleyebiliriz. ‘git merge’ komutu eklemeyi istediğimiz dal seçili iken yapılmalıdır. Bu yüzden ilk önce ‘git switch’ komutunu kullanarak ana projeme geçiyorum.

$ git switch master
Switched to branch 'master'

Şimdi birleştirelim.

$ git merge backcover
Updating 7288a70..383541a
Fast-forward
backcover.txt | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 backcover.txt

Projemizi başarılı bir şekilde birleştirdik. Buradaki önemli nokta ise commit edilmiş yani sahneye (stage) gönderilmiş dosyalarımızı birleştirebildiğimizdir. Eğer commit etmeseydik ne olurdu gibi aklınızda soru olabilir. Bu zamanda devreye ‘git stash’ kavramı giriyor. Git bu tip durumlar için içinde stash alanı olarak ayrı bir bölüm tanımlamıştır. Haydi bir örnek üzerinde bunu deneyimleyelim.

git stash komutu:

Bu komut oluşturduğumuz dal üzerinde tamamlanmamış projeyi saklamaya yardımcı olur.

Stash-Repository Diagram

Örneğimiz üzerinden ‘git stash’ komutunu inceleyelim. İlk öncelikle yeni bir branch açalım ve adına da kaynakça koyalım. Bu sırada da kaynakça adında dosyamızı da oluşturalım.

$ touch references.txt
$ git branch references

Oluşturduğumuz dosyanın takip edilmesini sağlayalım.

$ git add .

Kaynakça bölümünü tamamlamadığımızı varsayalım. Burada yapılan değişiklikleri de kaybetmek istemediğimiz için bunları stash alanına yönlendirelim.

$ git stash
Saved working directory and index state WIP on references: 383541a Back cover created.

Artık bir önceki commit’e kadar yaptığımız değişikler stash alanında tutuluyor olacak. Stash de tutulan verilerimizi görmek için ‘git stash list’ komutunu kullanabiliriz.

$ git stash list
stash@{0}: WIP on references: 383541a Back cover created.

Stash alanındaki son çalıştığımız dosyayı çekmek için ise ‘git stash pop’ komutunu çağırabiliriz.

$ git stash pop
On branch references
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: references.txt

Dropped refs/stash@{0} (46fc3ab6e0985a034898452fb753aa5ed9d8144c)

Daha detaylı bilgi almak için https://git-scm.com/doc adresine bakabilirsiniz.

Şimdiye kadar işlediğimiz komutlar bir projede sıklıkla kullandığımız komutlardır. Local olarak tuttuğumuz depolarımızı uzak bir depoya göndermek için ise farklı komutları kullanıyoruz. Bu metotları da diğer bir yazıda anlatma dileğiyle…

Soru ve önerileriniz için;

--

--