Ozgur's Blog

Random ramblings of personal nature

Temel Git Kullanımı


Giriş

Bu yazı Git kullanmak isteyen ama neden ve nasıl sorularına cevap arayan insanlara yönelik yazılmıştır. Bu yazı dahilinde değineceğimiz konular:

  • Git'in yüklenmesi
  • Temel Git Kullanımı
    • Projeye git'i dahil etmek
    • Add, Commit, Revert kullanımı
    • Branch kavramı

Bu yazının odağı temel git kullanımı olduğundan rebase gibi gelişmiş konulara girilmeyecektir.

Git nedir?

Git bir versiyon kontrol sistemidir ve muhtemelen duymuş olduğunuz Linux'un babası Linus Torvalds tarafından geliştirilmiştir. Versiyon kontrol sistemleri ile (ki aralarında subversion, team foundation server gibi seçenekler de vardır) yazılımcı kodu geliştirirken dönebileceği noktalar oluşturabilir, oyun terminolojisi ile söylersem koda save atabiliriz.

Versiyon kontrol sistemlerinin bir diğer avantajı da şu senaryoya bir çözüm getirebiliyor olmasıdır:

Yayına alınmış bir yazılım projesinin en az iki versiyonu olduğundan bahsedilebilir. Canlı yayındaki versiyonu ve müşterinin ihtiyaç ve isteklerine göre şekillendirilen geliştirme versiyonu. Versiyon kontrolü olmadan bu yapılar farklı klasörlerde tutulabilir ancak canlı yayına yapılan değişiklikler ve düzeltmeler (hotfix) aynı zamanda geliştirme versiyonuna da yapılması gerekir. Versiyon kontrolü ise bunları tek bir klasörde farklı dallarda (branch) tutarak ve geliştirme versiyonuna tamam denildiğinde iki versiyondaki geliştirmeleri de kaybetmeden birleştirebilen bir yapıya sahiptir (merge).

Git'in yüklenmesi

Windows

Git windows için ana sayfasındaki kurulum pakedinden standart biçimde next/next denilerek kurulabilir. Burada benim tavsiyem size metin editörü seçtirdiğinde vim yerine nano kullanmanızdır. Vim her ne kadar benim tercih ettiğim bir metin editörü olsa da windows altında kullanmak biraz sıkıntılı olabilir diye düşünüyorum.

Ekran Görüntüleri

Kurulum aşamasındaki adımlar aşağıdaki gibidir:

Lisans Aşaması:

01

Kurulum Yeri:

02

Git Parçaları:

03

Git Bash Here sağ tık ile komut satırına kolayca gelerek git kullanabilmemizi sağlar.

Start Menüsü Ayarı

04

Metin Editörü Ayarı

05

Burada varsayılan editör vim olarak gelse de, dediğim gibi nano kullanmayı daha fazla öneriyorum.

Path Ayarı

06

Bu ayar olmazsa komut satırından git dediğinizde hata alabilirsiniz. Birinci seçenek, git'i sadece kendi komut satırı işlemcisine (bash) koyarken, ikinci seçenek windows'un cmd komutu ile girdiğiniz komut istemcisinde kullanabilmenizi sağlar. Üçüncü seçenek ise git ve opsiyonel Unix araçlarını da buradan kullanabilmenizi sağlar.

HTTPS ayarı

07

Checkout ayarı

08

Metin dosyalarındaki satır sonu ve boşlukları dönüştürme ayarıdır. Eğer git'i bir ekip içinde kullanıyor ve ekip farklı işletim sistemleri kullanıyorsa ikinci seçenek kullanılması önerilir. Üçüncü seçenek ise git'e "sen karışma güzel kardeşim" der.

Komut İstemcisi Ayarı

09

Birinci seçenek MinTTY bize linux benzeri bir arabirim sunarken, ikinci seçenek windows'un varsayılan istemcisini kullanır.

Ekstra Ayarlar

10

Linux

Linux altında ise:

Debian türevleri (Ubuntu vb.)

sudo apt-get install git

Arch türevleri (Manjaro vb.)

sudo pacman -S git

komutları ile kurulabilir.

Git'in projeye dahil edilmesi

Git'i kurduktan sonra projemize dahil etmek tek komuda bakar:

git init

bu proje klasörü altında .git klasörü açacaktır. Proje dosyalarının arasındaki farkların tutulduğu metin dosyaları burada tutulur.

Add ve Commit Kullanımı

Bu noktadan sonra proje dosyalarımızı git üzerinde takip etmek için:

git add .

demeliyiz. Bu git'e "proje içindeki herşeyi (.) takip et" emrini verir. Bu her ne kadar günümüzde . ile kullanılsa da bunun yerine muhtelif dosya adları vererek çeşitli dosyaları takip ettirip geri kalanını "görmezden gel" diyebilmemiz mümkündür.

Şu anda projemizin durumu git'e kaydedilmeye hazırdır. Kayıt işlemi ise:

git commit -ma "Açıklama mesajı"

ile yapılır. Genelde kanonik olarak ilk kayıt (commit) işleminde mesaj olarak Initial Commit (İlk kayıt) kullanılır:

git commit -ma "Initial Commit"

Bu komudu yazıp enter'a bastığımızda projemizin bu hali git'e kaydedilmiş olur.

Bu aşamadan sonra yaptığımız değişiklikler bu noktanın üzerine değişiklik olarak görünecektir. Mesela bir dosya değiştirip kaydettikten sonra

git status

dediğimizde o dosyanın yeşil olarak göründüğünü göreceğiz. Bu git'in bu dosyada bir değişiklik olduğunu farkettiği anlamına gelir. Dahası

git diff

dediğimizde bu dosyaların içinde ne değişiklik olduğunu da bize gösterecektir. Yeşiller eklenen satırlar, kırmızılar ise silinenlerdir.

Yeni bir dosya ekleyip yine git status dediğimizde ise bu yeni dosyanın kırmızı olarak listelendiğini görürüz. Bu da "ben bu dosyayı takip etmiyorum" demektir. Eğer bu dosyanın takip edilmesi gerekiyorsa

git add .

dememiz gereklidir. Detaya gireceksek nokta yerine o dosyanın lokasyonunu da verebiliriz ama . daha hızlıdır.

Aslına baktığımızda projemizi "saklamak" için şu komutlar genelde ardarda çalıştırılır:

git status
git diff 
git add . 
git commit -ma "Değişiklikleri tasvir eden mesaj"

Revert kullanımı

Git'in en büyük avantajlarından birisinin istenildiğinde kayıt noktalarına geri dönülmesi olduğundan bahsetmiştim. Bu kayıt noktalarını:

git log

ile görmek mümkündür. Bu logları listelerken commit <hash> şeklinde başlayan ifadelerden hash kısmı önemlidir. Bu değeri geri dönerken kullanacağız.

Ancak diyelim ki belli bir committeki durumu merak ettik ama şu anı da kaybetmek istemiyoruz. Bu senaryoda şöyle gideriz:

git checkout <istenilen hash>

bu komudu girdiğimizde git bize yaptığımızın geçici bir değişiklik olduğunu söyleyen bir uyarı verecektir. Orjinal noktaya dönmek için

git checkout master

dememiz yeterlidir. Ama diyelim ki gerçekten bir noktaya dönmek istiyor ve elimizdekileri de kaybetmek istiyoruz. Bu durumda

git reset --hard <hash değeri>

dememiz gereklidir. Bu, hash değerini girdiğimiz noktaya bizi döndürecek ve sonrakileri silecektir.

Branching

Git üzerinde branch açmak çok kolaydır. Kodun o andaki halinden bir kopya çıkartmak için gereken komut:

git branch <branch-adi>

şeklindedir. Mesela ben gelistirme133 diye bir branch açacağım ve geliştirmelerimi orada yapacağım diyelim:

git branch gelistirme133

der ve

git checkout gelistirme133

diyerek o dalı aktive ederim. Git üzerinde genelde projenin canlı/son halini ifade eden dal (branch) master adını taşır. Bu dala dönmek için de:

git checkout master

dememiz yeterlidir. Ama şimdi yine gelistirme133'e dönelim. Bu dal altında yaptığım commitler bu dala özgüdür ve merge demediğim sürece master'la karışmazlar. Bu sayede master üzerinde ayrı bir değişiklik, gelistirme133 üzerinde ayrı bir değişiklik yapabilirim - yani müşterinin canlı kod üstünde istediği değişiklikler benim gelistirme133 üzerinde yaptığım değişiklikleri etkilemez.

Bu konuda bir videoyu da ilerleyen günlerde paylaşmayı düşünüyorum.

İyi günler!