Git İpuçları ve Püf Noktaları
(blog.gitbutler.com)- Git’i uzun süredir kullanan kullanıcıların bile gözden kaçırabileceği az bilinen özellikler çok fazla; bu da ileri seviye komut satırı bilgisinin yaygın olduğu varsayımını sarsıyor
- SVN ve CVS’ten geçen kuşağın aksine, yalnızca Git kullanmış geliştiricilerin bazı ileri kullanım biçimlerini öğrenme fırsatı daha az oldu
- Git zaman içinde küçük ama faydalı özellikler eklemeyi sürdürdü ve bu değişiklikler belirli durumlarda pratik değer taşıyabiliyor
- Orta ve ileri seviye kullanıcılar için eski ama yararlı özellikler, yakın zamanda eklenen özellikler ve büyük depolar/monorepo konuları 3 kısa seriye ayrılıyor
- Alışıldık Git kullanım alışkanlıklarıyla görünmeyen özelliklere yeniden bakmak, günlük depo işlerini daha verimli yönetmeyi sağlayabilir
Git’e neden yeniden bakmalı?
- Yakın zamanda Git ve GitButler ile ilgili sunumlar yaparken birçok geliştiricinin Git hakkında bilmediği şeyler olduğunu gördü
- Geçmişte ileri seviye Git sunumları yaptı, ancak son yaklaşık 10 yıldır insanların ileri komut satırı özelliklerini zaten bildiğini varsayıyordu
- Yalnızca Git kullanmış geliştirici kuşağının, SVN ve CVS gibi araçlardan Git’e geçme ya da eski kavramları yeniden öğrenme gibi bir deneyimi olmadı
- Git de zaman içinde yeni özellikler öğrendi; bunların çoğu ince veya belirli kullanımlara yönelik değişiklikler olsa da gerçek iş akışında yardımcı olabilir
- Blog serisi, FOSDEM 2024 sunumu little known Git stuff temel alınarak hazırlandı
3 bölüme ayrılan Git ipuçları serisi
- Hedef kitle orta ve ileri seviye Git kullanıcıları; Git’i uzun süredir kullanıyor olsalar bile gözden kaçırmış olabilecekleri özellikleri ele alıyor
- Her şeyi tek yazıda toplamak yerine, birkaç konuyu bölerek 3 kısa yazı halinde sunuyor
- Dahil edilen konular:
- Oldies but Goodies: eski ama hâlâ faydalı Git özellikleri
- Some Subtle New Things: Git’e yakın zamanda eklenen ince değişiklikler
- Really Large Repositories and Monorepos: çok büyük depolar ve monorepo’larla ilgili içerik
- İlk yazı Oldies but Goodies ile devam ediyor
1 yorum
Hacker News yorumları
Mercurial tarafındaki kişilerle de ilginç sohbetler yaptıklarını, son dönemde Hg içlerinin bir kısmını Rust ile yazarak şaşırtıcı hız iyileştirmeleri elde ettiklerini söylüyor.
Pro Git 3. baskı da aklında; Git’i zor yoldan öğrenirken fark ettiğiniz şeyler ya da öğrenmek istediğiniz konular varsa haber vermenizi istiyor.
difftastickullanmak iyi olur: https://difftastic.wilfred.me.uk/Sık kullandığım
gitconfigalias’ları olarakfza,gone,rootvar.git fza, değiştirilmiş/yeni dosyaları birfzfpenceresinde gösterir ve seçilen dosyalarıgit add’e geçirir: https://github.com/junegunn/fzfgit gone, uzakta olmayan yerel branch’leri siler;git rootise depo kökünü yazdırır, derin dizinlerden köke dönmek için kullanışlıdır. Bugünlerdezoxidekullandığım için daha az kullanıyorum: https://github.com/ajeetdsouza/zoxidegit blame’in bozulması engelleniyor.https://git-scm.com/docs/git-blame#Documentation/git-blame.txt---ignore-revltrevgt
Örneğin rebase sırasında yalnızca bir commit’i silmişken, neden sonraki tüm commit’lerin değiştiğini anlayamamıştım. Sonunda depolamanın snapshot tabanlı, işlemlerin ise fark tabanlı olduğunu fark edince rebase’i anlayabildim; eğitim verirken bu kısmı daha fazla vurgulamak da yardımcı olur.
Git’i sevenlere saygı duyuyorum ama benim için sadece kullanmak zorunda olduğum bir araç.
checkout/commit/pushdışında, özellikle geçmişi yeniden yazma gibi birkaç şeyi bilmek commit geçmişinin kalitesini ciddi ölçüde artırır ve projedeki diğer mühendislerin akışı anlamasını kolaylaştırır.Git sektörde uzun süre kalacak bir sabit gibi görünüyor ve günlük geliştirmede en sık dokunduğumuz araçlardan biri; bu yüzden biraz incelemeye değer.
Bu yüzden Git’in belli ölçüde karmaşıklığa sahip olması bence sorun değil.
core.fsmonitorhakkında yeni bir şey öğrendim. Büyük monorepo açısından bakıncagit cloneiçin devam ettirme seçeneği olsaydı iyi olurdu.2000’lerde düşük bant genişlikli bağlantıyla kernel deposunu clone’lamaya çalışırken aynı sorunu yaşamıştım; mailing list’te yardım istedikten sonra ancak biri kişisel sitesine tüm depoyu sıkıştırılmış tar olarak koyunca indirebilmiştim.
Bugün bile şirket VPN’i kısa süreli kopunca büyük depo clone’larında ara sıra aynı sorun oluyor. Windows deposunun 300 GB’ını %95 indirdikten sonra Wi-Fi’nin bir anlığına koptuğunu hayal edin.
Modern geliştirme stack’inde bant genişliğini çok kullanan iki büyük araç olan Git ve Docker’ın indirmeye kaldığı yerden devam etmeyi düzgün desteklememesi garip.
https://git-scm.com/docs/git-bundle
Sistem karmaşıklığını gizleyen düşük seviyeli bir dil istemeye benziyor; ikisi aslında fiilen birbirini dışlıyor. Git tatmin edici ve öğrenmesi o kadar zor değil, bu yüzden işin bir kısmında Git’i öğrenmek gerekiyor.
Terminalde birçok geliştiricinin hissettiği kara kutuyu ortadan kaldırıp grafiği öne çıkarıyor; rebase işlemlerini görsel olarak doğal biçimde gösterdiği için Git’i eğlenceli hale getiriyor.
CLI yetkinliği hâlâ değerli, ama 10 yıllık geliştiricilerin temel sorunları çözerken bocaladığını ya da “gerçek mühendis Git CLI’dan başka bir şey kullanmaz” havası yüzünden proje geçmişini mahvettiğini görmek sinir bozucu.
Bugünlerde CLI kullansanız bile, gün boyu başka bir pencerede grafiğe bakın diyorum. VS Code, JetBrains, hatta CLI’da bile ücretsiz olarak mümkün.
Bir ekip üyesi PR’ı birleştirir birleştirmez bunu görüp kendi dalımı rebase ettiğim için, dal her zaman
maintabanında güncel kalıyor; böylece merge cehennemine düşmüyor ya da berbat “fix conflicts” commit’leri bırakmıyorumDün oluşturulduktan sonra en çok değiştirilen ilk 10 dosyayı ararken https://github.com/tj/git-extras/blob/main/Commands.md adresini keşfettim
Kullanışlı pek çok ek Git komutu var
git-extrasiyi. Bir başka güzel araç da git absorb: https://github.com/tummychow/git-absorbGitKraken gibi modern UI istemcileri gayet kullanılabilir ve yardımcıyken, çoğu geliştiricinin neden özellikle Git CLI’da ısrar ettiğini pek anlayamıyorum: https://www.gitkraken.com/
GUI’ye tamamen karşı değilim ama şu an CLI daha verimli ve şu koşulları sağlayan bir GUI aramaya zaman harcamak istemiyorum:
İyi görünmeli, içine eski usul bir web tarayıcısı gömülmüş bir şey değil yerel bir uygulama olmalı, telemetri olmamalı ya da varsayılan olarak kapalı olmalı, tamamen açık kaynak olmalı ve 5 yıl sonra da ortadan kaybolmayacağını umabilmeliyim
Ayrıca işleri daha da kafa karıştırıcı hâle getirmemeli. Eski şirketimde Visual Studio kullanmak zorundaydım; aslında “çakışma çözüldü olarak işaretle” anlamına gelen bir düğmenin üstünde ürkütücü biçimde “Accept merge” yazıyordu
Belirli bir kelimenin belirli bir anlama geldiğini bekleyen insanları şaşırtmamalı; “Commit changes” düğmesinin yardımseverlik adına uzaktaki depoya push da yapması gibi davranışlara da güvenmek zor
Tek bir commit atmak için başka bir programa geçmem gerekiyorsa sık commit atma isteğim azalıyor
push,pull,checkoutcivarında olduğu için GUI kullanmak fazla geliyorCLI’da Git kullanırken de çoğu şey özel değil, sadece birkaç komut; sık kullanmadığım ipuçlarını ve püf noktalarını bir metin dosyasına yazıyorum
-committerdate’i biliyordum ama varsayılan sıralama olarak ayarlanabildiğini bilmiyordum; çok faydalı. Birkaç notum vargit columns, ekrana sığmayıp kaydırmak gerektiğinde epey kafa karıştırıcı oluyor; sayı olursa iyi olurdugit maintenanceiyi görünüyor ama çok rebase yaptığım için endişeliyim. Gevşek nesnelerigc’den daha hızlı kaybedip kaybetmediğini merak ediyorum.gc’nin kapalı olduğu görülüyor ama net değilgit blameile ilgili, pek bilinmeyen ama yararlı bir betik olarak https://github.com/gnddev/git-blameall var. O kadar az biliniyor ki kendim Python 3’e portlamak zorunda kaldım; üstelik Python geliştiricisi de değilimgcdevre dışı bırakılır.maintenance runaçıkça çalıştırıldığında ise bir görev olarak etkinleşirGevşek nesneleri
gc’den daha hızlı toplamaz. Sonuçta sadece gc çalıştırırgit-blamealliyi görünüyor, bir denemem gerekecekBirden çok ortamda çalışan birkaç alias ile Git akışımı büyük ölçüde basitleştirdim
git synced, mevcut dalı upstream varsa onunla, yoksa origin ile rebase ederek senkronize eder.masterveyamainkullanır vemain’e öncelik verirgit pub, değişiklikleri uzak origin’e yayımlar ve lease’li force push kullanırgit pr, GitHub’da uygun PR URL’sini açar; GH istemcisi gerekmez. Upstream tanımlıysa PR’ı oraya gönderirgit hub, deponun GitHub sayfasını açarhttps://softwaredoug.com/blog/2022/11/09/idiot-proof-git-aliases.html
Ne yaptığımı biliyormuş gibi davranmayı bırakıp görsel Git araçları kullanıyorum. SmartGit ya da IntelliJ’nin içindeki araçlar gibi. Git “komut satırı kahramanlığı” bana daha çok gösteriş gibi geliyor
Kullanıcıya yönelik komut katmanı sinir bozucu derecede kafa karıştırıcı olabiliyor. Örneğin
YoursveTheirs, bağlama göre tamamen zıt anlamlara gelebiliyorTüm kullanıcı arayüzünde ortak bir stil ya da tema yok; insanı delirtmemek için yeni bir görsel katman gerekiyor
Uygulamayı ve genel olarak Git’i işim için gerektiği kadar biliyorum; nadiren daha fazlası gerekirse bakıp öğrenirim. Yıllardır kullanıyorum, böyle durum bir ya da iki kez oldu
Başkalarının ya da kendi hatalarımı düzeltmem gereken karmaşık işlerde de önce görsel araçla geçmişi, commit’leri, reflog’u ve farkları inceleyip neyin karıştığını ve kurtarılabilecek bir şey olup olmadığını anlamaya çalışıyorum
Geri dönecek tek bir commit varsa
reset --hardyapıyorum; birden çok commit’ten bir şeyleri birleştirmem gerekiyorsa genellikle komut satırını kullanıyorumİkisi birbirini dışlamaz. Diff ya da çakışma gibi şeylerde yalnızca görsel araçlar kullanıyorum, ama commit nesnesi, reflog, rebase’in arka planda ne yaptığı, etkileşimli rebase, hard/soft reset vb. şeyleri öğrenirken çok şey kazandım.