- Conventional Commits,
<type>[optional scope]: <description> biçimiyle commit mesajına anlam kazandırmaya çalışsa da, değişiklik türünü öne çıkarıp kapsamı isteğe bağlı bırakarak gerçek inceleme için gereken bilgiyi sona iter
- Katkıda bulunanlar, hata ayıklayanlar ve olay müdahale ekipleri commit geçmişinde değişikliğin dokunduğu kod alanını arar; hatalar her tür değişiklikte ortaya çıkabileceği için scope (kapsam), türden daha önemlidir
fix(compiler): prevent namespaced SVG <style> elements from being stripped örneğinde olduğu gibi, yalnızca açıklamadan bunun bir hata düzeltmesi olduğu anlaşılabilir; refactor(core): Update webmcp support to use document.modelContext örneğinde ise tek bir commit düzeltme, refactor ve özellik ekleme arasında kalabilir; bu yüzden type hem tekrarlayıcıdır hem de sınırlayıcıdır
- Otomatik CHANGELOG üretimi ve semantik sürüm artırımı kararı, commit geçmişi ile değişiklik günlüğünün farklı okur kitlelerine hitap etmesi nedeniyle sorunludur; revert işlemleri, kazara geriye dönük uyumluluk kırılması ve bu kırılmanın sonradan giderilmesi yüzünden sonuçlar sapabilir
- Kapsam önekli commit mesajları değişikliğin öznesini önce gösterir; build ve deploy koşullarını da başlıktaki türe göre değil,
git diff ile değişen dosyalara göre belirlemek daha iyidir
Yanlış öncelikler
- Conventional Commits, geliştiricilerin ve son kullanıcıların değişiklikleri anlayabilmesi için commit mesajlarına anlam kazandırmayı amaçlar
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
- Başlık satırı
fix, feat, chore, docs, refactor gibi bir <type>, isteğe bağlı bir scope ve bir description'dan oluşur
- Temel kusur, değişikliğin öznesi olan scope'u değil, değişiklik türü olan type'ı önceleyen yapıdır
- Scope'un isteğe bağlı olması, commit'teki en önemli bilginin eksik kalabilmesine yol açar; type'ın başlığın en başına konması da önceliği tersine çevirir
Scope neden type'dan daha önemlidir
- Katkıda bulunanlar, son katkılarından bu yana nelerin değiştiğini, projenin genel akışını ve pull ya da rebase sırasında devam eden işleriyle çakışabilecek commit'leri bulmak için commit geçmişini okur
- Hata ayıklayanlar, hatanın ortaya çıktığı bileşenle ilgili alanlara dokunan değişiklikleri arar; hatalar her tür değişiklikte çıkabildiği için type bilgisi yardımcı olmaz
- Olay müdahale ekipleri, bir kesinti sırasında commit geçmişini tarayarak soruna yol açan alanı bulmaya çalışır; gelen API hatalarının birden arttığı noktada
auth scope'lu bir commit varsa bu güçlü bir neden adayıdır
- Commit geçmişini okuyanlar için önemli olan, değişikliğin ne tür olduğu değil hangi alana dokunduğudur
Type'ın tekrarlılığı ve sınırlılığı
Otomasyon vaadinin sınırları
- git-cliff veya conventional-changelog gibi araçlarla commit'lerden otomatik CHANGELOG üretme fikrinin temel sorunu, commit geçmişi ile değişiklik günlüğünün farklı okurlara hitap etmesidir
- CHANGELOG son kullanıcıya yöneliktir ve sürümler arasındaki işlevsel ve iş açısından farkları anlamaya odaklanır
- Commit geçmişi geliştiricilere yöneliktir; kod tabanının zaman içinde nasıl değiştiğini ve scope perspektifinden akışı okumaya odaklanır
- Orta ve üzeri karmaşıklıktaki projelerde anlamlı tek bir özellik birden fazla commit ile gelebilir; geliştirici için uygulama süreci faydalıdır ama son kullanıcı için önemli olan yalnızca ortaya çıkan yeni özelliktir
- Revert commit'leri geliştiriciler için commit geçmişinin akışı açısından önemlidir; ama son kullanıcı için geri alınmış bir değişiklik, hiç yapılmamış bir değişiklikle aynıdır
- Commit type'ına dayalı semantik sürüm artırımı; geriye dönük uyumluluğu bozan bir değişiklik geri alınmış olsa bile major sürüm yükseltmek, kırılmanın ancak sonradan fark edilmesi nedeniyle minor/patch yanlış artırımı yapmak ya da sonraki commit'lerle birleşince kırılma ortadan kalksa bile hâlâ kırılma var sanmak gibi sorunlar doğurabilir
- Bu durumlarda rebase ile geçmiş düzeltilebilir; ancak workflow buna izin vermeyebilir veya bunu bozabilir ve commit geçmişinin anlattığı akışa olan güveni azaltır
- Build veya deploy süreçlerini commit başlığındaki type ile tetiklemek,
docs: fix typos başlıklı bir commit'in kimlik doğrulama alt sistemine bir zafiyet sokması gibi yollarla otomatik araçların atlatılmasına neden olabilir
- Build ve deploy koşullarını commit başlığından değil,
git diff ile değişen dosyaları belirleyerek tanımlamak daha iyidir
Uygulama sorunları ve alternatif
- Conventional Commits, proje bazında bir type kümesi tanımlamayı önerir; ancak birçok proje commitlint'in varsayılan type'larını olduğu gibi alır ve bu her projenin özelliklerine iyi uymayabilir
- Conventional Commits spesifikasyonu teknik olarak yalnızca
fix ve feat tanımlar; ek type'ları projeye bırakır
- Kurumsal ortamlarda değişiklik yönetimi ve denetim gereklilikleri nedeniyle her commit mesajına bir bilet numarası eklenmesi gerekebilir;
<scope> alanı bilet numarası için kullanılırsa yararlı metadata kaybolur
- Linux, FreeBSD, Git, Go, NixOS ve Node.js projeye uygun scope önekli commit mesajları kullanır
- Linux çekirdeğinde subsystem, Go projelerinde package path, mikroservis mimarisinde ise mikroservis adı doğal bir scope olur
- scopedcommits.com, commit mesajlarında scope merkezli biçime geri dönmeyi ve CHANGELOG üretimi ile commit geçmişi yönetimini birbirinden ayırmayı savunur
- Conventional Commits'in avantajları pratikte gerçek faydaya dönüşmedi; açık kaynak projelerdeki popülerliği ve yapay zekanın bunu varsayılan tercih olarak seçme eğilimi, anti-pattern içeren commit mesajlarının yayılmasına yol açtı
2 yorum
Hacker News görüşleri
Programcılar sanki her zaman tab mı space mi gibi önemsiz şeylere kadar en iyi ayarın ne olduğu konusunda didişip şikâyet edecek bir şey buluyor
Conventional Commits’in commit mesajlarını düzenlemenin ilahi vahiy gibi en iyi yolu olduğunu söylemiyorum ama belirlenmiş bir yapı olmasının ve commit mesajlarından ne bekleneceğini hizalamanın çok daha etkili ve önemli olduğunu düşünüyorum
Yazar kapsamın türden daha önemli olduğunu güçlü biçimde vurguluyor ama
fix(compiler)ilecompiler fixarasındaki farkın uğruna ölünecek bir mesele olduğunu sanmıyorumTeknoloji sektöründe en iyi olmasa da standart haline gelmiş pek çok şey var; örneğin JSON bugün sıfırdan tasarlansa birçok kişi yorumları, daha açık sayı biçimlerini vb. desteklemesi gerektiğini söylerdi
Yine de kendisinden öncekilerden çeşitli bağlamlarda daha iyi olduğu için standart oldu ve Conventional Commits’ten biraz farklı, daha iyi bir biçim olabilir ama commit mesajı yapısı için bir rakip yaklaşım daha çıkaracak kadar iyi görünmüyor
Commit mesajları gevşek bir yapıda olsa bile değişikliğin niteliğini iyi aktarıyorsa harika olabilir; tersine çok yapısal olup yine de kafa karıştırıcı ya da bilgisiz olabilir
Genel olarak yazara katılıyorum; Conventional Commits kötü commit mesajları gibi temel sorunu çözmüyor
XML yeterince iyi ve bir standart, SOAP da yeterince iyi ve bir standart
Denen şey, Conventional Commits’in yeterince iyi ve yeterince standartlaştığı, bu yüzden başka yapılara bakmaya değmeyeceği; ama bu “değer” öznel
Her gün commit atıyor ve PR okuyorsanız Conventional Commits biçiminin yarattığı küçük sürtünmeler birikebilir; bunu doğa yasası gibi görmeyip seçenek bırakmak, tercih eden ekipler için faydalıdır
Zaten ekiplerin çoğu changelog da üretmiyor
Kapsamın önemli olduğu doğru ama bunun commit içeriğinden çıkarılamayacağını sanmıyorum
Diff incelerken dokunulan yolları görmek önemli bir sanity check’tir ve bir “test” diff’inin production kimlik doğrulama kodunu değiştirmemesi gerekir
Yine de bunu
--onelineiçinde görmek istiyorsanızfeat(auth):banafeat:’ten daha iyi geliyorHedef okurun haksız olduğu iddiasına katılmıyorum
featcommit’i gerçekten ürün açısından değişikliği açıklamalı ve anlamsız refactor değişikliklerini önce düzgünce yığıp ardından üstüne küçük yeni özellik değişikliğini koyacak şekilde düzenlenmeliDiff açıklamasına koymak için en faydalı bilgi de bu; “neden X algoritması seçildi” gibi teknik bağlam ise kaybolmaması için yorumlara ya da
DECISIONS.mdiçine yazılmalıHızlı hareket eden şirketlerde commit geçmişinde böyle sıkıcı işlerle ilgilenenler ancak takıntılı insanlar olabilir ama açık kaynak projelerde bağlamı commit mesajlarında saklamak çok daha önemli bence
Sadece JSON değil de Markdown ve düz metin gibi biçimlerin var olmasının bir nedeni var
Başlığı
small fixolup gerçekte hiç de küçük olmayan çok fazla commit inceledimAsıl sonuç, her projenin gereksinimlerinin farklı olduğudur
30 yılı aşkın süredir kaynak yönetimi kullanıyorum; açıklamaya bileşeni (yazıda scope deniyor) standart bir biçimde eklemenin faydalı olduğu bir durumla bir kez bile karşılaşmadım
Etkilenen dosyaların kaynak ağacında nerede olduğuna bakmak bile hangi bileşenin değiştiğini açıkça gösterir;
bug,fix,featuregibi etiketler de anlamlı bir değer katmazÖnemli olmasaydı zaten check-in yapılmazdı
Bana gerçekten faydalı gelen tek şey, yazıda hiç ele alınmayan ilgili değişiklik talebi bağlantısı veya kimliği
Commit zaten neyin değiştiğine dair bilgiyi içeriyor; eksik olan şey neden değiştiğine dair bağlam
Kişisel projelerde bile açıklamanın başındaki köşeli parantez içine JIRA referansı koyuyorum; geliştirme sırasında tesadüfen düzeltmeye karar verdiğim bir şey olsa bile kısa, tek satırlık bir JIRA açıp bir kimlik alıyor ve gerekçeyi oraya yazıyorum
O mesajın bütün amacı “neden”i yakalamaktır; bir gün ortadan kalkabilecek harici bir kaynağa tek bir bağlantı eklemek bunun iyi bir alternatifi değildir
GitHub issue kullanılıyorsa, commit’ten PR tartışmasına geri dönebilirsiniz; o PR’da da bağlantılı issue ve başka işaretçiler bulunmalıdır
Elbette GitHub issue’ya geçince JIRA’yı neredeyse tamamen bıraktık ve birkaç yıl sonra instance kapatılıp silindi
Artık o JIRA etiketlerinin hepsi işe yaramaz durumda
Bu yüzden aslında issue takip sistemi ile git deposu arasında güçlü bir bağ gerektiğini düşünüyorum
Asıl istenen şey taşınabilirlik ama güçlü bağ olmadan bunun nasıl elde edileceğini bilmiyorum
İdeal olarak açık bir standart biçim olmalıydı; fakat pratikte biçimi tanımlayan dev goril GitHub ve GitLab gibi klonlar GitHub proje metadatasını ya da en azından PR’ları içe aktarabiliyorsa fiilen buna yaklaşılmış olur
Her hâlükârda, 5 yıl sonra belki de kullanılmayacak bir Atlassian ürününe değişmez işaretçiler bırakmayı zorunlu kılan bir politika iyi değil
Bunun yerine, git commit’inin tamamen kendi başına ayakta durması ve değişikliğin “neden”ine dair tüm bilginin commit mesajına ya da kaynak kod yorumlarına yedirilmesi politikasını kabul etmeyi tercih ederim
Yine de bunun da başarısız olduğunu düşünüyorum; insanlar git commit’lerinde fazla kısa yazıyor, issue’ları özetlerken bilgi kaybediyor ve PR tartışmalarındaki gidip gelmeli konuşmalar tek bir kişinin ağzından yapılmış neden özetinden daha fazlasını içerdiği için faydalı oluyor
Yeni özellikleri önce gruplayıp hata düzeltmelerini sonra koymak, teknik olmayan kullanıcılar için biraz daha okunabilir olur
Commit mesajları changelog üretmek için değil, gelecekteki geliştiriciler içindir
O geliştiricinin commit mesajını okuduğu temel an, o commit’in neden var olduğunu anlayamadığı andır
Merak ettiği şey neyin değiştiği değil, belirli bir satırın amacının ne olduğudur
Bu yüzden
blameçalıştırıp commit’e bakar; orijinal geliştirici çoktan şirketten ayrılmış olabilir, eski JIRA da ortadan kalkmış olabilir ve elde kalan tek ipucu commit mesajıdırhttps://dev.to/splix/the-why-behind-the-code-2bb1
Bağlamı commit gövdesine yazmak yetmez mi?
Conventional Commits kullanan birçok kişinin
chorekelimesi hep gözüme batmıştırŞahsen burada da neyse ki anılmış olan Linux kernel tarzı commit başlıklarını tercih ediyorum
[0] https://www.kernel.org/doc/html/v7.0/process/submitting-patc...
chorekelimesinin ima ettiği tutum bana çok itici geliyorSanki geri kalan her şey
funya daindifferentdiye etiketlenmeliymiş gibi hissettiriyor; böyle duygusal yargılar commit mesajına ait değilupkeepAnlamı aynı ama küçümseyici bir tonu yok
Ayrıca commit’in toplam etkisini önceden biliyormuşsun gibi davranıyor; oysa bilmiyorsun
Conventional Commits ortaya çıkınca hem ekip arkadaşları hem de LLM’ler bu aptal adlandırmayı üretmek için zaman ve token harcamak zorunda kalıyor
Conventional Commits hakkındaki temel şikâyetim, commit başlığında issue numarasının yer almamasıydı
Standart belgede bundan isteğe bağlı bir unsur olarak bile söz edilmiyor
Benim için commit mesajındaki neredeyse en önemli bilgi bu
Son 15 yılda, eski bir commit’in referans verdiği issue açıklamasını karşılaştırarak değişikliğin tüm bağlamını çıkardığım kaç kez oldu sayamam
Bunun bir tür standart alışkanlık olduğunu sanıyordum; Conventional Commits’i öğrenince öyle olmadığını fark ettim
Neden bu kadar popüler olduğunu hiç anlayamadım
Ben şahsen issue bilgisini git trailer olarak eklemeyi tercih ediyorum
fix thing in fooIssue: ABC-123Git’te bu tür trailer’ları ayrıştırmak ve biçimlendirmek için birçok yerleşik özellik var; bu yüzden satır içinde görüntülemek ya da CI’da kullanmak üzere ayrıştıran özel
git logtakma adları oluşturmak kolay.Zaten karakter sayısı kısıtlı bir değişiklik günlüğünü tarıyorsam, ana commit mesajında
XYZ-999999olmasına pek önem vermem.Trailer olarak etiketlemek iyi, ama Jira issue numarasından çok commit’in ne yaptığını görmeyi tercih ederim.
Bunu ancak issue anahtarının başlığın en başında zorunlu tutulduğu durumda sorun olarak görürüm.
Bunun da okunabilirlik açısından kötü olduğunu düşünüyorum.
Conventional Commits’in türlü türlü biçiminden sonra bir yere iliştirilince neden olmasın, anlamıyorum.
Issue anahtarı, alfasayısal bir önekten sonra gelen sayı gibi bir regex ile çıkarılabilmeli; dolayısıyla böyle bir “standart”ın ayrı bir alan açmasına neredeyse gerek yok.
Ben şahsen Conventional Commits kullanmadan, ilgili issue ile bağlantılı bir commit ise sonuna parantez içinde ekliyorum.
İlişki daha güçlüyse, mesela issue’yu düzeltiyorsa, mesaja ayrıca
Fixestrailer’ını da koyuyorum.İlginç.
Biz şimdiye kadar
fix(ABC-123): some message heregibi yazıyorduk; hem linkleme düzgün çalışıyor hem de otomatik sürüm notlarında çok iyi render ediliyor.Bu bir standart değil, gelenek.
Ekip içinde bilet ID’sinin commit mesajına dahil edilmesi için bir standart belirlemek yeterli.
Makine tarafından okunabilir olmasını istiyorsanız footer/trailer kullanabilirsiniz.
Conventional Commits hakkında iyi söyleyebileceğim hiçbir şey yok.
Biçim, mesajın en çok okunan kısmında yer kaplıyor ve kategori ya da tiplerin bilgi değeri düşük.
Başlığa dürüst bir İngilizce fiili cümle gibi koymak bunun yerini alabilir;
:,(),!gibi üç tür noktalama işaretindense düz bir cümle çok daha iyi okunur.Başlıktaki “alan”a bir yere kadar katlanabilirim; üstelik bu da bu gelenekten daha eski.
İş yerinde teknik olmayan kullanıcılar için bir web uygulaması yapıyoruz ve bu kullanıcılar için değişiklik günlüğü Norveççe gayet iyi yazılabiliyor.
Commit mesajları kullanıcıları ilgilendirmiyor ve her commit’in son kullanıcıya dönük değişiklik günlüğüne girecek kadar iyi olması gerektiği gibi bir beklenti bizde yakın zamanda olacak bir şey değil.
Onun yerine footer/trailer kullanabilirsiniz.
Conventional Commits’in gerçekten yardımcı olduğu yer sürekli dağıtım.
main’e her merge yapıldığında otomatik olarak SemVer etiketi basıp dağıtım yapabilirsiniz; çünkü etiketleme ve sürüm yönetimi için gereken kararlar, geliştirici commit mesajını yazarken zaten verilmiş olur.Linux kernel gibi devasa projelere uymadığını tamamen kabul ediyorum.
Ama projelerin %99’unda Conventional Commits ile SemVer’i birleştirmek, mevcut sürüm sürecine göre büyük bir iyileştirme sağlar ve otomasyonu kolaylaştırır.
git tags’e dayanan yaklaşımı seviyorum.git describeçoğu zaman sürekli dağıtım sürümlemesi için yeterli oluyor vev1.2.3-4-gabcdef, commit’i git’in tatmin olacağı kadar doğru tarif ederken SemVer’e de benzer bir beklenti oluşturuyor.Özellikle yeni
git tagssadece bir insanın kararıyla ekleniyorsa, örneğin bunun kırıcı bir değişiklik olduğu ve şimdi yeni bir major etiketlenmesi gerektiği gibi durumlarda.git describebiçimindeki sürüm numaralarında asıl tartışma, SemVer beklentilerine daha iyi uyması için ilk tireyi artıya çevirip çevirmemek düzeyinde; paket yöneticisinde sürümlerin doğru sıralanması gibi SemVer beklentilerini zorlamanın bir değeri varsa, bu basit bir regex ile dönüştürülebilir.git describe, CD otomasyonunu kolaylaştırır; ama commit geçmişindeki sihirli anahtar kelimelerden tahmin yürütmek yerine sürüm numarasına karar verme işinigit tagseçimi ya da GitHub Releases üzerinden insana bırakabilirsiniz.İş yerinde ise değişimle ilgilenen hedef kitleye göre “etiketler”i de zorunlu tutuyoruz.
Buradaki etiket git etiketi değil, PR başlığındaki bir string; bu “etiket”e göre de her ekip için değişiklik günlükleri üretiyoruz.
Eğer sürümü böyle tuhaf bir şekilde vermek istiyorsanız, commit gövdesine sihirli bir ifade koyabilirsiniz.
Böylece tek bir kelimeyle de sınırlı kalmazsınız.
Bu başlık tarzından epey nefret ediyorum.
“Stop something” gibi ifadeler çok popüler görünüyor ama buyurgan ve “kesinlikle ben haklıyım” havası veriyor.
Neden “In favour of something” ya da “A case against something” gibi bir şey kullanılmıyor, anlamıyorum.
O görüşe katılmak zorunda değilsiniz ama ifadenin yumuşatılmasını istemek zayıf bir tepki.
considered harmfulkadar kötü değil ama yine de biraz toksik.Esas mesele, A ile B’nin sırasını değiştirmek istemek gibi keyfi bir kişisel tercihi, olduğundan daha büyük bir mesele gibi göstermeye çalışıyor olması gibi duruyor.
Birçok kişiye kaba gelse de dikkat ekonomisi bu tür şeyleri ödüllendiriyor.
Düzenleme: Görünüşe göre başlığı daha az kışkırtıcı olacak şekilde değiştirmişler.
İyi yapmışlar.
Conventional Commits’i pek sevmiyorum ama insanların istediklerini kullanmasına izin vermek lazım.
Bu tür başlıkların bir kısmını etkilemiş bir meme var.
Garip
Bu tarz commit mesajlarını kullanmanın başlıca nedeni CI/CD otomasyonudur
Düzeltme: İlk okuyuşumda yazıda bu kısmı görmemişim, ele alınmış
Kusura bakmayın
Commit türleri, otomatik iş akışlarına bir commit’in nasıl işleneceğini söylediği için en başta yer alır
Örneğin CD yapıyorsanız, yalnızca birkaç
fix:commit’i olduğunda semantik sürümlemede sadece yama numarası artarfeat:commit’i yaparsanız minör sürüm yükselir,feat!ise majör sürüm artışı demektirSürümler için CD kullanmıyor olsanız bile, semantik commit mesajları bazen değişiklik günlüğü üretimini otomatikleştirmek için de kullanılır
Elbette değişiklik günlüğüne genelde Git commit mesajlarının kendisini koymamalısınız
O mesajlar kullanıcılar için değil, geliştiriciler içindir
semantik sürümleme geri alma işlemlerinde bozuluyor ve otomatik değişiklik günlüğünde hedef kitle yanlış
Bugünlerde SemVer yerine CalVer kullandığım için benim için sorun olmuyor ama akıllı otomatik sürüm artışı fikri hoşuma gidiyor
Commit başlığında
fixya dafeatolması, log’u tarayan birine faydalı bilgi vermiyorMesele, yapay zekanın commit üretmesini kolaylaştırmak için Conventional Commits’i kaldırmamız gerektiği ya
Sıralamayı tersine çevirirseniz asıl can sıkıntım gerçekten çözülmüş olur
Sonuçta özellik tam olarak nedir?
refactor(core): Update webmcp support to use document.modelContextYazarın dediği gibi düzeltme, iyileştirme ve genel temizlik arasındaki sınırlar bulanıktır; ayrıca her anlamlı değişikliği ayrı commit’lere bölmek, zaten sonradan squash edilebileceği için kimseye fayda sağlamayan ek iş çıkarır
Conventional Commits’in, başka sorunları doğrudan çözmekten çok SemVer otomasyonu denemesinin bir yan ürünü olduğunu düşünüyorum
Değişiklik günlüklerinin zaten otomatikleştirilmemesi gerektiğini düşünüyorum
Bir liste gerekiyorsa
git loga bakılırDeğişiklik günlüğü, daha geniş bir kitleye içeride gerçekte neler olduğunu aktarmak için bir fırsattır
“Değişiklik günlüğünün okuru ile commit günlüğünün okuru tamamen farklıdır”
“Değişiklik günlüğü kullanıcıya yöneliktir”
Sanırım o gemi çoktan kalktı
Çoğu şirket “Bug Fixes & Performance Improvements” ile yetiniyor
En azından emek harcanmayacaksa, üretilmiş bir değişiklik günlüğü hiç olmamasından iyidir
uv:koymaktıSonra her hafta bunları arayıp metni aynen kullanıyor ya da biraz düzenliyordum
Bunları ürünün kendi Help/Release-notes menüsüne de koyuyordum
Benim yapmadığım, hatta adını bile duymadığım bir şeyi yapmayı bırakmamın söylenmesi biraz komik
Normalde yalnızca veritabanı şeması migration’ları ya da başka önemli şeyler için özel önekler kullanırım
Galiba commit’lere de iyi ad veremiyor; muhtemelen sembol adlarını da iyi veremiyordur
Bu bir yetkinlik meselesi ve bunu kamuya açık şekilde dert ettiği için geçip gidebilirsiniz
Lobste.rs görüşleri
conventional commits hakkında içgüdüsel bir iticilikten ziyade mantıklı bir karşı argüman sunan bir yazı görmek güzel
Neden sevmediğimi çok derin düşünmemiştim; belki de bunu LLM’in ürettiği kodla ilişkilendirmeye başlamışımdır. Özellikle
chore:en sevmediğim şey; keşke Macar gösterimini yeniden icat etmeye kalkmasak. Zaten en başta hiç var olmamalıydıchore:, artık Angular commit stil kılavuzunda da yok; sanırım fazla muğlak olduğunu fark edipbuild:içine çektilerAngular stilinde olduğu dönemde bile
chore:açıklaması oldukça belirli kullanım alanları tarif ediyordu, ama bazı açık kaynak projelerde kelimenin tam anlamıyla yapması can sıkıcı işler gibi hissedilen değişikliklere havadan ekleniyor gibi duruyorconventional commits’i sevmiyorum ama önerilen alternatif de scope’un neden isteğe bağlı olduğunu kaçırıyor gibi
Belirgin modülleri çok olmayan küçük projelerde “scope” kavramı pek kullanışlı değil. İkisinin de atladığı faydalı bir pratik olarak, commit başlığına issue ya da bilet numarası koymak değişikliğin ek bağlamını anlamayı kolaylaştırıyor ve özellikle code review sırasında yardımcı oluyor. Ama bilet numarasını zorunlu yapmak da hoşuma gitmiyor; çünkü ufak değişiklikler için işe yaramaz biletler üretiliyor. Yine de belirli bir bug ya da işi ele alan bir değişiklik, ilgili bug’a ya da işe bağlanmalı
Sadece başlık satırına bakınca bile görülebilen, gereksiz yere tekrar eden commit “type”ından yine de daha iyi
Değişiklik bir biletle net biçimde eşleşiyorsa “bilet numaralı” commit kullanılabilir, değilse başka bir yol seçilebilir. Bazı değişiklikler type’a daha iyi uyar ama scope’a daha az uyar, bazılarında da tersi geçerlidir; bu yüzden scoped commits ile conventional commits karıştırılarak da kullanılabilir
“Paragraf metninde sabit genişlikli yazı tipi kullanmayın” demek istiyorum
Yine de yazının temel önermesine büyük ölçüde katılıyorum
Commit mesajları pek iyi olmasa bile değişiklik kapsamını anlamak için sık sık
git log --name-onlyya dagit log --statkullanmayı öneririmDosya adlarına bakmak, her commit’i tek tek açmadan neyin değiştiğini anlamada epey yardımcı oluyor
Gerçekten hoşuma giden yöntem, PR başlıklarında conventional commit stilini zorunlu kılmak
PR başlıkları merge sonrasında da maintainer tarafından düzenlenebilir, commit geçmişini yeniden yazmayı gerektirmez ve release-drafter gibi araçlarla birlikte kullanıldığında GitHub release’lerinde anlamlı değişiklik günlüklerini otomatikleştirebilir. Yazarın sözünü ettiği paydaşlara uygun doğru ayrıntı düzeyini sağlar; yani özellikleri, düzeltmeleri ve breaking change’leri ayırarak gösterir ve bir sonraki GitHub release taslağı için makul bir semver artışını da otomatik işler
Yazıda,
parse-libgibi bir bileşenin isteğe bağlı olmaması gerektiği yönündeki eleştiri doğru; ayrıca conventional commits’i zorunlu kılmanın yeni katkıları caydırabileceğine de katılıyorum. Ama alternatifler de pek daha iyi görünmüyorYine de breaking change belirteci olan
fix!(parse-lib): Don't leave sparse holes when parsing JSON arraysoldukça fazla bilgi veriyor. Belirli bir bileşendeki bir bug düzeltmesi olduğunu, bu düzeltmenin kaçınılmaz olarak bir breaking change getirdiğini ve minor semver artışı gibi bir anlam taşıdığını anlatıyor. Bu tür şeyler PR başlığında kullanılabilirCommit disiplini teşvik etmenin yolu olarak conventional commits’e fazla kapıldığımı ve sonunda bunun alışkanlığa dönüştüğünü kabul ediyorum
Şimdi ise zaman zaman kısıtlayıcı ve keyfi geliyor. Bazı projelerde bunun gerçekten yerleşik pratik olup olmadığını bile bilmiyordum ve daha çok Linux/Go/Node stiline yaklaştım; çeşitli yapılandırmaları olan monorepo’larda da type’ı zorlamaktansa
[service]: [what changed]yazmak daha doğal geliyordu. Bundan sonra katı kurallara uymaya çalışmaktansa neyin faydalı göründüğüne göre kişisel commit stilimde daha fazla deneme yapmayı düşünüyorum; scoped commits de iyi bir başlangıç noktası gibi duruyorchore(lobsters): add my 2 cents on conventionals commits [JIRA-69420]Neredeyse her şeye katılıyorum ama “commit log’un anlattığı hikâyenin güvenilirliğini düşüren revizyonist bir kayıt anlayışını katkıda bulunanlara göstermek” kısmında bir noktada ayrılıyorum. Yazar galiba daha çok public branch’lerden bahsediyor; öyleyse bu makul bir tavsiye. Ama private branch’ler için geçerli olmamalı. Son değişiklikleri inceleyecek kişi, yani maintainer ya da 10 yıl sonraki ben, ne olduğunu rahat anlayabilsin yeter; tutarsız düşünce akışını ya da daha kötüsü
address reviewcommit yığınlarını bırakmaya gerek yok“Neden scope isteğe bağlı?” sorusunun cevabı, küçük projelerde aslında tüm projenin scope olması
Commit’in “type”ının çok faydalı olmadığına katılıyorum ama scoped commits ile conventional commits arasında da büyük bir fark olup olmadığından emin değilim. Scoped, sadece “type” kısmı çıkarılmış bir conventional gibi; yine de fix, feat, refactor, chore ayrımı yapılmasında bir sorun görmüyorum
Herkes commitlint’in varsayılanlarını aynen alıyorsa, belki de mesele insanların onu daha iyi kullanmasını sağlamak değil midir?