Git Hakkında Kısa Bilgi ve Kullanımı

Neden Git?

1- Versiyon kontrolü yapmamızı sağlar.

Versiyon kontrolü: bir dosyadaki değişiklikleri takip etmektir.

2- Uyumlu ekip çalişmasi sağlar.

Ekip arkadaşlarının aynı dosya veya projenin farklı dosyalarında, yaptıkları değişiklikleri, version kontrol sistemi kullanarak, sağlıklı bir şekilde merge(birleştirme) edilebilir.

3- Önceki versiyonlara geri dönülmesini sağlar.

Yaptığınız değişiklikler ile projeyi çöpe döndürdüyseniz, projenizin önceki haline tekrar dönebilirsiniz

4- Dosyaların neden değiştiğini anlama

Değişikliklerinizi commit etmek istediğinizde, comment ekleyerek(zorunlu) değişikliğin nedenini kısaca açıklamanızı sağlar.

PROJE İÇİN REPOSTORY(DEPO) OLUŞTURMAK

Repostory dosyadaki tüm değişiklikler ile değişikliği kim, ne zaman yaptı ve değişiklikle ilgili açaklamayı, ayrı bir versiyon adı altında tutan bir veritabanıdır.

$ git init

komutu ile yeni bir depo oluşturarak, projemizin tüm dosyalarını versiyon kontrolü altına alabiliriz. Bu komut .git isimli bir gizli klasör oluşturur ve tüm bilgiler bir dizi şeklinde bu klasör içinde tutulur.

  • Versiyon altndaki bir projeyi de
$ git clone

komutu ile indirebiliriz.

ör: git clone git@github.com:username/filename.git

$git status komutu ile hangi dosyalarda değişiklik yaptığımızı görebiliriz

Staging area: commit’ e tabi tutacağımız değişiklikleri tutan ara bir alandır.
Not: Rails te .gitignore dosyası, depomuza eklemek istemediğimiz dosyaları belirttiğimiz yerdir.

Ör: /db/*.sqlite3

/db/*.sqlite3-journal

/log/*.log

database içerisinde sqlite3 uzantılı tum dosyaların ve log klasöründeki, log uzantılı tüm dosyaların görmezden gelinmesini istiyoruz.

  • Zaman zaman, özellikle takım çalışması söz konusu ise, değişikliklere göz atmak isteyebilirsiniz. Proje için oluşturulan commitleri tarihçesini incelemek için,
$ git log

komutu kullanılabilir.

  • Yapılan değişiklikleri zaman zaman repostory e göndermek için,
$ git push 

komutu kullanılır.
Remote(uzak) repostory e değişiklikleri gönderme adımları;

$ git status
$ git add .
$ git commit -m “yapılan değişikliği kısaca açıkla”
$ git push

LOCAL(YEREL) VE REMOTE(UZAK) REPOSTORY LER

  • Local repostory, kendi bilgisayarımızda, proje dosyasındaki .git klasörüdür. Burada sadece bizim yaptığımız degişiklikler tutulur ve yerel diskte saklanır.
  • Remote repostory ise, genellikle uzaktaki sunucuda yer alır ve bu sunucu içerisindeki .git klasöründe, hangi takım üyesinin ne zaman, ne değişiklik yaptıgı gibi bilgiler tutulur.

BRANCHİNG(DALLANMA) VE MERGİNG(BİRLEŞME)

Branch ler git in en iyi özelliklerinden birisidir. Bug fix ler, yeni özellikler üzerinde çalışmak veya deneysel özellikler geliştirmek için kullanılabilir. Örneğin, projemize yeni bir özellik eklemek istediğimizde, diğer kodları riske atmadan, branch ler yardımıyla geliştirebilirsiniz. Olumlu sonuçlar alıyorsanız projenize ekleyebilir, almıyorsanız silebilirsiniz.

BRANCH LER İLE ÇALIŞMAK

Aslında farkında olmadan, proje üzerinde çalışırken, herzaman aktif bir branch üzerinde çalışırız. Bu dala master branch veya anadal diyebiliriz.

$ git branch deneme

komutunu çalıştırdığımızda, git, proje dosyalarının o anki halini barındıran, deneme isimli bir branch oluşturur.

  • $git branch komutu ile branch leri listeleyebiliriz(başında * olan aktif branch tir).
  • $git status komutunu çalıştırdığımızda en üstte “on branch ‘aktif branch in adı’ “ ifadesinde de gösterilir.

Tam olarak bitmeyen veya test etmediğimiz değişiklikleri, commit etmek sağlıklı bir davranış değildir. Fakat bir değişiklik üzerinde çalışırken, başka bir kritik değişiklik sözkonusu oldu ve yaptığımız işlem yarım kaldı. Böyle bir durumda önceki değişiklikleri
$git stash
 komutu ile geçici olarak kaydederiz.

$git stash list
 komutu ile aktif branch ımızdaki, geçici olarak kaydettiğimiz değişiklikleri listelemeye yarar. En son kaydedilen en üstte yer alır.

Stash leri Geri Yükleme

İki yolu vardır;

1. $ git stash pop

komutu ile en üstteki stash geri yüklenir ve listeden silinir.

2. $ git stash apply

komutu ile istenen değişiklik geri yüklenir, fakat listeden silinmez

ör: $git stash apply stash@{1}
 listeden silmek için ise;

$ git stash drop stash@{1}

Değişikliklerin geri alınması;

$ git checkout -f

bu komut en son yapmış olduklarımızı iptal edecektir. $git checkout master sonraki yapılanları geri alıp, tekrar pull yapmamızı sağlar.

$ git checkout filename

sadece belli bir dosyadaki değişiklikleri geri almak istersek kullanırız.

BASİT BİR BRANCHİNG SENARYOSU

Bir web sitesi üzerinde çalışmaya başladınız. Bu siteye yeni özellikler eklemek için deneme adında branch oluşturdunuz. Branch üzerinde değişiklikler yapmaya başladınız.Bu sırada web sitenizde, login sayfanızda bir problem tespit edildi ve acil olarak ilgilenmeniz gerek;

  1. aktif olarak çalıştığın deneme branch indeki değişiklikleri stash le
$ git stash

2. master branch e geç

$ git checkout master

3. güvenlik açıgını gidermek için yeni bir branch oluştur

$ git branch loginsorunu

4. branch i aktif et

$ git checkout loginsorunu

5. sorunu giderdiniz ise,

$ git add .
$ git commit -am “login sorunu giderildi”

6. master branch i aktif hale getir

$ git checkout master

7. commit ettiğin branch i, master branch e merge et

$ git merge loginsorunu

8. oluşturduğun branch i sil

$ git branch -d loginsorunu

9. daha önce çalıştığın branch e geri dön

$ git checkout deneme

10. stash leri listele

$ git stash list

11. stash i yükle

$ git stash pop

12. devam et.

Not: remote repostory den branc silmek için, $git branch -dr branchname komutu kullanılır.

Commit edilmiş dosyalardaki farkları görmek için,

$ git log -p

komutunu kullanırız.

İki farklı branchi karşılaştırmak için( master ve deneme branchlerini )

$ git di master..deneme

iki farklı versiyonu karşılaştırmak için,

$ git di 74c6f..5p689e

ÇAKIŞMALARI GİDERMEK

Versiyon kontrollerinde, en baş ağrıtıcı durumlardan birisi de merge işlemi yaparken, çakışmalar ve bunların giderilmesi. Git merge işlemi sırasında, değişiklikleri otomatik entegre eder, fakat aynı satırda yapılan değişiklikler veya takımdaki bir kişinin bir satırı silmesinden dolayı, sizin bu değişikliği branch inize nasıl entegre edeceğinize karar vermenizi ister.

Öncelikle çakışmanın neden olduğunu tespit etmek gerekir.
$git status ile branch imize entegre edilmemiş dosyaları tespit ederiz. çakışma olan dosyada
 <<<<<<<<<HEAD ile başlayan ve ========== kadar devam eden dosyalanın bizim branch imizde olan olan versiyona ait, ====== işaretlemesinden sonraki kısımda değişiklikleri entegre etmek istediğimiz branch de yer alan dosyanın içeriğini gösterir.

Dosyada son değişiklikleri düzenledikten sonra,

$ git add dosya_adi
$ git commit -m “comment”

komutları ile çakışmayı gidermiş oluruz.

Rebase işlemi merge işlemine bir alternatiftir.

* İki branch in ortak commit i: iki branch in de tarihlerini daha yakından incelediğimizde, bu branch lerin zamanın bir noktasında ortak bir commit e sahip olduklarını görürüz. Bu andaki iki branch in de içeriği birebir aynıdır.

*Branch lerin son commitleri: her iki branch içinde yapılan son commitler;

1- bazı durumlarda branch lerden birtanesinde herhangi bir değişiklik yapılmamıştır ve bu branch in ortak commit i ve son commit i aynıdır. Bu durumda merge işlemi çok basitleşir ve git, diğer branch in tüm commitlerini ortak commit üzerine ekleyerek merge işlemini yapar. Bu özel duruma “fast-forward merge” denir ve iki branch in tarihçesi ortaktır.

2- Çoğu zaman her iki branch birbirinden bağımsız olarak değişiklikliğe uğrar ve tarihçe açısından birbirinden uzaklaşır. Bu durumda merge işlemi yapmak için git in her iki branch arasındaki değişiklikleri içeren otomatik bir commit oluşturması gerekir. Oluşturulan bu commit e “merge commit” denir. Merge commit in, normal commit ten farkı ise, otomatik oluşturulmalarıdır.

Rebase ile değişiklikleri entegre etmek

Bazı takımlar iki branch i otomatik merge commit yerine rabase ile entegre etmeyi tercih edebilirler. Rabase sırasında projemizin iki farklı projemiz olduğuna dair herhangi bir tarihsel iz oluşmaz. Örneğin: branch-B deki değişiklikleri, Branch-A ya entegre edeceğiz;
 $git rebase Branch-B
 bu komut ile git, öncelikle branch-A ve Branch-B deki ortak en son commit ini bulup, ortak commit sonrası branch-A da yapılan tüm commit leri geri alır, geçici olarak farklı bir yere saklar, daha sonra branch-B deki tüm commitleri Branch-A ya uygular. Son olarak branch-A nın geçici olarak farklı bir yerde saklanan commit leri, tekrardan uygulanır. Bu aşamadan sonra tüm değişiklikler sanki sadece branch-A üzerinde gerçekleşmiş gibi görünür.

not:

$ git pull dediğiniz zaman resimdeki gibi bir hata alıyorsanız (fatal: Not possible to fast-forward, aborting.)

izleyeceğiniz adımlar:

$ git pull --rebase
-> eger cakısma varsa duzelt ve $ git add .
$ git rebase --continue
$ git push

KAYNAKLAR:
Ali özgür, Türkçe git 101

sıtkı bağdat, ruby on rails

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.