/ solution

Git - Versiyon ve Sürüm Kontrol Sistemi

Bu yazımda neden Git kullanmamız gerektiğine dair açıklamalarımın yanında rehber niteliğinde kullanımına dair bilgiler vereceğim.

Git nedir?

Git kısaca; hem web tabanlı hem de web tabanlı olmayan projelerde kullanabileceğimiz ve kodlarımızı sanal bir ortamda versiyonlarak saklayabileceğimiz sistemlerden en yaygın olanıdır. Git'in yanı sıra SVN, CVS gibi çözümler de vardır ama bu yazının konusu değiller.

Neden kullanmalıyız?

Açıkçası Git'i neden kullanmalıyız değil de, neden versiyon kontrol kullanmamız gerektiği ile başlayalım.

  • Birden fazla kişinin aynı proje üzerinde çalışabilmesine olanak sağlar.
  • Üstelik bunu birbirlerinin değişikliklerini ezmeden yapabilmelerini sağlar.
  • Versiyonlama sağlar. Dolayısıyla eski kodlara ulaşabilmenize, değişikliklere göz atabilmenize olanak kılar.
  • Projemizi sanal ortamda tutmamız, donanımsal nedenlerden başımıza gelen veri kayıplarının önüne geçer.

Peki neden Git'i seçelim?

  • Çok hızlıdır.
  • Sadece değişiklikleri tuttuğu için az yer kaplar.
  • İnternetsiz (offline) kullanıma olanak sağlar.
  • Kolay kullanımı vardır ve değişikliklerin hızlıca birleştirilmesine olanak sağlar.

Kurulum

Kurulum için en kısa yol sitesinden yüklemektir. Windows, ubuntu ve mac osx için ayrı ayrı dosyaları mevcuttur. Kendinize uygun olanı seçip bilgisayarınıza kurabilirsiniz.

https://git-scm.com/

Sözlük

  1. Repository
    Projemizin dosyalarının bulunduğu veri yapısıdır. Verilerimiz burada tutulur.
  2. Clone
    Projemizin bir kopyasını remote repositoryden yerel diskimize almamız anlamına geliyor.
  3. Branch
    Projeler branchlardan oluşur. Üzerinde değişiklik yapılabilecek kopyaları/dalları diyebiliriz.
  4. Master
    Temel branchtır ve proje buradan dallanmaya başlar. Projenin en son(production) halini burada tutarız.
  5. Commit
    Bir branch üzerinde yapılan değişikliklerin bilgisinin tutulmasıdır.
  6. Push
    Bir commitin remote repositorye gönderilmesi anlamına gelir.
  7. Pull
    Bir branchtaki değişikliklerin kendi yerel ortamımıza çekilmesi demektir.
  8. Revert
    Yapılan bir değişikliğin (commit) geri alınması anlamına gelir.
  9. Merge
    Branchları birleştirmek demektir.

Başlıca Git Komutları

Git hem offline hem de online kullanılabilir demiştim. Bu yazıda online/remote kullanımına değineceğiz. Aşağıdaki tüm komutları kullanırken bir terminal kullanacağız.

Remote Repository Klonlanması

Diğelim ki github, gitlab, bitbucket gibi bir git sağlayıcısında hesabınız var ve orada oluşturduğunuz bir proje repositorysi ile çalışmak istiyorsunuz. Projeyi saklamak istediğiniz dizinde aşağıdaki komutu çalıştırmak yeterlidir.

git clone https://github.com/demiremrece/learninggit.git

Branch Oluşturmak

feature-branch
Projeyi çektiğinizde varsayılan olarak master branch üzerinde oluyorsunuz. Master branchında çalışmak yerine yeni bir branch oluşturup çalışmak ve daha sonra değişikliklerimizi mastera atmak genel kabul görmüş bir yöntemdir. Çünkü masterda her zaman projenin yayınlanmaya yakın halini tutarız. Proje üzerinde çalışırken bir branch açar orada çalışır ve işimiz bittiğinde yeni branchı mastera merge ederiz.

git checkout -b YENI_BRANCH_ISMI

Yukarıdaki komut bize localde bir branch oluşturur.

Bu branchtaki değişikliklerimizi yaptıktan sonra, aşağıdaki komut aracılığıyla branch remote repositoryde de oluşmuş olacaktır.

git push -u origin YENI_BRANCH_ISMI

Branch Üzerinde Değişiklikler

Git bize değişikliklerimizin tutulduğu bir katman (stage) sunar. Yaptığımız her değişikliği ya da diğer bir değişle remote repositorye göndermek istediğimiz her değişikliği öncelikle bu katmana ekleriz. Commit yaptığımızda bu katmandaki değişiklikleri paketleriz. En son da push ile bu değişiklikler remote repositorye gönderilir.

git status ile bilgi aldıktan sonra, diyelim ki aşağıdaki değişiklikler var.

  • index.html
  • index.js
  • server.js

git add index.html komutu sadece index.html dosyasındaki değişiklikleri stage içerisine koyar.

git add . komutu ise tüm değişiklikleri dahil eder.

Değişikliklerimizi stage içerisine attığımıza göre, artık bu değişiklikleri remote repositorye gönderebiliriz. Öncelikle;

git commit -m "Bu değişiklikler ile ilgili bilgi mesajı giriyoruz."

Bu commit repositorydeki şu an için bir kayıt oluşturur. Diğer bir değişle, bulunduğumuz branch içerisinde, projenin commitlediğimiz zamandaki halidir diyebiliriz. Dolayısıyla branchtaki izler olarak düşünebiliriz. Silinebilir, geri alınabilir izler. Bundan dolayı ben şahsi olarak projedeki her değişiklik için ayrı ayrı commit yapıyorum. Örneğin; "Email gönderme özelliği eklendi", "Mail template değiştirildi". Tüm değişiklikleri yapıp tek bir commit de göndermek de bir seçenek ama bu değişikliklerin yönetilebilirliğini azaltır. Mesela, template değişikliğini geri almak istediğimizde, eğer tüm değişiklikleri tek commit altında yapmışsak, email gönderebilme yetisini de geri almak zorunda kalırdık.

git push komutu ile bulunduğumuz branch içerisindeki tüm commitler remote repositorye gönderilir.

Commit ve push işlemleri git arayüzü kullanılarak da yapılabilir. git gui komutu aracılığıyla bir arayüz kullanarak dahil edeceğiniz değişiklikleri daha kolay biçimde seçebilirsiniz. Bu komut içerisinde bulunulan branch içerisindeki değişiklikleri görsel olarak sunar ve işlem yapmanıza izin verir.

Diğer Komutlar

git pull
Eğer local branch ile remote branch arasında fark varsa, remotedaki değişiklikleri locale çeker.

git checkout "BRANCH_ISMI"
Local branchlar arası geçiş yapmak için kullanılır.

git checkout .
Bulunulan branchtaki değişiklikleri silip, ilk haline dönderir.

git checkout -b "BRANCH_ISMI"
Localde yeni bir branch oluşturmaya yarar.

git stash save
Bulunulan local branch içerisindeki değişiklikleri hafızada saklar.

git stash apply
Hafızada bulunan değişiklikleri bulunulan brancha uygular.

git branch
Local branchları listeler.

git merge "BRANCH_ISMI"
Bulunulan brancha verilen isimdeki branchı merge eder.

git branch -d "BRANCH_ISMI"
Verilen isimdeki local branch silinir.

İleri Seviye

Bu bölümde biraz daha ayrıntıya gireceğiz.

Commitler Hakkında

Her bir commit kendine özgü bir dijital iz taşır. Bu izde, kime ait olduğu, eşsiz bir id ve işlem tarihi gibi bilgiler bulunur. Tüm commitlera ait izleri görebilmek için git log komutuna başvuruyoruz. Bu komut aşağıdaki gibi bir çıktı verecektir:

gitlog

Görüldüğü üzere commitlerin uzun bir id'si var. Ama ilk 5-6 harfi yazsanız da git kendisini tanıyor. Örneğin;

git show 50d570 komutu bize ilgili commit içerisindeki değişikliklerin listesini verecektir. Bunun yerine gitin bize sunduğu grafiksel arayüzü kullanırız. Çünkü değişiklikler ile orjinal halleri yanyana koyar ve görsel anlamda kolaylık sağlar. git difftool 50d570

Ah! Yanlış commit yaptım.

Yanlış bir commit mesajı girdiniz ya da eksik dosya mı commitlediniz? Çözümü var. git commit --amend komutu bir önceki commitdeki her şeyi stage içerisine tekrar koyar ve yeni bir commit yapıyormuşcasına davranabilirsiniz. Ama eğer commit çoktan push komutu ile repository içerisine gönderildiyse revert yapmaktan başka çaremiz yoktur. Bunun için git revert COMMIT_ID.

.Gitignore

Bir projede hiç bir zaman commit yapmak istemediğimiz dosya ve klasörler olacaktır. Gitignore, bu dosya ve klasörlerin listesinin tutulduğu bir text dosyasıdır. git add kullanarak yanlışlıkla eklediğimiz değişikliklerin remote repository içerisine gönderimini engelliyor. node-modules, çeşitli şifreler, log dosyaları ya da IDE'nin oluşturduğu dosyalar bunlara örnek gösterilebilir.

Aşağıda repository içerisinde bulunan örnek bir .gitignore dosyası görülmektedir.

build/
node_modules/
.idea/
publish/
*.log
ssh/

URL Değişirse

Projemizin konumu değişirse, örneğin; gitlab'dan github'a taşımışsak, projeyi tekrar klonlamadan sadece remote url'i değiştirerek çalışmaya devam edebiliriz.

Https kullanıyorsak,
git remote set-url origin https://github.com/KULLANICI_ADI/REPOSITORY.git

SSH kullanıyorsak,
git remote set-url origin git@github.com:KULLANICI_ADI/REPOSITORY.git

Bu konu hakkında temel olarak söyleyebileceklerim bu kadar.

Hayatınızdan kod eksik olmalısın :)