Hileler 101: Bunlar Git’e Bakışınızı Değiştirecek

Hileler 101: Bunlar Git’e Bakışınızı Değiştirecek

Git’i diğer sürüm kontrol sistemlerinden ayıran bece en büyük artısı açık kaynak kodlu pek çok proje tarafından kullanılması olmuştur. Tabi ki SVN ve BZR’nin de bu konudaki getirdiği özellikleri de yadsımak pek mümkün olmasa da şu an geliştirme pazarında Git rakiplerini gerek esnek ve kullanışlı yapısı gerekse Github, Gitlab ve Bitbucket gibi büyük geliştirme ortamlarında yer bularak arkada bıraktı. Benim git ile tanışmam da Python ile tanışmam ile neredeyse eş zamanlı olarak gerçekleşti.

Bu yazımda sıkça hayatımı kurtaran bazı git kullanımlarından ve en çok kullandığım git uygulamalarından bahsedeceğim.

Sıkça Kullandığım Git Servisleri

Github

Github 2008 yılında servise alınmış bir git projeleri için web tabanlı bir depolama servisidir. Sayısı yüz milyonları bulan kullanıcı ve organizasyon havuzu ile milyarlarca depoya ev sahipliği yapan bir sunucu servisi olmakla beraber, forum ve proje bazlı discussion board gibi özellikleri ile ayrıca bir topluluk ve actions özelliği ile de bir continious integration gibi bir rolü bulunmakta.

https://github.com

2016’dan beri aktif olarak kullanmaktayım

Gitlab

Açık kaynak kodlu bir git servisidir. Pek çok özelliği ile github için açık kaynak kodlu bir alternatiftir diyebiliriz. Ağustos 2017 itibarıyla kullanıma sunulmuştur. Ayrıca yerel sunucunuza gitlab-ce ismindeki açık kaynak kodlu sunucusunu kurarak kendinize ait bit git sunucusu oluşturabilirsiniz. Ben de bizatihi kendisini bu sebeple kullanıyorum.

https://gitlab.com

Git İle Entegre Bazı Araçlar

Gitkraken

Gitkraken tam teşekküllü bir git editörüdür. Kolaylıkla branchlerinizi ve depolarınızı yönetebilir, depo geçmişinizi inceleyebilir ve en sevdiğim özelliği olan kendi editörü ile projenizde değişiklikler yapabilirsiniz. Ayrıca bu editörü bir difftool olarak çalışmakta. Özellikle onlarca branch arasında git gel yapan ve merge işlemlerinde çıkan conflictlerden yılan birisiyseniz tam size göre bir özellik.

Gitkrakeni incelemek ve edinmek için [https://www.gitkraken.com/](https://www.gitkraken.com/)

Seçtiğim Bazı Git Kullanımları

Git’in Sağlam Kaynakçası

Git beraberinde muhteşem bir kullanım belgelendirmesi ile gelmekte. Özellikle de git’in kullanıma daiir detaylı kılavuzları pek çoğumuzun gözünden kaçmış olabilir diye buraya bırakıyorum:

$ git help -g

Ayrıca yine git tarafından getirilen sıkça kullanılan komutlar dizisine de bakmakta yarar var:

$ git help everyday

Amanın bunu göndermemeli idim

Bazen önemli olan bir datayı (örneğin bir şifreyi) yanlışlıkla commitleyip bunu sunucuya gönderebiliyoruz. İşte bu durumda önemli verilerinizi silmek için git size bazı ayrıcalıklar sunuyor:

$ git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch **dosya yolu**' --prune-empty --tag-name-filter cat -- --all

Bu komut ile dosyayı sildikten sonra bir force-push atarsanız bütün sorunlarınız düzelecektir.

Gereksiz Branchleri Silelim

Zamanla farklı farklı branchler ile çalışıp bazılarını master ile mergeledikten sonra silmeyi unutabiliriz. Bu durumda aşağıdaki komut işimizi görecektir.

$ git branch --merged master | grep -v '^\*' | xargs -n 1 git branch -d

Bu komut halihazırda master ile birleştirilmiş branchleri listeleyip bunların silinmesini sağlayacaktır.

Biraz Daha Fazla Temizlik

Bazı durumlarda uzak sunucularda commitler birleştirilirken sıkıştırılır. Bu tip sıkıştırılan ve birleştirilen yerel dalları silmek bazen insanı derin bir yükten kurtarabilir. Bunun için:

$ git branch -vv | grep ': gone]' | awk '{print <!-- @doxie.inject start -->}' | xargs git branch -D

komutunu kullanabilirsiniz.

Hayır bu benim

Eğer ki bir önceki commiti yanlışlıkla başka bir isimde attıysanız bu commiti sahiplenmek için aşağıdaki komutu kullanabilirsiniz.

$ git commit --amend --author='Isim Soyisim <eposta@addresi.com>'

Bu işlemden sonra eğer sunucudaki kopyanızdaki commit sahibini değiştirmek istiyorsanız force-push atmanız gerektiğini hatırlatmalıyım.

Dekoratif Bir Git Geçmişi

Pek çoğumuz Github’da deponun network’üne (örneğin bu sayfa) bakmayı adet edinmiş olabilir. Bunu yapmak için bir git servisi kullanmanıza gerek yok. Kendiniz de komut satırından bunu kolaylıkla görebilirsiniz.

$ git log --graph --decorate --oneline $(git rev-list --walk-reflogs --all)

Bir Önceki Commitin Düzeltilmesi

Bazı durumlarda bir commiti ötekinin bir düzeltmesi olarak yayınlayıp birbirine bağlamak isteyebiliriz. Bu gibi commitleri atarken aşağıdaki komutu kullanmak:

$ git commit --fixup <Commit ID>

bu iki commiti ilişkilendirecektir.

Dosyalarda Arama Yapmak

Git servislerinden en sevdiğimin github olmasının bir sebebi depo içerisinde arama yapabiliyor oluşu. Direk dosyalarda girdiğim diziyi arayabilmem her ne kadar güzel bir özellik olsa da git’in kendisinin de böyle bir desteği var. Bir diziyi aramak için ise yapmanız gereken tek şey şu:

$ git grep --heading --line-number '<aranacak dizi>'

Commitlerde Arama Yapmak

Bir önceki adımdaki yaptığımızı eğer ki commitler arasında aramak istiyorsak

git log --all --grep='<aranacak dizi>'

komutunu kullanmamız yeterli.

Git’te otomatik düzeltme

Hepimiz bazen yazım hataları yaparız, ancak Git’in otomatik düzeltme özelliğini etkinleştirdiyseniz, Git’in yanlış yazılmış bir alt komutu otomatik olarak düzeltmesine izin verebilirsiniz.

Diyelim ki git status ile durumu kontrol etmek istiyorsunuz, ancak yanlışlıkla git statis yazıyorsunuz. Normal koşullar altında Git size ‘statis’ komutunun geçerli bir komut olmadığını söyler:

$ git statis
git: 'statis' bir git komutu değil. Yardım için: 'git --help'.

Buna en yakın komut:
        status

Benzer senaryolardan kaçınmak için Git konfigürasyonunuzda Git otomatik düzeltmeyi etkinleştirin:

$ git config --global help.autocorrect 1

Bunun sadece mevcut deponuza uygulanmasını istiyorsanız, —global seçeneğini atlayın.

Bu komut, otomatik düzeltme özelliğini etkinleştirir. Yukarıdakiyle aynı hatalı komutu denemek size bu yapılandırmanın ne yaptığı hakkında iyi bir fikir verecektir:

$ git statis
UYARI: 'statis' adında bir Git komutunu çağırdınız, ancak böyle bir komut yok.
0.1 saniye içinde sürdürülüyor, 'status' demek istediğiniz varsayılacak.
Üzerinde bulunulan dal: main
Dalınız 'origin/main' ile güncel.

İzlenmeyen dosyalar:
  (gönderilecekler arasına koymak için "git add <dosya>..." kullanın)
        _posts/2021-04-24-dart.md
        assets/img/pages/2021-04-23-git_trics.png
        assets/img/pages/2021-04-24-dart.jpg
        assets/img/pages/2021-04-24-dart2.jpg
        assets/img/pages/2021-04-24-dart3.jpg
        assets/img/pages/2021-04-24-dart4.jpg

gönderiye bir şey eklenmedi ancak izlenmeyen dosyalar var (izlemek için
"git add" kullanın)

Git Deposunu Optimize Etmek

Kod deponuz sadece sizin için değil bazen beraber çalıştığınız kişiler için de değerlidir. Birkaç basit uygulama ile deponuzu temiz ve güncel tutabilirsiniz.

Bildiğiniz gibi gitte depoyu temiz tutmanın yollarından birisi .gitignoredosyasını kullanmaktır. Bu dosyayı kullanarak Git’e ikili dosyalar, geçici dosyalar gibi birçok istenmeyen dosyayı saklamamasını söylüyorsunuz.

Deponuzu daha fazla optimize etmek için Git çöp toplamayı kullanabilirsiniz.

$ git gc --prune=now --aggressive

Bu komut, siz veya ekibiniz yoğun şekilde bir kodu çekmesini veya düzenleyip değişimleri göndermesi esnasında biriken, deponuzdaki erişilemeyen veya “sahipsiz” git nesnelerini temizleyen dahili bir yardımcı programdır.

Kodunuz için Bir Sürüm Arşivi Oluşturmak

Git kod deposu kodunuzu Git’ten sıkıştırabilirsiniz. Belirli değişiklikleri veya bireysel değişimleri de dışa aktarabilirsiniz. Ayrıca tüm deponuzu sıkıştırabilirsiniz. Bunu şu komutla yapabiliriz:

$ git archive --format zip --output master_branch.zip master

Bir Branch’i Klonlayın (Depoyu Değil)

Klonlama komutu ile, uzak deponun tamamını kopyalıyorsunuz. Ancak uzak bir depodan yalnızca belirli bir dalı klonlamak istiyorsanız ne olacak?

$ git init

$ git remote add -t <klonlamak istediğimiz branchin adı> -f origin <klonlamak istediğimiz branchin adı>

$ git checkout <klonlamak istediğimiz branchin adı>

Bash İle İnteraktif Çalışmak

Eğer ki bash’ın otomatik tamamlama özelliklerinden yararlanmak istiyorsanız git için gerekli bazı bash-completion betikleri ile bunu başarabilirsiniz.

$ curl -L http://git.io/vfhol > ~/.git-completion.bash && echo '[ -f ~/.git-completion.bash ] && . ~/.git-completion.bash' >> ~/.bashrc

Git eklentileri

Git, ücretsiz ve açık kaynaklı bir dağıtılmış sürüm kontrol sistemidir. Bu nedenle, özel komut dosyaları yazarak işlevselliğini genişletmeniz kolaydır.

Bu eklentilerden kendi dotfiles depoma da koydum. İsteseniz bir göz atın derim: Zaryob/dotfiles Dotfiles are configuration files of UNIX/LINUX applications. This are configurations of zaryob It would be destroy your…github.com

Ayrıca Bakınız:

Github’a bağlı cli uygulaması. Bu uygulama hem git kullanıyor hem de github üzerindeki projelerini her konuda yönetmenizi sağlıyor. Bunun sayesinde issue’leri izleyebilir, pull requestleri yönetebilir ve depolarınızı yönetebilirsiniz: cli/cli gh is GitHub on the command line. It brings pull requests, issues, and other GitHub concepts to the terminal next to…github.com

Kullanmayı sevdiğim bir git extension’u: nvie/gitflow A collection of Git extensions to provide high-level repository operations for Vincent Driessen’s branching model. For…github.com