Git Nedir? Git Komutları Nasıl Kullanılır?

Şevval Özdamar
7 min readOct 2, 2022

--

En çok kafa karıştıran soru ile hızlı bir başlangıç yapalım: Git ile Github arasındaki fark nedir?

Git, versiyon kontrol sistemidir. Projemiz üzerindeki değişiklikleri kontrol altında tutabilmemizi ve özellikle ortak yürütülen projelerde eşzamanlı çalışabilmemizi sağlar. Git Bash, Git’i proje klasörümüze dahil edebildiğimiz ve Git komutlarını çalıştırabildiğimiz komut ekranıdır. Git’i buradan indirerek siz de Git komutlarını kullanmayı deneyebilirsiniz.

Github ise, Git versiyon kontrollerini içeren bulut tabanlı proje yönetim platformudur. Github’da, Git versiyon kontrolüne sahip projelerinizi kendinize ait hesaptan repository(depo) şeklinde public(herkese açık) ya da private(sadece size özel) olarak paylaşabilirsiniz. Github, tamamen açık kaynak kodludur yani kullanıcıları tarafından geliştirilmeye açıktır. Github bir sonraki yazımın konusu olacağı için daha fazla uzatmayacağım.

Git ile devam edelim. Git Bash komut ekranında çalıştırabileceğiniz Git komutlarını ve ne işe yaradıklarını aktaracağım:

pwd -> Hangi klasörün içinde olduğumuzu gösterir.

Örneğin burada, C diskinin altında bulunan Users klasörünün altındaki Lenovo klasörünün içinde olduğumuzu bize gösteriyor.

cd klasör-adı -> Change directory anlamına gelir. Bulunduğumuz dizinden farklı bir dizine geçiş yapmamızı sağlar.

Burada, Desktop’a geçiş yaptık. Şuan hangi dizinde olduğumuzu sarı renkli yazıdan görebiliyoruz.

ls -> Bulunduğumuz dizin içinde hangi dosyalar var onu gösterir.

cd .. -> Bulunduğumuz klasör dizininden bir geriye çıkar.

mkdir klasör-adı -> Bulunduğumuz dizin içine, klasör oluşturmamızı sağlar.

Burada, bulunduğumuz dizin olan Desktop’a yani masaüstüne “Fotograflarim” adında bir klasör oluşturduk.

touch dosya-adı.uzantısı -> Bulunduğumuz dizin içine, dosya oluşturmamızı sağlar.

Burada, az önce oluşturduğumuz “Fotograflarim” klasörünün içine “foto.txt” adında bir dosya oluşturduk.

rm dosya-adı.uzantısı -> Remove anlamına gelir. Bulunduğumuz dizin içinde, istediğimiz dosyayı silmemizi sağlar.

Burada, Desktop/Fotograflarim dizini içindeki foto.txt dosyasını sildik.

rm -rf klasör-adı -> Bulunduğumuz dizin içinde, silmek istediğimiz klasörü silmemizi sağlar.

Burada, Desktop üzerinde bulunan Fotograflarim klasörünü sildik.

git — version -> Bilgisayarınızdaki Git’in hangi versiyonunun kurulu olduğunu gösterir.

Ortak bir projede Git versiyon kontrol sistemi ile çalışırken herkesin bir adı ve email’i olmalıdır ki Commit atıldığında o Commit’in kime ait olduğu anlaşılsın (Commit nedir yazının ilerleyen kısımlarında bahsedeceğim. Şimdilik, projenin tamamlanmış bir parçası olduğunu düşünebiliriz). Bu yüzden Global’de kendimize bir ad ve email vermeliyiz.

git config — global user.name “isminiz” ->

git config — global user.name -> Koyduğunuz adı gösterir.

git config — global user.email “emailiniz” ->

git config — global user.email -> Koyduğunuz emaili gösterir.

git status -> Bulunduğumuz klasörün Git’e bağlı olup olmadığını gösterir. Bağlı ise, bağlı olduğu klasördeki hangi dosyalarda hangi değişiklikler yapılmış onu gösterir. Durum kontrol komutu diyebiliriz.

Burada, “Fotolar” adındaki klasörümün Git’e bağlı olmadığını gösteren bir uyarı adım. Bu, proje klasörünüze Git’in henüz dahil edilmediğini gösterir.

Hemen proje klasörümüze Git’i nasıl ekleyeceğiz bakalım:

git init -> Bulunduğumuz klasöre Git versiyon kontrol sistemi dahil eder.

Git’i proje klasörünüze bağlamak işte bu kadar kolay.

Şimdi tekrar “git status” komutunu çalıştıralım:

Burada, bize yine bir uyarı verdi: Git, proje klasörüne bağlı AMA sen bu klasör içinde oluşturduğun (veya değişiklik yaptığınız bir dosya da olabilir) foto.txt dosyasını (kırmızı ile yazılmış) “git add” komutu ile Staging Area’ya atmadın. Yani dosyaların hala Working Directory’de.

Neyden bahsediyorum?

Git, bizim klasör içinde yaptığımız değişiklikleri (dosya oluşturma, dosya silme, dosya içeriğini değiştirme) otomatik olarak algılamaz. Bu yüzden “git add” komutunu kullanarak bu değişiklikleri ona bildirmemiz gerekir. “git add” komutunu çalıştırdığımız zaman yapılan onca değişiklik, yeni bir versiyon olarak kayda geçmeden önce (Repository kısmına aktarılmadan önce), Staging Area denilen yere atılır ve orada tutulur.

git add dosya-adı.uzantısı -> Yazılan dosya adı ve uzantısına sahip dosyayı Staging Area’ya atar.

Başka bir seçenek:

git add . -> Birden fazla dosyada değişiklik varsa hepsinin adını ve uzantısını yazmak yerine “.” koyarak hepsini kolay yoldan Staging Area’ya atar.

“git add” yaptıktan sonra “git status” komutunu çalıştıralım:

Burada, foto.txt dosyasının sorunsuz bir şekilde Staging Area’ya eklendiğini görmüş olduk.

Sırada, versiyonu doğrulamak için dosyaları ve dosya üzerindeki değişiklikleri Staging Area’dan Repository’e geçirme aşaması var. Bunu da “git commit” komutu ile yapıyoruz:

git commit -m “mesajınız” -> “git add” yapılmış dosyaları Repository’e atar, böylece Staging Area boşalır. Yazılan mesaj, atılacak commit’i ifade eder.

Örneğin, çalışmayan bir buton üzerindeki hatayı çözdünüz ve artık bu konudaki her şey sorunsuz çalışıyor. Commit atmaya hazırsınız. Buradaki mesaj kısmına “buton üzerindeki hata düzeltildi” gibi yapılan işi açıklayıcı bir mesaj atmalısınız ki, projede çalışan diğer ekip arkadaşlarınız veya her kimse hangi commit’te hangi iş yapılmış görebilsin.

git log -> Atılan tüm commit’leri ve commit’lerin detaylarını gösterir.

Commit id’sinin yanında yazan “HEAD -> master” ne anlama geliyor buna ilerleyen kısımlarda bakacağız.

Branch Nedir?

Git’i projemize dahil ettiğimiz an, Git tarafından master adında bir branch (dal) oluşturulur ve proje klasörü içinde olan her şey otomatik olarak master branch’ine atanır. Peki ama biz, projemiz üzerinde yeni özellikler denerken projemiz içindeki asıl dosyaları bozmak istemiyorsak ne yapabiliriz?

Branch böyle durumlarda bize yardımcı olur. Hemen projemize başka bir branch açarız, o branch üzerinde proje için yeni geliştirmeler yaparız ve eğer beğenirsek de ana branch (master branch) ile birleştirebiliriz. Şimdi bunları nasıl yapacağımıza bir bakalım:

git branch branch-adı -> Yeni bir branch oluşturmamızı sağlar.

Burada, projemize navigasyon eklemek için çalışacağımız “navigasyon-ekleme” adında yan dal(branch) oluşturduk.

git branch -> Projenin sahip olduğu tüm branch’leri gösterir.

Burada, projemizde “master” ve “navigasyon-ekleme” olmak üzere 2 tane branch’imiz var. Yeşil renk ile gösterilen branch ise, bizim şuan içinde bulunduğumuz branch’i gösteriyor.

git switch branch-adı -> Bulunduğumuz branch’ten başka bir branch’e geçişimizi sağlar. Komutta, geçmek istediğimiz branch’in adını yazarız.

Burada, “navigasyon-ekleme” branch’ine geçiş yaptık ve sonrasında “git branch” komutunu tekrar çalıştırdığımızda bulunduğumuz branch’in yeşil renkte olduğunu gördük.

git merge branch-adı -> Adı yazılan branch ile istediğimiz herhangi bir branch’i birleştirmemizi sağlar.

Merge ederken dikkat edilmesi gereken durum: Üzerine birleştirme yapmak istediğimiz branch’in içinde olduğumuza emin olmalıyız.

Burada, navigasyon ekleme işlemi başarılı sonuç verdiği için bu özelliğin geliştirildiği “navigasyon-ekleme” branch’ini master branch ile birleştirdik.

Fast Forward tanımı nedir?

Master branch’inde hiçbir değişiklik yapmadan, başka bir branch ile master branch’i merge etmeye fast forward denir.

Şimdi commit’lerde geriye dönme ve commit silme gibi işlemlere bakalım!

git restore dosya-adı -> Dosya üzerinde yapılan değişiklikler commit edilmeden bu komut çalıştırılırsa dosya, en son commit edilen haline döner. En son yapılan değişiklikler kayda alınmaz.

Burada, foto.txt dosyası üzerinde bir değişiklik yapıp kaydettim ve sonra “git status” komutunu çalıştırdım. Gördüğünüz gibi, o dosya üzerindeki değişikliği saptadı ve git add yapmamı söyleyen bir uyarı verdi. Sonrasında hemen “git restore foto.txt” komutu çalıştırıp tekrar git status yaptığımda ise son yaptığım değişikleri silip attığı için, dosya üzerinde bir değişiklik olmadığını söyledi.

git checkout commit-id -> Projeyi, ID’si yazılan commit’e geri döndürür ve projenin o haline bir bakış atmamızı sağlar.

Burada, ilk attığım commit’imin id’sini yazarak projenin o haline bir göz gezdirmek istedim. En alt kısımda HEAD’in hangi commit’e geçiş yaptığını ve o commit’in mesajını gösteriyor.

Bana verdiği uyarıda ise “detached HEAD” kısmı önemli. Bu ne demek bakalım:

Fotoğrafta B commitine checkout yapmadan önceki durum gösterilmiş. HEAD, son commit olan C commitini göstermekte. Fakat eğer biz “git checkout id-B” komutunu çalıştırırsak HEAD, main’den kopacak ve B commitini işaret etmeye başlayacak. Main ise hala C commiti’ni yani son commit’i gösteriyor olacak.

Özetlemek gerekirse: Eğer checkout komutunu kullandıysak HEAD artık main’i göstermez yani ondan kopmuştur.

Peki tamam projede maziye döndük, bir göz attık, baktık, harika ama nasıl tekrar projemizi en sonki haline geri getireceğiz?

Çözümü basit: “git switch master” komutu ile checkout’dan çıkış yapabilir ve kopmuş HEAD’i tekrar master ile buluşturabiliriz. Böylece HEAD, tekrardan son commit’i işaret edecektir ve proje de en sonki haline geri gelecektir.

git reset commit-id -> ID’si yazılan commit’ten sonra atılan tüm commit’leri (ID’si yazılan commit hariç), log ekranında gizler. O commit’ler projeden silinmez, sadece log ekranında gizlenir.

“git log” komutu çalıştırarak tüm commit’lerimizi görüntüledik.
“navigasyon eklendi” mesajına sahip olan commit’in id’sini vererek “git reset” komutu çalıştırdık. Sonrasında tekrar log ekranına baktığımızda id’si verilen commit’ten sonraki tüm commitlerin (sadece en üstteki commit olmuş oldu) log ekranında gizlendiğini gördük.

Peki hem log ekranından hem de projeden silmek istiyorsak?

git reset— hard commit-id -> ID’si yazılan commit’ten sonra atılan tüm commit’leri ve o commit’lerde yapılmış değişikleri (ID’si yazılan commit hariç) projeden siler. Aynı zamanda o commit’ler, log ekranında da artık gözükmezler. Bu komutu çalıştırdıktan sonra silinen değişikliklerin ve commit’lerin geri dönüşü olmaz. Bu komut dikkatli bir şekilde kullanmalıdır.

Burada, komutu çalıştırdıktan sonraki uyarıda HEAD’in artık komutta yazılan id’li commit’i işaret ettiğini söyledi. Çünkü o id’li commit’ten sonra atılmış tüm commit’ler projeden silindi ve o commit, son atılmış commit gibi kayıtlandı.

git revert commit-id -> ID’si yazılan committe yapılan değişiklikleri siler ama commiti silmez, log ekranında o commiti gözleyebiliriz.

Burada, ilk attığım commit’in id’sini vererek komutu çalıştırdım ve o commit’teki değişiklikler revert edilmiş oldu. Bu işlemi yaparken bizden zorunlu olarak bir commit atmamızı isteyecektir ve bunun için karşımıza bir ekran çıkaracaktır.

Commit’i attıktan sonra log ekranına bakalım:

Zorunlu atılan commit, “Revert -revert edilen commitin mesajı-” şeklinde oldu.

Peki ya pişman olduysak ve revert edilen o commit’teki değişiklikleri geri getirmek istiyorsak ne yapmalıyız?

git reset — hard HEAD^ ->

Revert ettiğimiz commit geri geldi.

Proje dosyalarınıza bakarsanız silinen değişikliklerin geri geldiğini görebilirsiniz.

git diff -> Biliyorsunuz ki “git status” komutuyla daha “git add” ve “git commit” yapılmamış dosyaları görebiliyorduk. Bu komutta ise o dosyada ne değişiklik yapılmış ve dosya içeriğinde neler var bunları daha detaylı bir şekilde görebiliyoruz.

Foto2.txt dosyası içine giderek “git diff için yazıldı” yazısını yazarak değişikliği kaydettim ve sonrasında Git Bash ekranında “git diff” komutunu çalıştırdım. Bu yaptığım değişiklik, başında + işaretiyle dosya içine ekleme yapıldı anlamında listelendi.

git diff commit1-id commit2-id -> Bu iki commit arasındaki farkları gösterir.

git diff branch-adı branch2-adı -> Bu iki branch arasındaki farkları gösterir.

Git ile ilgili anlatacaklarım şimdilik bu kadar. Git’in daha anlatmadığım çok fazla yönü var. Zamanla yeni şeyler öğrendikçe bunları yazıma da eklemeyi düşünüyorum. Eğer kafanız çok karıştıysa yazılar teorikte kalmış olabilir. Size tavsiyem GitBash ekranını açıp deneye yanıla komutları anlamaya çalışmak. Görüşmek üzere :)

--

--

Şevval Özdamar
Şevval Özdamar

Written by Şevval Özdamar

Computer Engineer - Android Developer

Responses (1)