Git Nedir? Git Komutları Nasıl Kullanılır?
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.
cd klasör-adı -> Change directory anlamına gelir. Bulunduğumuz dizinden farklı bir dizine geçiş yapmamızı sağlar.
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.
touch dosya-adı.uzantısı -> Bulunduğumuz dizin içine, dosya oluşturmamızı sağlar.
rm dosya-adı.uzantısı -> Remove anlamına gelir. Bulunduğumuz dizin içinde, istediğimiz dosyayı silmemizi sağlar.
rm -rf klasör-adı -> Bulunduğumuz dizin içinde, silmek istediğimiz klasörü silmemizi sağlar.
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.
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.
Şimdi tekrar “git status” komutunu çalıştıralım:
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:
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.
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.
git branch -> Projenin sahip olduğu tüm branch’leri gösterir.
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.
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.
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.
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.
Bana verdiği uyarıda ise “detached HEAD” kısmı önemli. Bu ne demek bakalım:
Ö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?
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.
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.
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.
Commit’i attıktan sonra log ekranına bakalım:
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^ ->
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.
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 :)