95 puan yazan xguru 2025-02-26 | 7 yorum | WhatsApp'ta paylaş
  • "Pro Git" yazarı Scott Chacon, küresel olarak etkinleştirdiği bazı Git ayarlarını ve bunların nedenlerini açıklıyor
  • Ayarların çoğu, doğrudan Git çekirdek kod tabanı üzerinde çalışan geliştiricilerden öğrenilmiş
  • Aşağıda, Git’i daha iyi hale getiren ~/.gitconfig ayarları yer alıyor
    [column]  
    ui = auto  
    [branch]  
    sort = -committerdate  
    [tag]  
    sort = version:refname  
    [init]  
    defaultBranch = main  
    [diff]  
    algorithm = histogram  
    colorMoved = plain  
    mnemonicPrefix = true  
    renames = true  
    [push]  
    default = simple  
    autoSetupRemote = true  
    followTags = true  
    [fetch]  
    prune = true  
    pruneTags = true  
    all = true  
    
    # Bunu kullanmamak için bir sebep var mı?  
    
    [help]  
    autocorrect = prompt  
    [commit]  
    verbose = true  
    [rerere]  
    enabled = true  
    autoupdate = true  
    [core]  
    excludesfile = ~/.gitignore  
    [rebase]  
    autoSquash = true  
    autoStash = true  
    updateRefs = true  
    
    # Kişisel tercihe bağlı ayarlar (gerekiyorsa yorumdan çıkarıp kullanın)  
    
    [core]  
    # fsmonitor = true  
    # untrackedCache = true  
    [merge]  
    # (Git sürümü 2.3'ten eskiyse `diff3` kullanın)  
    # conflictstyle = zdiff3  
    [pull]  
    # rebase = true  
    

Git çekirdek geliştiricileri Git’i nasıl yapılandırıyor?

  • Git posta listesinde Felipe Contreras bir keresinde çekirdek ekibe, tüm ayarları ve takma adları kaldırıp Git’i varsayılan haliyle kullanmayı denemelerini önermişti
  • Bu deneyin sonucunda 9 ayar ve 3 takma ad yeni varsayılanlar olarak önerildi
    merge.conflictstyle = zdiff3  
    rebase.autosquash = true  
    rebase.autostash = true   
    commit.verbose = true  
    diff.colorMoved = true  
    diff.algorithm = histogram  
    grep.patternType = perl  
    feature.experimental = true  
    branch.sort = committerdate  
    
  • Bu ayarlar henüz varsayılan olarak benimsenmiş değil
  • Ancak ilginç olan şu ki, birçok Git geliştiricisi bunlardan bazılarını açmadan Git kullanmakta zorlanıyor
  • Daha da ilginç olan, çoğunuzun bunların ne anlama geldiğini muhtemelen hiç bilmiyor olması
  • Bunu üç kategoriye ayırarak açıklayacağım
    • Git’i açıkça daha iyi hale getirenler (Clearly Makes Git Better)
    • Bunu kullanmamak için ne sebep var? (Why the Hell Not?)
    • Zevk meselesi olanlar (A Matter of Taste)

# Git’i açıkça daha iyi hale getirenler

Branch listesini sıralama

  • Varsayılan olarak Git branch’leri alfabetik sırada listeler, ancak son commit tarihine göre sıralamak daha kullanışlı olabilir
  • Aşağıdaki ayarlarla branch’leri en son commit’e göre sıralayabilir ve sütunlu biçimde gösterebilirsiniz
    git config --global column.ui auto  
    git config --global branch.sort -committerdate  
    

Tag listesini sıralama

  • Tag’leri alfabetik değil, sürüm sırasına göre dizmek için şu ayarı kullanın
    git config --global tag.sort version:refname  
    

Varsayılan branch adını ayarlama

  • Yeni bir depo başlatırken varsayılan branch adını belirlemek için şu şekilde ayarlayın
    git config --global init.defaultBranch main  
    

Gelişmiş diff ayarları

  • Varsayılan diff algoritmasını histogram yaparak daha isabetli karşılaştırmalar elde edin
  • Kod taşımalarını algılayıp renkle göstermek için şu ayarları ekleyin
    git config --global diff.algorithm histogram  
    git config --global diff.colorMoved plain  
    git config --global diff.mnemonicPrefix true  
    git config --global diff.renames true  
    

Geliştirilmiş push ayarları

  • Aşağıdaki ayarlarla push davranışını iyileştirebilirsiniz
    git config --global push.default simple  
    git config --global push.autoSetupRemote true  
    git config --global push.followTags true  
    

Geliştirilmiş fetch ayarları

  • Fetch sırasında gereksiz branch ve tag’leri otomatik kaldırmak için şu ayarları kullanın
    git config --global fetch.prune true  
    git config --global fetch.pruneTags true  
    git config --global fetch.all true  
    

# Bunu kullanmamak için bir sebep var mı?

Otomatik düzeltme istemi

  • Komut girerken yazım hatalarını algılayıp öneri sunmasını istiyorsanız şunu kullanın
    git config --global help.autocorrect prompt  
    

Commit atarken diff gösterimi

  • Commit mesajı yazarken değişikliklerin de gösterilmesini istiyorsanız şu ayarı ekleyin
    git config --global commit.verbose true  
    

Çakışma çözümünü yeniden kullanma

  • Daha önce yapılmış çakışma çözümlerini otomatik yeniden kullanmak için şu ayarları kullanın
    git config --global rerere.enabled true  
    git config --global rerere.autoupdate true  
    

Genel .gitignore dosyası ayarlama

  • Genel olarak yok sayılacak dosyaları belirtmek için şu şekilde ayarlayın
    git config --global core.excludesfile ~/.gitignore  
    

Rebase ayarlarını iyileştirme

  • Rebase sırasında otomatik squash ve stash yapılmasını istiyorsanız şu ayarları kullanın
    git config --global rebase.autoSquash true  
    git config --global rebase.autoStash true  
    git config --global rebase.updateRefs true  
    

# Zevk meselesi

Gelişmiş merge çakışması gösterimi

  • Merge çakışmalarında temel sürümün de gösterilmesini istiyorsanız şu ayarı değerlendirebilirsiniz
    git config --global merge.conflictstyle zdiff3  
    

pull sırasında rebase kullanma

  • git pull sırasında otomatik olarak rebase yapılmasını istiyorsanız şu şekilde ayarlayın
    git config --global pull.rebase true  
    

Dosya değişikliği algılama hızını artırma

  • git status gibi komutların performansını artırmak için şu ayarları kullanabilirsiniz
    git config --global core.fsmonitor true  
    git config --global core.untrackedCache true  
    

# Sonuç

  • Bu ayarlar sayesinde Git’i daha rahat kullanabilir, bazılarını çekirdek geliştiricilerin de aktif biçimde tercih ettiğini görebilirsiniz
  • Git ayarlarınızı optimize ederek iş akışınızı geliştirebilir ve aracı daha verimli kullanabilirsiniz

7 yorum

 
brainypooh 2025-02-28

"Daha da ilginç olan, çoğunuzun bunun ne anlama geldiğine dair hiçbir fikrinin olmaması" sözü tam yerini bulmuş. Aman aman.

 
tested 2025-02-27

"--global" değil de "-global" mı?

 
xguru 2025-02-27

Doğrusu --global. Kopyala-yapıştır sırasında bir hata olmuş. Düzeltildi.

 
ilikeall 2025-02-26

Çakışma çözümünü yeniden kullanma özelliği güzelmiş.

 
tujuc 2025-02-26

Ben diff alırken git-delta kullanıp TUI biçiminde görüntülüyorum.

  10   │ [core]  
  11   │     pager = delta  
  12   │ [interactive]  
  13   │     diffFilter = delta --color-only  
  14   │ [delta]  
  15   │     line-numbers = true  
  16   │     side-by-side = true  
  17   │     navigate = true  
  18   │     diff-so-fancy = true  
  19   │     hyperlinks = true  

Ama bunların hiçbiriyle uğraşmak istemezsem tig... hahaha Daha iyi bir şey var mı acaba...?

 
GN⁺ 2025-02-26

Hacker News görüşleri

  • En sevdiğim alias git out. Push edilmemiş tüm commit'leri listeliyor. Sürekli kullanıyorum
    [alias]   
      out = "log @{u}.."   
    
  • Birçok kişi kendi ~/.gitconfig dosyasını kurcalarken, git CLI için tamamlayıcı olarak delta'yı şiddetle tavsiye ederim
  • Benim ~/.gitconfig dosyam şöyle
    [alias]  
      co = checkout  
      ci = commit  
      st = status  
      br = branch  
      hist = log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short  
      type = cat-file -t  
      dump = cat-file -p  
      dft = difftool  
    [tag]  
      sort = version:refname  
    [tar "tar.xz"]  
      command = xz -c  
    [tar "tar.zst"]  
      command = zstd -T0 -c  
    [log]  
      date = iso-local  
    [pull]  
      ff = only  
    [diff]  
      tool = difftastic  
    [safe]  
      directory = *  
    [advice]  
      detachedHead = false  
    [init]  
      defaultBranch = master  
    
  • Commit imzalamanın neden bu ayarlara dahil edilmediğini merak ediyorum. Modern SSH anahtarlarıyla bunu kolayca yapabilirsiniz
    [user]  
      name = xyz  
      email = xyz@domain.com  
      signingkey = ~/.ssh/id_algorithm.pub  
    
    [commit]  
      gpgsign = true  
    [tag]  
      gpgsign = true  
    
    [gpg]  
      format = ssh  
    
    # restrict allowed signers  
    # echo "$(git config --get user.email) namespaces=\"git\" $(cat ~/.ssh/id_*.pub)" >> ~/.git_allowed_signers  
    [gpg "ssh"]  
      allowedSignersFile = ~/git_allowed_signers  
    
    • GitHub'da SSH anahtarlarını hem kimlik doğrulama hem de imzalama için ekleyebilirsiniz. İki kez eklemek gerekiyor ama bir kez ayarladıktan sonra commit'lerdeki unverified etiketinden kurtulabiliyorsunuz
  • Julia Evans'ın popüler Git ayar seçenekleri
  • Hoşuma giden ek seçenekler
    [apply]  
      # Remove trailing whitespaces  
      whitespace = fix  
    [color "diff"]  
      whitespace = red reverse  
    [diff]  
      colorMovedWS = allow-indentation-change  
    [format]  
      pretty = fuller  
    [log]  
      date = iso  
    [pull]  
      ff = only  
    
  • Benim ayarlarım burada. Temelde bunların çoğu zaten yapılandırılmıştı (column UI hariç). Muhtemelen Scott ve başkalarının iyi yazılarını okuduğum içindir
  • (z)diff3 kullanılması tavsiyesine katılıyorum. Yazı bunun önemini olduğundan az gösteriyor. Üç yönlü diff, varsayılan stilde mümkün olmayan çakışma çözümlerini mümkün kılıyor
  • Git'in tercih ettiği pager'ı kullanacak şekilde ayarlanabildiğini fark ettim. Ben de bat olarak ayarladım