Türkçe Git Rehberi 3— Git Nedir — Git Kullanımı — Git Servisleri — Git Komutları

Ubeyde Akgül
Huawei Developers - Türkiye

--

Serinin birinci yazısında; Git nedir, Git yapısı, Git katmanları, Git servisleri, Git masaüstü uygulamaları, Görsel Git istemcileri, Git kurulumu ve konfigürasyonu gibi Git hakkındaki temel bilgiler paylaşmıştım.

Serinin ikinci yazısında; detaylı olarak Git kullanımı, Git komutları, Git kodlarının ne işe yaradığı ve nasıl kullanıldığı, hangi işlemi nasıl yapacağımız hakkında bilgiler paylaşmıştım. Bu yazımda bu bilgilerin devamını paylaşacağım.

En çok kullanılan temel Git komutlarını aşağıdaki görselde inceleyebilirsiniz.

git cheat sheet by pinterest
git cheat sheet (reddit)

git commit

Kelime olarak işlemek anlamıa gelen komut dosyaları ve yapılan değişiklikleri Git Repository’sine ve commit tarihçesine kaydeder. git add ile Staging Area’ya eklenen dosyaları Staging Area’dan Local Repository’ye taşır.

git commit -a

Git çalışma ağacına bakarak yapılan değişiklikleri tespit eder. Bu değişiklikler için gerekli komutları ( git add , git rm vb ) otomatik olarak çalıştırarak commit işlemini gerçekleştirir.

git commit -m “commit_mesajı_içeriği”

Yapılan değişiklikleri Staging Area’dan Local Repository’ye taşır ve bu işlem kaydına girilen mesajı ekler.

git commit — amend

Son kaydedilen işlemdeki mesajı, son commit mesajını değiştirir. Yeni bir kayıt oluşturmak yerine, aşamalı değişiklikler bir önceki işleme eklenecektir. Sistemin yapılandırılmış metin düzenleyicisini açarak bir önceki commit mesajını değiştirmenizi ister.

git commit --amend
// or without open text editor
git commit --amend -m "değiştirilen commit mesajı"

Daha fazlası için : Record changes to the repository (Commit)

GitCommit (BitBucket)

git push

Üzerinde çalışılan geçerli Local Repository’e commit ile kaydedilen değişiklikleri gerçerli Remote Repository branch’ine gönderir. Remote Repository de üzerinde çalışıln branch isminde bir branch yoksa, yaratılır ve kaydı gerçekleştirilir.

git push <remote_ismi> <branch_ismi>

Üzerinde çalışılan geçerli Local Repository’e commit ile kaydedilen değişiklikleri belirtilen Remote Repository branch’ine gönderir. Birden fazla remote repository’e push işlemi yapmak için hangisi olduğunu belirtmek gerekir.

git push origin master
// veya
git push communityHub development
// tüm local bracnh'leri remote repository'e aktarmak
git push <remote> --all
// tüm local bracnh'leri remote repository'e aktarmak
git push <remote> --all

Daha fazlası için : Update remote repository(Push) , Git Push

git merge

Herhangi bir brach’de yaptığımız değişiklikleri diğer bir branch’e birleştirme ve entegre etme işlemidir. Farklı dallarda çalışarak yapılan geliştirmelerin, örneğin develop branch’ine birleştirilmesi gerekiyor ki yeni geliştirmeler için farklı branch açılacağı zaman veya farklı bir geliştirici daha proje üzerinde çalışacağı zaman, güncel repository kullanılsın.

Örneğin : A Bracnh’ini B Branch’ine birleştirmek, entegre etmek istiyorsunuz. Bunun için A Bracnh’ine geçiş yaptıktan sonra merge işlemi yapabilirsiniz.

// merge two local branch
git checkout Branch-B
git merge Branch-A

Remote Repository branch’leri üzerinde merge işlemi yapmak için push sonrası Merge Request (MR) oluşturabilirsiniz. Bunu kullandığınız git servisinin repository sayfasında ilgili branch üzerinde gerçekleştirebilirsiniz. Ayrıca GitBash, push işlemi sonrası loglarda MR linki verecektir.

git gc

Gereksiz dosyaları siler ve repository’i optimize eder. Yani çöp toplayıcı (Garbage collection) olarak depo bakım komutudur.

Daha fazlası için : Cleanup and optimize the local repository , Git gc

git update-ref

İlk commiti geri almak isterseniz ; ( revert initial commit )

git update-ref -d HEAD

git revert

Yapılan değişiklikleri geri almak, commit’leri geri almak, yapılan commit’i iptal etmek, branch’in önceki haline dönmek gibi işlemler için kullanılan git komutu. Revert komutu, yapılan işlemleri geri alır, commit tarihçesinde belirtilen commit id’den sonraki kayıtlardaki değişiklikleri geri alır. Fakat bu işlem için de yeni bir commit atar ve önceki commit’ler geçmiş commit olarak kalmaya devam eder.

git revert commitid12345 
// veya son commit edilen değişiklikleri içeren HEAD dönüşü için
git revert HEAD
// veya working directory değiştirmeden geri dönmek için
git revert <comit_id> --soft
// veya herşeyi kaldırarak geri dönmek için
git revert <comit_id> --hard

Daha fazlası için : Revert some existing commits , Git Revert

git reset

Yapılan değişiklikleri geri almak, commit’leri geri almak, yapılan commit’i iptal etmek, yapılan commit’i silmek!, branch’in önceki haline dönmek gibi işlemler için kullanılan git komutu. Reset komutu, yapılan işlemleri geri alır ve commit tarihçesinde belirtilen commit id’den sonraki değişiklikleri ve commit’leri siler. Fakat bu işlem için yeni bir commit atmaz. Commit tarihçesi son aşama olarak belirtilen son commit id’ye döner.

git reset commitid12345 
// veya working directory değiştirmeden geri dönmek için
git reset <comit_id> --soft
// veya local commit'leri koruyarak geri dönmek için
git reset <comit_id> --keep
// veya herşeyi silerek geri dönmek için
git reset <comit_id> --hard
// veya son commit edilen değişiklikleri içeren HEAD dönüşü için
git reset --hard HEAD

Diyelim ki reset yaparak istemediğiniz bir commit id ye döndünüz. Yani yanlışlıkla kayıtları sildiğiniz ve geri getirmek istiyorsunuz :

Yapılan reset işlemi sonra git gc komutunu çalıştırmadıysanız, Git silinen bilgileri 30 gün saklamaya devam ediyor.(değiştirilebilir)

Reset ile silinen commitleri kurtarma, geri getirme yöntemi için şu adreslerdeki örneklerini inceleyebilirsiniz :

Restoring lost commits , Recovering lost commits from a “git reset — hard”

git restore

Herhangi bir dosyayı başka bir commit’ten geri yükler. Bracnh’i güncellemez.

git restore --staged <dosya_ismi>
// veya dizin altındaki tüm dosyaları geri yüklemek için
git restore app/src/main/java/com/
// veya working tree geri yüklemek için
git restore --worktree

Daha fazlası için : Restore working tree files

git rebase

Dallar Branch’ler arasında commit tarihçesini eşitler. Bir branch’teki tüm commi’leri diğer branch’e yeniden yazar. Biraz riskli görülen ve revert etmesi sıkıntılı bir işlem olduğu için dikkatli kullanılması gereken bir komut. Merge komutu gibi ancak aralarında önemli bir fark var;

Merge komutu; A dalındaki değişiklikler B dalı ile birleştirerek B dalının commit tarihçesinde merge işleminden kaynaklanan ve merge commit adı verilen otomatik oluşturulmuş bir commit atar. Tüm değişiklikleri görmek istiyorsanız merge kullanmalısınız, çünkü merge tüm değişiklikleri olduğu gibi korur.

Rebase komutu ise; A dalındaki her bir commiti sanki commit işlemi B dalında yapılmış gibi B dalına yeniden yazar. Bu sayede B dalının commit tarihçesi sanki tüm işlemler ve değişiklikler bu dalda yapılmış gibi görünür. Daha sade, anlaşılabilir ve lineer bir commit history istiyorsanız rebase kullanabilirsiniz.

git rebase Branch-B

Örneğin : Branch-A üzerinde çalışıyorken, yukarıdaki kodu çalıştırdığınızda;

Git öncelikle Branch-A ile Branch-B arasında ortak olan en son commit’i bulur. Bulunan son ortak commit sonrasında, Branch-A üzerinde yapılan diğer tüm commit’leri geri alır, fakat bu commitler silinmez sadece geçici olarak farklı bir yerde saklanır. Daha sonra Branch-B’deki tüm commitler Branch-A’ya aktarılır, uygulanır. Son aşamada ise Branch-A’nın geçici olarak farklı bir yerde saklanan commit’leri değişikliklerin üzerine tekrar uygulanır. Bu işlemler sonrasında tüm değişiklikler sanki sadece Branch-A üzerinde gerçekleşmiş gibi görünür.

Detaylı bilgi için: GitRebase

rebase vs merge

git stash

Bazen günlük çalışmalarda tam olarak bitmeyen değişiklikleri commit yapmadan kayıt altına almak isteyebiliriz. Örneğin; bir değişiklik üzerinde çalışırken başka bir konu ile ilgili bir değişiklik isteği geldi ve yapmakta olduğumuz işi yarım bırakıp yeni istere odaklanmak durumundayız. Bu durumda yapılan değişiklikleri kaybetmeden yeni ve temiz bir branch oluşturarak, yarım kalan değişiklikleri commit yapmadan kayıt altına almak için git stash komutunu kullanabilirsiniz.

git stash push

Geçici olarak kaydettiğimiz değişikliklerin stash listesnin en üstüne ekler.

git stash push -m "messag description :Last Changes on readMe file."

git stash list

Geçici olarak kaydettiğimiz değişikliklerin listesine verir.

git stash pop

Stash listesinin en üstündeki kaydı branch’e yükler ve stash listesinden siler.

git stash apply

Stash listesindeki herhangi bir kaydı branch’e yükler fakat listeden silmez.

git stash apply stash@{1}

git stash drop

Stash listesindeki herhangi bir kaydı stash listesinden siler

git stash drop stash@{2}

git stash clear

Stash listesinin tamamını siler

Herkesin başına gelen o problem : Yanlış branch te çalışmak ve yanlış branch’e commit yapmak.

Diyelim ki repository’nin son halini pulladınız ve yeni bir branch oluşturmadan master branch’ çalışma yaparak commit’lediniz.
Peki yanlış branch’e yapılan commit nasıl düzeltilir? Yanlış branch’te yapılan işlemler kaybedilmeden diğer branch’e nasıl nasıl aktarılır?

// öncelikle yapılan değişiklikleri stash’e eklenmeli
git stash
//sonrasında HEAD için kaç commit yapıldıysa o kadar geriye çekilmeli. örneğin 1 seviye reset için
git reset HEAD~1
// veya belirli bir commit id ye dönmek için
// git reset <comit_id>
// sonrasında diğer branch’e geçilmeli
git checkout other-branch
// ardından stash’e eklenen değişiklikleri branch’e alabilirsiniz.
git stash pop
// değişiklikleri kaydedip re-commit yapmalısınız.
git commit -m “we saved and moved changes to other branch…”

ConflictÇakışma :

Versiyon kontrol sistemlerindeki en büyük problem ve baş belamız.

Conflict Çakışma

Aynı dosyadaki aynı kısımlarda yapılan değişikliklerin remote repository de birleştirildiğinda çakışması durumu. Bazen basit bir şekilde çözülebilirken bazen saatlerimizi alabiliyor. Bu çakışmaları (conflict) git otomatik olarak algılayarak bize bildiriyor ve yapılan hangi değişikliği entegre etmemiz gerektiğini belirlememiz gerekiyor. Çakışmaları engellemenin en iyi yolu master-develop hangi ana branch te çalışıyorsak, branch dalımızı sık sık güncelleştirmektir. Ek olarak kullanılan rebase-merge-commit komutları öncesi stash kullanmak da kendinizi büyük ölçüde koruma altına alarak conflic çözme noktasında yardımcı olacaktır.

merge conflict by axasoft

Conflict nasıl çözülür, Conflict çözmek, Conflict çözümü sorularının cevabı için yardımcı linkler :

Resolving a merge conflict using the command line (GitHub)

Merge request conflict resolution (GitLab)

Resolving Merge Conflict (Atlassian)

Resolve Git conflicts (jetbrains.com)

How to resolve merge conflicts in Git? (Stackoverflow)

How to resolve a git merge conflict (opensource.com)

Git çakışmalarını gidermenin etkili yolları (CüneytAliustaoğlu)

--

--