jj – Jujutsu için CLI
(steveklabnik.github.io)jj, Jujutsu'nun komut satırı arayüzü olup dağıtık sürüm kontrol sistemi (DVCS) tabanlı bir araçtırgitten daha basit ve sezgisel, aynı zamanda daha güçlü özellikler sunargitile Mercurial'ın avantajlarını birleştirerek çekirdek araç sayısını azaltır ve organik entegrasyonu güçlendirirgituyumlu backend kullanarak mevcut iş birliği ortamını korurken bağımsız denemeler yapmayı mümkün kılar- İleri düzey kullanıcılar için,
gitile zor olan ek sürüm kontrol özelliklerinden yararlanabilmek önemli bir noktadır
jj'ye giriş ve öne çıkan özellikleri
-
jj, Jujutsu'nun CLI'ıdır (komut satırı arayüzü) ve Jujutsu bir dağıtık sürüm kontrol sistemidir (DVCS)- Kullanıcılar
gitgibi başka DVCS'lere aşina olabilir; öğretici degitkullanıcılarının bakış açısını temel alır jj,gitten daha basit, kullanımı daha kolay ama yine de güçlü bir araç olarak tasarlanmıştır- Genelde “güçlülük” ile “karmaşıklık” arasında bir ödünleşim vardır, ancak
jjbu dengeye yeni bir yaklaşım sunar jj,gitile Mercurial'ın (hg) güçlü yanlarını birleştirerek yeni bir DVCS biçimi oluşturur- Çekirdek araç sayısını azaltır ve araçlar arasındaki organik entegrasyon sayesinde verimli bir çalışma ortamı sunar
- İleri düzey kullanıcılar,
gitile zor olan ek sürüm kontrol özelliklerinden yararlanabilir jj,gituyumlu bir backend kullanır; böylece iş birliği ortamını değiştirmeden bağımsız denemeler yapılabilir- Mevcut
gitdepolarıyla uyumluluğu korur ve gerektiğinde kolaycagite geri dönülebilir - Öğretici, bu özellikler üzerinden
jjnin neden dikkat çekici bir araç olduğunu doğrudan gösterme sürecini haber verir
- Kullanıcılar
1 yorum
Hacker News yorumları
Tartışmaların çoğu git ile jj arasındaki farklara odaklanıyor, ama bence git'i unutup doğrudan jj'nin temel iş akışına odaklanmak daha iyi
Temiz bir depoda
jjçalıştırınca durumu görebiliyorsun; değişiklik yaptıktan sonra dajj commit -m "made changes"ile commit atıyorsunHata yaptığında düzeltip
jj squashile son commit'e birleştirebilirsinYalnızca belirli bir revizyondan, sanki yeni bir branch'miş gibi çalışmak istediğinde
jj new -r lmnopkullanman yeterligit geçmişine
git logile bakılabiliyor ve jj'nin iç işleyişi görünmüyoralias.save="!git add -A; git commit -m"gibi bir git alias oluşturup$ git save "made changes"şeklinde kullanıyordumJJ benden sanki ters düşünmemi istiyor gibi geliyor
git'te değişiklikten sonra commit mesajı yazarsın, ama jj'de önce yeni bir commit oluşturup sonra açıklama ekliyorsun
Birden fazla özelliğin karıştığı dağınık bir durumda yalnızca gereken değişiklikleri seçip commit atmaya alışığım, ama sadece jj eğitimine bakınca bunun mümkün olup olmadığından emin olamadım
jj new, boş bir git staging alanı gibi düşünülebilirjj'de her zaman bir commit vardır ve bu commit, klasör içeriğine göre hesaplanan bir değer olarak kararlı bir changeid taşır
Birden fazla değişikliği bölerek commit etmek istiyorsan
jj splitkullanabilirsinjj newile geçici commit'ler oluşturup mesajı boş bırakıyorumSonra hazır olduğumda birkaç commit'i squash edip tek bir commit'te birleştiriyor ve mesaj ekliyorum
Bu yaklaşım bir tür undo geçmişi gibi çalışıyor ve denemeler yapmayı çok daha rahat hale getiriyor
jj new, sadece “üstte yeni bir commit oluştur” demek; yani hemen açıklama yazman gerekmiyorBen de başta bunu alışkanlık haline getirmeye çalıştım ama aslında verimsizdi
Git tarafında da benzer bir iş akışı uzun zamandır öneriliyordu; Squash Workflow ile Git'in index'ine benzer bir akış kurulabiliyor
Bu yüzden birden çok workspace tutuyor ve shelve özelliğini (IntelliJ) sık kullanıyorum
Bazen diff'i geçici olarak saklamak için git patch de kullanıyorum
Tüm bu kaotik süreci ekip arkadaşlarımdan gizleyip biraz daha profesyonel görünmeye çalışıyorum
jj'yi deneyince hoşuma gitmeyen şey, dosya düzenlemelerinin otomatik olarak commit'e yazılması oldu
Eski commit'leri incelemek için checkout yaptıktan sonra dosyayı düzenlersen, o commit değişiyor ve sonraki geçmişin tamamı rebase ediliyor
Bu yüzden kendimi korumak için savunmacı biçimde yeni boş commit'ler açmam gerekiyor
git'te ben açıkça commit edene kadar depo değişmediği için bana daha rahat geliyor
jj evolog'u öğrendikten sonra fikrim değiştijj, staging'den daha iyi bir çözümü zaten sunuyormuş
git CLI'a alışık olmak, ironik şekilde jj öğrenmenin önündeki engeldi
İlginç olan şu ki, jj kullanınca git'in depolama motoru yapısını da daha iyi anlıyorsun
edityerinejj newkullanırsan değişiklikleri temiz biçimde takip edebilirsinBana göre bu, git stash ile cambazlık yapmaktan çok daha iyi
jj edit, jj'nin en büyük tuzağıOnun yerine
jj newkullan; hata yaparsanjj undoile geri alabilirsinjj commit'leri ucuz snapshot'lar gibi ele aldığı için, commit'ten çok “değişiklik”e odaklanmak daha doğru
Otomatik rebase de push'tan sonra değişmez hale gelerek güvenli oluyor
jj newvejj squashkombinasyonuyla bunu git branch head'i gibi yönetebilirsinjj, detached head durumunda çalışmayı kolaylaştırıyor
jj editile checkout ettinBunu
jj newile değiştirirsen sorun çözülürjj hakkındaki son paragraf asıl kilit nokta
Tam uyumlu bir git backend'i kullandığı için, tüm ekibin değiştirmesine gerek kalmadan tek başına deneyebilirsin
Beğenmezsen istediğin zaman git'e dönebilirsin
git işlemleri jj log'una kaydedilmiyor, elle import etmek gerekiyor
Bir projede tek bir arayüz kullanılması tavsiye ediliyor
En sevdiğim özellik açık ara
jj absorbMevcut revizyondaki değişiklikleri otomatik olarak önceki ilgili commit'lere taşıyor
Yapılandırma dosyasında ya da
.gitignoreiçinde bir şeyi değiştirmeyi unuttuğunda çok kullanışlıjj newdeyip değişikliği yapıp sonrajj absorbçalıştırman yeterliÜstelik merge conflict ile uğraşmak zorunda kalmamak en güzel yanı
jj absorbyanlış uygulanırsajj undoile geri alabilirsinBu özellik sayesinde karmaşık rebase'lerden bile korkmuyorum
git absorbvarEğitimi uzun süredir güncelleyemedim ama hâlâ her gün jj kullanıyorum
Startup'ım ersc.io ile meşgul olduğum için upstream katkılarına vakit ayıramadım
Sorusu olan olursa her zaman memnuniyetle yardımcı olurum
jj kararlı change ID kullanıyor, git ise immutable commit ID kullanıyor
Bu yüzden jj'de undo ya da rebase çok daha esnek hissettiriyor
Bazen daha fazla değişiklik görmek istiyorum; bunu tek seferde gösteren bir seçenek olup olmadığını merak ediyorum
jj, git'ten farklı olduğu için denemeye değer
Sadece başka bir yaklaşımı görmek bile mühendislik bakış açını genişletiyor
Her şeyi denemek zorunda değilsin ama farklı iş akışlarının trade-off'larını anlamak önemli
git ile jj arasındaki ilişki bana C ile Python arasındaki ilişkiyi hatırlatıyor
git daha çok adli iz sürme gibi, jj ise hikâyenin bölümleri gibi
Bazen ilk bölümleri yeniden yazmak, sonraki bölümlerin daha doğal akmasını sağlar
jj, “working tree'nin kendisi bir commit'tir” ve “conflict de commit edilebilir” anlayışıyla tasarlanmış
“Daha güçlü ve daha kolay” iddiası için somut örneklere ihtiyaç var gibi geliyor
Böyle bir ihtiyacın yoksa jj'nin değerini hissetmeyebilirsin
Bunu anlamak için bizzat kullanmak gerekiyor
jj undobile tek başına yeterince değerligit'te geri dönüşü olmayan durumlara düşmek kolayken, jj'de birkaç undo ile toparlanabiliyorsun
jj sayesinde doğrusal olmayan DAG yapısını kullanma konusunda kendime güvenim arttı
Birden fazla parent ya da child içeren değişikliklerle rahatça çalışıyorum
Eskiden gereksiz yere sıralama dayatıyordum, şimdi ise bağımlılık ilişkilerini açıkça ifade edebiliyorum
İnceleme ve gönderim süreci de çok daha verimli hale geldi