Merhaba arkadaşlar bu yazımda sizlere bir versiyon kontrol sistemi olan git'ten bahsedeceğim.

Versiyon Kontrol Sistemi nedir diyenler için biraz açıklayalım. Örneğin elimizde bir web sitemiz var ve üzerinde bir takım değişiklikler yapmamız gerekiyor. Git veya benzer işleri yapan sistemlerin faydalarından bahsetmek için herhangi bir versiyon kontrol sistemi olmadığında neyin nasıl olduğundan bahsedeyim. Bu durumda en yaygın olarak yapılan, FTP'yi tek başına kullanmak oluyor. Eğer yalnızca FTP kullanıyor olsaydık dosyayı bilgisayarımıza indirip değiştirip sunucumuza tekrar yüklerdik. Ama belki de çoktan yaşadığınız gibi değişiklik gerektiren dosya sayısı arttıkça bu iş biraz zorlaşıyor. Bir de yapmamız gereken değişiklik uzun sürüyorsa değiştirdiğimiz dosyaların hepsini hatırlamamız gerekiyor. "Hatırlamaya ne gerek var? Bütün dosyaları tekrar yükleyebilirim." diyebilirsiniz. Eğer projede çalışan arkadaşınız yoksa bu da mümkün tabii ki. Arkadaşınızla bütün gün aynı projede uğraştığınızı düşünelim. İkiniz de birden fazla dosyada değişiklik yaptınız, hatta belki aynı dosyalarda uğraştınız. İkinizin birbirinden ayrı olan ve birbiriyle iç içe geçen çalışmalarını bir araya getirmek için yardımcı olacak bir araç olsa ne güzel olurdu. Bütün bunları bir kenara bırakalım. Belki de yalnızca dün yaptığınız yenilikler bugün hoşunuza gitmedi. Eski haline nasil dönebiliriz? Her değişiklikten sonra projeninin bir kopyasını almak mantıklı(!) duruyor. Bütün bu sıkıntılara ve daha fazlasına çözüm getirmek için bir versiyon kontrol sistemi kullanmak en akıllıcası olacaktır. Versiyon kontrol sistemi size bir depo(repository) sağlar ve burada projenin dosyalarındaki değişiklikler geçmişiyle birlikte tutulur.

Son zamanlara kadar versiyon kontrol sistemleri, projenin merkezi bir depoda tutulduğu ve bu projeden olan insanların değişikliklerini bu merkeze işlediği bir düzen ile çalışıyorlardı. Git ise dağıtılmış bir depolar düzeni ile çalışıyor. Bu da demek oluyor ki projenin olduğu her yerde bir depo var ve hiçbiri diğerinden farklı değil. Örneğimizden devam edersek web sitenizin bulunduğu sunucuda da, sizde de, projenin üzerinde çalışan diğer arkadaşınızda da aynı deponun bir kopyası bulunuyor. Bu sistem çalışma düzeninize biraz daha esneklik katmanızı sağlıyor. Ayrıca herkes deponun bir kopyasını tuttuğu için otomatik olarak birden çok yedeğiniz olmuş oluyor.

Şimdi git'in komut satırı üzerinden nasıl kullanabileceğimizi öğreneceğiz. http://www.git-scm.com/downloads adresinden yüklememizi yapıp komut satırı üzerinden git'in çalıştığından emin olduktan sonra devam edebiliriz.

Öncelikle genel olarak git'i yapılandıralım. Git, yapılan değişikliklerin yanında değişikliği yapanı da depomuza kaydeder. O zaman kendimizi tanıtarak başlayalım.

$ git config --global user.name "İbrahim Sağıroğlu"
    $ git config --global user.email "ibrahim@ornek.com"

"--global" sayesinde ilgili bilgisayarda şu an olan ve gelecekte oluşturulacak depolarda bu yapılandırmanın kullanılmasını sağlamış oluyoruz.

Komut satırı renklerle daha okunabilir olacaktır. Git'in renklerini açalım.

$ git config --global color.ui true

Artık bir depo oluşturabiliriz. Herhangi bir klasörde git deposu oluşturmak için "git init" komutunu yazmamız yeterli. Basit olması için boş bir klasörde başlayalım.

$ git init

Bu komut bulunduğunuz klasörde ".git" isimli bir klasör oluşturacaktır. Bu klasörle doğrudan işlem yapmanız gerekmiyor; ama kurcalamak isterseniz içerisinde projenizin geçmişi, bu depoya özel yapılandırmalarınız, etiketleriniz ve benzeri veri tutuluyor.

Projemize bir şeyler ekleyelim. Ben örnek olarak "index.html" isimli bir dosya oluşturuyorum. Depomuza işlemeden önce yaptığımız değişikliklerin listesini görmek için aşağıdaki komutu kullanabiliriz.

$ git status

Yukarıdaki komutu çalıştırdığımızda bir dosya yeni oluştrulmuşsa "takip edilmeyen" (untracked), daha önceden depoya işlenmiş bir dosya değiştirilmiş ise "değiştirilmiş" (modified) gibi durumlar gösterilecektir.

Evet, artık bu dosyayı depomuza kaydetmek istiyoruz. Kendi bilgisayarımızda çalışırken değişiklikler depoya işlenmeden önce bir sahne alanından(staging area) geçer; yani projemize yaptığımız değişiklikleri önce bu alana yerleştiririz, sonrasında bu alandan depoya işleriz.

Sahne alanına eklemek için "git add" komutunu kullanıyoruz.

$ git add index.html

Yazdıktan sonra tekrar "git status" komutuyla şu andaki durumumuza bakabiliriz. Başka dosyalar da eklemek istiyorsak tercih ettiğimiz editörümüz ile yeni dosyalar oluşturup tekrar "git add" komutu ile sahne alanımıza ekleyebiliriz. Örneğimiz için şimdilik bu kadar yeter diyip ilk depoya işleyişimizi tamamlamak için:

$ git commit -m "index.html eklendi"

komutunu yazıyoruz. "-m" seçeneği sayesinde bu işlemede yaptığımız değişikliklerle ilgili ufak bir açıklama ekleyebiliyoruz. Böylece sonradan işleme geçmişine baktığımızda neler olup bittiğini anlamamız hayli kolaylaşıyor. Bu komut ayrıca bize eklenen, çıkarılan veya değiştirilen dosyaları tekrar özetliyor.

Diyelim ki birkaç işleme yaptık ve bu süre boyunca neler yapageldiğimize bakmak istiyoruz.

$ git log

Yukarıdaki komutu çalıştırdığımızda geçmişte yapılan işlemler bu işlemleri yapanlarla birlikte yapılma sırasına göre gösterilecektir.

Şimdiye kadar hep kendi bilgisayarımızda çalıştık. Diğer bilgisayarlarla çalışmak için diğer bilgisayara -veya daha doğrusu uzaktaki bir bilgisayardaki depoya- ait linki git'in "uzak bilgisayarlar" (remote) listesine eklememiz gerekiyor.

$ git remote add merkez git@github.com:kullaniciadi/repo_adi.git

Bu komutu çalıştırdığımızda git, git@github.com:kullaniciadi/repo_adi.git adresini şu an kullandığımız bilgisayardaki depoya "merkez" isminde kaydediyor. Bilgisayarımızdaki depoda yaptığımız değişikliklerimizi daha sonra bu depoya göndermek için ise aşağıdaki komutu kullanıyoruz.

$ git push -u merkez master

Burada göndermek istediğimiz uzak bilgisayarın adını (merkez) ve depomuzun hangi dalını göndermek istediğimizi belirtiyoruz. "-u" ise, özellikle başka bir depo adresi vermediğimiz sürece, bundan sonra göndermek istediğimiz değişiklikler için "merkez" isimli uzaktaki depomuzu kullanacağımızı git'e söylememizi sağlıyor. Yani daha sonra bu depoya bir değişiklik göndermek istediğimizde "git push" yazmamız yeterli.

Diyelim ki biraz zaman geçti. Başka insanları bu proje üzerinde çalışmak üzere davet ettik. Onlara uzaktaki depomuzun linkini verdik, onlar da kendi değişikliklerini yaptılar ve o depoya gönderdiler. Uzaktaki depomuza yapılan bu değişiklikleri almak için ise "git pull" komutumuz var.

$ git pull merkez master

Bu komutla birlikte depomuza gönderilen değişiklikler bilgisayarımıza indiriliyor ve bilgisayarımızdaki depomuz ile uzaktaki depomuz aynı hale geliyor.

Bütün bu öğrendiklerimiz kullanıldıkça daha iyi anlaşılabilir. Şimdi de "git diff" komutuna bir göz atalım. Depomuzda yaptığımız değişikleri ayrıntılı olarak görmek için bu komutu kullanabiliriz.

$ git diff HEAD

Yukarıdaki komutla birlikte depomuza en son işleme yapıldıktan sonra yapılan değişiklikleri satır satır görebiliriz. Burada "HEAD", en son yapılan işlemeye (commit) karşılık gelen bi göstergedir; yani bu komut en son işleme ile şu an arasında ne fark var sorusunun cevabını bulmamıza yardımcı olur. Sahne alanımızı hatırlıyorsunuz; işlemeye hazır olduğunu belirttiğimiz dosyalar burada tutuluyordu. Buradaki değişikliklere bakmak istersek "git diff" komutuna "--staged" seçeneğini eklememiz yeterli olacaktır.

Bu yazımızda öğrendiklerimiz git'i basit özellikleriyle kullanmaya başlamanız için yeterli olacaktır. Bir sonraki yazımızda dallanmalardan, çakışmalardan, etiketlerden ve daha birçok özelliğinden bahsederek git'i daha yakından tanımaya çalışacağız. Yazımızı beklemeden kendiniz öğrenmek isterseniz aşağıdaki kaynaklar arasında verilen git'in anasayfasından pek çok kaynağa ulaşabilirsiniz. Kolay gelsin!