Git Versiyon Kontrol Sistemi

Yusuf Çakal
Kodcular
Published in
5 min readApr 23, 2018

--

Düşünün bir yazılım takımınız var ve bir projeye başladınız. Projeyi modüllere ayırdınız ve her kişiye ilgili görevi atandı. Takım halinde çalışabilmeniz için bir yönetim aracı gerekli ve bir kitabın baskıları gibi bir baskı da hata çıktığı zaman hemen versiyonu değiştirip eski haline getirmeniz lazım. Burada imdadınıza (birçok iş ilanında da gördüğünüz üzere) git koşuyor. En büyük avantajlarından birisi ise merkezi yapıda bulunmamasıdır. (Dağıtık Sistem)

Git’in Versiyonlama Mantığı

Az önce dağıtık yapıda bulunur dedik. Ne demek bu şimdi ?

Git ile versiyonladığınız proje dosyaları her geliştirici de saklanır. Ve proje de bir değişiklik yapıldığı zaman sadece değişen kısım değil o an projeden bir snapshot alınır (projeyi bir bütün halinde saklar) ve böylelikle yapılan katkı bir bütün halinde kolaylıkla görülmüş olur.

Bu kısımda sizlere Tarik Guney hocamın git arkaplanını çok güzel anlattığı videoyu izlemenizi tavsiye ederim.

Versiyonlama Yapısı

Bu kısım işin felsefesini anlamak için gerekli en önemli kısımdır. ⚠️

Aşağıda yer alan 3 durumu ve aralarındaki farkı iyi anlamak gerekiyor. Hadi başlayalım.

Working Directory : Proje üzerinde çalıştığınız kısım yapmış olduğunuz değişiklikler sadece sizin bilgisayarınızda geçerlidir ve yaplılacak olan commit için herhangi bir bildiri söz konusu değildir.

2. Staging Area : Yapmış olduğunuz değişiklikleri git reposuna göndermek için hazırlamış olduğunuz kısım. Yani local de yapmış olduğumuz değişiklikleri bu kısıma ekleyerek commit’e hazır hale getiriyoruz.

3. Git Repository : Yapılan değişiklikler artık kaydedilmiş ve istenildiği zaman eski değişikliklere geri dönmenin önü açılmıştır. Bu kısımda proje de bir hata olduğunu farkederseniz geri eski versiyonlara (commit id ile) kolaylıkla dönebilirsiniz.

Umarım bu kısım anlaşılmıştır. Yukarıda commit den bahsettik merak etmeyin teknik kısımlara hemen geçiyoruz. 😄

Hayat Kurtaran Komutlar

Bu kısımda temel anlamda bazı teknik kısımları öğreneceğiz. Bu komutları öğrenirken daha iyi anlaşılması için bir örnek üzerinden gideceğiz. Bir text dosyasında bazı değişiklikler yapacağız ve init, status, add, commit, remote, branch, merge, conflict, remote, push, pull, log gibi anahtar kelimelerin ne işe yaradığını göreceğiz.

Hadi Başlayalım.

init: init komutu projeyi git ile versiyonlamanın ilk aşamasıdır. Bu kısımdan itibaren git projeye entegre edilir.

git bash konsola yukarıda ki gibi init komutunu yazdığımız zaman hemen alt satırında git’in projeye entegre edildiğini göstermektedir.

Bu arada hatırlatmak isterim her komuttan önce mutlaka git anahtar kelimesi yazmalıyız. (git init, git add vs.)

Şuan da dosyalarımız çalışma dizinimizde bulunmaktadır hiçbir şekilde geçiş bölgesine (staging area) veya git reposuna (git repository) göndermedik.

status: status komutu projede hangi dosyaların ne durumda bulunduğunu göstermektedir. Örneğin şuan da projemiz çalışma dizininde bulunduğu için git status dediğimiz zaman metin.txt dosyasını geçiş bölgesine göndermemizi önerecektir.

Gördüğünüz üzere herhangi bir commit bulunmadığını (commit’i birazdan öğreneceğiz) ve geçiş bölgesine aktarılmamış dosya olduğunu söylüyor. (metin.txt)

add: Çalışma dizinindeki dosyayı geçiş bölgesine aktarmak için kullanılır. sonunda bir dosya parametresi alır. (git add .) . parametresi bütün dosyaları geçiş bölgesine aktar anlamına gelmektedir.

Şuan da dosya git reposuna gönderilmeye hazır.

commit: commit ettiğiniz her değişiklik size bir geri dönüş fırsatı tanır. Yaptığınız önemli değişiklikleri commit ederek istediğiniz zaman eski commitlerinize geri dönebilirsiniz ve ek olarak add komuut ile geçiş bölgesine (staging area) aldığımız dosyaları commit komuut ile git reposuna (git repository) göndermiş bulunuyoruz.

dediğimiz zaman göreceğiniz üzere bir dosyanın bu commit’ten etkilendiğini ve bununla beraber bize bir commit id verdi bu id ile ilgili commit’e dönebiliyoruz.

Peki eski commitlere nasıl dönebiliriz. ?

Örnek olması açısından metin.txt dosyasından birşeyler silelim ve kaydedelim. Sonrasında eskiye nasıl döneceğimizi görelim.

Dosyamızın içinden “Versiyon Kontrol Sistemi” yazısını silip gördüğünüz üzere sadece “Merhaba Git” yazısını bırakıp kaydettik.

Eski haline (commite) geri dönebilmek için checkout komutunu kullanacağız ve parametre olarak commitin belirleyici olan ilk 8 hanesini yazmamız yeterli olacaktır.

sonunda bulunan . parametresi tüm dosyalarda anlamı veriyor. Ve metin.txt dosyasını açtığımızda zaman eski halini aldığını görebiliriz.

İyi hoşta commit id yi nerden biliyoruz ?

Projede bulunan commite bağlı isim, id, commiti atan kişi, mail adresi, commit atılan tarihi ve commit mesajlarını görebilmek için log komutunu kullanıyoruz.

Buraya kadar kendi bilgisayarımızda (local) bütün işlemleri yaptık uzak bir repoya değişiklikleri aktarmadık. Fakat genelde bir ekiple çalıştığınız ve uzak bir sunucu kullanıldığınızı varsayarsak (Github, Gitlab, Bitbucket) işler bu kısımda biraz farklılık kazanıyor.

Şimdi dosyalarımızı uzak sunucuya aktaralım ve böylelikle branch, push, pull, merge, conflict gibi konuları daha rahat işlemiz oluruz.

remote: Dosyalarımızı uzak sunucu ile eşleştirmek için remote komutunu kullanıyoruz. Ben örnek olması açısından gitlab de bir repo açtım. (Siz Github veya Bitbucket gibi sistemler de kullanabilirsiniz tek değişen kısım link parametresi olacaktır.)

komutu ile uzak repoya eşleştirme yaptığımızı söylüyoruz sonundaki değer link parametresi (gitlab adresi) ve herhangi bir hata ile karşılaşmazsak işlemin doğru bir şekilde çalıştığını anlıyoruz.

push: remote ile uzak sunucuya eşleştirdiğimiz dosyaları push komutu ile repoya aktararak ve böylelikle ekip halinle çalışmamızın bir gerekçesi olan ortak alana yaptığımız tüm değişiklikleri kaydetmiş oluyoruz.

sonunda bulunan master parametresi master branch’ini push ettiğimizi ifade ediyor. (branch kavramını ilerleyen kısımlarda öğreneceğiz.)

Görüldüğü üzere tüm değişiklikler uzak repoya aktarılmış durumda.

Yazının bütünlüğü ve çok da uzamaması için burada kesiyorum. Diğer bir yazıda branch, pull, conflict, merge gibi kavramlar ile devam edeceğiz.

Umarım faydalı bir yazı olmuştur.

Hoşçakalın ..

Kaynaklar: Git

--

--