Git Nedir?
Git en yaygın olarak kullanılan versiyon kontrol sistemidir. Peki versiyon kontrol sistemi nedir? Versiyon kontrol sistemi bir doküman (yazılım projesi, dosya vb.) üzerinde yaptığımız değişiklikleri adım adım kaydeden ve isterseniz bunu internet üzerinde repository’de saklamamızı ve yönetmemizi sağlayan bir sistemdir. Bir örnek vermek gerekirse bir oyun oynadığımızı ve görevler yaparak ilerlediğimizi düşünelim. Herhangi bir noktada öldüğümüzde oyuna en baştan başlamak can sıkıcı olabilir. İşte bu noktada oyunun belirli noktalarında kayıt alan (checkpoint) ve öldüğümüz zaman o noktalardan başlamamızı sağlayan sisteme versiyon kontrol sistemi diyebiliriz. Dosyaların kayıt altına alınmış herhangi bir andaki hallerine “versiyon” diyebiliriz. Versiyon kontrolü ise bir ya da daha fazla dosya üzerinde yapılan değişikliklerin (düzenleme,silme,ekleme vb.) kayıt ve takip edilmesini, gerekli durumlarda belirli bir versiyonuna geri dönülmesini sağlayan bir sistemdir.
Git, BitKeeper, SVN, Mercurial versiyon kontrol sistemlerine örnek olarak gösterilir. Git’i diğer versiyon kontrol sistemlerinden ayıran özellikler nelerdir? Git, dosyalarda yaptığınız değişiklikleri izler, böylece yapılanların bir kaydını tutar ve ihtiyaç duymanız halinde belirli sürümlere geri dönebilmenizi sağlar. Git, birden çok kişinin yaptığı değişikliklerin tek bir kaynakta birleştirilmesine izin vererek işbirliğini kolaylaştırır. Sadece sizin göreceğiniz bir kod yazın ya da bir ekibin parçası olarak çalışın. Git sizin için faydalı olacaktır. Tamamen açık kaynaklı olarak, ücretsiz bir şekilde kullanılabilmektedir. Kısacası Git, yazılım geliştirme süreçlerinde kullanılan, hız odaklı, dağıtık çalışan bir sürüm kontrol ve kaynak kod yönetim sistemidir. Git bir versiyon kontrol sistemiyken Github projelerimizin saklandığı bir portaldır.
1. Git Bash Terminal Komutları
- LS: Dosya ve Klasör listeler.
- LS -la: Gizli klasörleri, dosyaları ve detayları gösterir.
- PWD: Güncel olarak bulunduğum klasörü gösterir.
- CD: Klasör değiştirme cd [folderName] şeklindedir.
cd .. : bir üst dizine çıkmak için kullanılır. - CLEAR: Terminal temizler.
- MKDIR: Klasör oluştur.
- TOUCH: Dosya oluştur.
- RM: Dosya silmek için kullanılır.
- RM -RF: Klasör silmek için kullanılır.
2. Git Temelleri
Versiyon Kontrolü
- git –version
Yapılandırma Listesi
- git config –list
Kullanıcı Bilgileri Ekleme
- git config –global user.name “Kullanıcı Adı”
- git config –global user.email “Eposta Adresi”
GIT Sistemini Aktif Etme
- git init
GITIGNORE
Çalışma dizininizdeki .env, node_modules gibi git sistemi tarafından takip edilmesi doğru olmayan dosya ve dizinleri ana dizinde oluşturacağınız .gitignore dosyası ile git’e gönderilmesini engelleyebilirsiniz.
Durum Kontrolü
Çalışma dizininde yapılan değişiklikleri görmek için kullanılır.
- git status
Staging Area
Git tarafından dosyalarınızın commit edilebilir olmasını istiyorsanız staging area içerisine aktarmalısınız.
- git add fileName
Eğer tüm dosyaları eklemek isterseniz “.” kullanabilirsiniz.
- git add .
Staging Area içerisinde olan dosyanızı çıkartmak için aşağıdaki komutu kullanabilirsiniz. Commit işleminize dahil olmaz.
- git rm –cached fileName
Commit İşlemi
Staging Area içerisinden Local Repository içerisine dosyaları aktarmak için commit işlemi gerçekleştirmeliyiz.
- git commit -m “first commit”
Yapılan commit işlemlerini listelemek için aşağıdaki komut kullanılabilir.
- git log
Eğer ağaç yapısında görmek isterseniz –graph eklemelisiniz.
- git log –graph
3. Git Branch
Proje sürecinde farklı ekipler farklı özellikler geliştiriyor olabilir. Feature ayrımı yaparak ilerlemek istiyor olabilirsiniz. Bu işlem için branchler kullanılmaktadır.
Head güncel olarak hangi branch ve hangi committe olduğumuz gösterir. Git sistemi varsayılan olarak Master branch’i üzerinden ilerlemektedir.
Güncel Branch Bilgisi
Git sistemindeki branchleri listeler ve aktif olanı * ile işaretler.
- git branch
Branch Oluşturma
Aşağıdaki komut Test adında bir branch oluşturur.
- git branch Test
Branch Değiştirme
Oluşturulan branch’e geçiş yapmak için switch komutu kullanılır.
- git switch Test
Ana branch’e geçmek için ana branch adını yazmak gerekmektedir.
- git switch MASTER
Branch Birleştirme
Master branch ile Test branch birleştirmek için aşağıdaki komut kullanılabilir.
- git merge Test
Fast Forwarding
Master branch üzerinde bir değişiklik yapmadan diğer branch üzerinde yapılan değişikleri master branch’e dahil etme işlemine fast forwarding denilmektedir. Özel bir komutu yok.
- Git merge “branch adı”
Merge Conflict
Branch birleştirme işlemlerinde ya da aynı branch üzerinde farklı kişilerin yapmış olduğu değişiklikler sonrasında çakışma oluşabilir. Aynı dosyada birden fazla kişinin çalışması merge conflict’e neden olabilir. Bu sebepten conflictleri kontrol edip, yönetmeniz istenecektir
Stash
Test branch üzerinde bir geliştirme yapıyorsunuz diyelim. Ancak henüz commit etmeye hazır değil yani geliştirmeyi bitirmediniz.
Master branch’e geçip farklı bir geliştirme yapmanız gerekiyor. Master branch’deki geliştirmeniz bittikten sonra Test branch üzerinde işlem yapmaya devam etmek istiyorsunuz. İşte böyle bir durumda stash yapısını kullanabilirsiniz.
- 1. Yöntem : Eğer yaptığınız değişikler branch değiştirince git status yazdıktan sonra görünüyorsa commitlemeden önce geri almak isterseniz git restore fileName komutunu kullanabilirsiniz. Bu durumda eski branch döndüğünüzde değişiklikleri silinmiş görürsünüz. Çünkü git restore fileName yapmadan önce herhangi bir kayıt işlemi yapılmadı. Yani bilgi kaybolur.
- 2. Yöntem : Stash
Stash saklamak, depolamak anlamına gelir.
- git stash push: Mevcut branchteki değişikleri saklar.
- git stash list: Stash üzerinde bulunan güncel kayıtları listeler.
- git stash pop: Stash’e atılan en son kaydı getirerek ilgili yerlere uygular ve stash list’ten siler.
- git stash apply stash@{0}: birden fazla kayıt arasından istediğimizi uygulayabiliriz.
- git stash clear: stash üzerindeki tüm kayıtları silebiliriz
- git stash apply: stash üzerindeki ilk kaydı getirir ve kayıt stash üzerinde kalmaya devam eder.
4. Geçmişe Dönme
Commit göndermesek geri dönmek git restore ile mümkün ancak commit gönderdikten sonra ne yapabiliriz?
GIT Checkout
- “git checkout commitId” Şeklinde kullanılır.
Head konumunu değiştirir. Checkout ile geri döndüğümüzde en son commit silinmez. Sadece gezinmiş, önceki commite geçmiş oluyoruz. Ayrıca mevcut konumdan projeyi dallandırabilir yeni bir branch oluşturabiliriz.
GIT Reset
- “git reset commitId” ID bilgisi verilen commite döner ve seçili commit id sonrasında gelen commitleri siler. Ancak sonradan eklenen commitlerle gelen değişikleri silmez onları bırakır.
- git reset –hard commitId: ID bilgisi verilen commite döner sonrasında gelen commitleri ve değişikleri de siler.
- git reset –soft commitId: ID bilgisi verilen commite döner sonrasındaki commitler staging area içerisine taşınır.
GIT Revert
- “git revert commitId”
GIT History içerisinde tutmak istediğiniz geri alma işlerinde kullanılır. Yani değişikler geri alınır ve git log ile bakıldığında geri alınan commitler görüntülenebilir. Yani rollback var ve history’de neyin geri alındığı tutuluyor.
GIT Diff
- git diff: Staging Area içerisine eklenmemiş, güncel dosya içerisindeki değişikleri gösterir.
- git diff HEAD: Son commit’e göre yapılan değişikleri gösterir.
- git diff commitId1 commitId2: İki commit arasındaki farklılıkları gösterir.
- git diff branchname1 branchname2: İki branch arasındaki farklılıkları gösterir.
GIT Rebase
- “git rebase master”
GIT History içerisini daha temiz tutmak için yani merge commitlerden kurtulmak için kullanılabilir.
5. Remote Repository (Github Vb.)
Yukarıda anlatılanlar local repository üzerinde gerçekleştirdiğimiz işlemlerdir. Takım çalışmasında remote repository ile işlem yapmamız gerekmektedir.
Başka bir projeyi kendi lokalinize indirmek için git clone komutunu kullanabilirsiniz.
- git clone https://github.com/username/repositoryName.git
Branch bildirmek için kullanılmaktadır. Yani master branch olarak ifade ettiğimiz yapıyı main olarak adlandırıyoruz.
- git branch -M main
Aşağıdaki komut ile local repository’deki bilgileri remote repoya aktarmak için kullanırız. Buradaki -u ifadesi origin olarak bildirilen URL’ye varsayılan olarak gönderileceğini ifade eder. Sonrasındaki commitler için git push demek yeterli olacaktır.
- git push -u origin main
Direkt olarak local repository’i etkilemeden yani değişikleri uygulamadan remote repository’den değişikleri çekmek istersek aşağıdaki gibi fetch komutundan faydalanabiliriz. Bu sayede main branch remote repository’den gelir ve git status komutu ile mevcut durum kontrol edilebilir.
- git fetch origin main
Aşağıdaki komut ile remote repository üzerinde bulunan branchler listelenir.
- git branch -r
Eğer remote repository’den değişikleri hem al (fetch) hem de merge et demek istersek aşağıdaki komutu kullanabiliriz.
- git pull origin main
Remote Repository’e lokalinizde oluşturduğunuz bir branch’i göndermek isterseniz aşağıdaki işlemleri yapmanız gerekir.
- git switch branchName
- git push –set-upstream origin branchName