व्यस्त डेवलपर्स के लिए Jujutsu
(maddie.wtf)- Jujutsu(jj) Git की तुलना में अधिक सरल कॉन्सेप्ट और कमांड देने वाला, लेकिन शक्तिशाली version control system है
- यह Git को backend के रूप में इस्तेमाल करता है, इसलिए इसे साथ-साथ इस्तेमाल करना या आसानी से Git पर वापस लौटना संभव है
- stacked diff, आसान rebase, अस्थायी revision जैसी सुविधाएँ स्वाभाविक रूप से मिलती हैं
- यह branch के बजाय bookmarks कॉन्सेप्ट का उपयोग करता है, जो वास्तविक कार्यप्रवाह में अधिक सहज है
- conflict हैंडलिंग का तरीका लचीला है और रोज़मर्रा के version control कामों को काफी सरल बना देता है
Elevator Pitch
Jujutsu(jj) एक version control system है जो Git की तुलना में कहीं अधिक सरल mental model और command-line interface देता है।
बिना सुविधाओं की बलि दिए, वास्तव में इसे और भी अधिक शक्तिशाली कहा जा सकता है
stacked diff, आसान rebase, और अस्थायी revision जैसी सुविधाएँ स्वाभाविक रूप से काम करती हैं
क्योंकि यह backend में Git का उपयोग करता है, आप सिर्फ एक पंक्ति में Git repository के साथ-साथ इसका उपयोग शुरू कर सकते हैं और कभी भी Git पर लौट सकते हैं
इससे repository को संभालने के दूसरे उपयोगकर्ताओं के तरीके पर भी कोई असर नहीं पड़ता
Getting Started
jjcommand-line tool इंस्टॉल करने के बाद, user information और shell autocompletion सेट करने की सलाह दी जाती है- मौजूदा repository पर लागू करते समय, नई clone बनाना या बिना किसी बदलाव वाली स्थिति में शुरू करना बेहतर है
- मौजूदा repository में
jj git init --colocate .कमांड से Git और Jujutsu repository को साथ-साथ बनाया जा सकता है jjrepository data, Git की.gitसे अलग.jj/फ़ोल्डर में रखा जाता है- Git और Jujutsu के बीच data synchronization सामान्यतः बिना समस्या के चलता है
- लेकिन
git clean -fdxकमांड.jj/फ़ोल्डर को हटा देता है, इसलिए सावधानी ज़रूरी है - remote branch tracking भी उसी कमांड से एक बार में सेट किया जा सकता है
How To Use It
Jujutsu का command-line interface Git की तुलना में अधिक सीमित और संक्षिप्त है
मूल कॉन्सेप्ट सरल हैं, लेकिन workflow में थोड़ी आदत डालनी पड़ सकती है
सरल प्रक्रियाओं और उदाहरणों के साथ इसके मुख्य उपयोग समझाए गए हैं
Starting A New Revision
- Git में नया काम आम तौर पर branch बनाकर शुरू होता है, लेकिन Jujutsu में नया revision बनाया जाता है
- नवीनतम remote repository स्थिति लाने के लिए:
jj git fetch - repository history देखने के लिए:
jj log - history में revision, अलग-अलग Jujutsu revision ID और Git commit hash से पहचाने जाते हैं
- नया काम शुरू करने के लिए
jj new mainसे वर्तमान main के ऊपर नया revision बनाया जाता है - वर्तमान में edit हो रहा revision
@चिन्ह से पहचाना जाता है - जब समान prefix हट जाता है, तो revision ID का छोटा prefix भी उसी के अनुसार बदल जाता है
Making Changes
- फ़ाइलों में बदलाव करते ही वे तुरंत उसी revision में शामिल हो जाते हैं (अलग staging area नहीं होता)
- बदलाव पूरा होने पर
jj describe -m "संदेश"से revision में message जोड़ें - नया revision बनाने के लिए
jj new(या पिछला revision निर्दिष्ट करें) jj commit,jj describe+jj newका संयुक्त operation है
Navigating
jj newसे बना खाली revision, कहीं और जाने पर अपने-आप हटा दिया जाता है- किसी revision को स्पष्ट रूप से हटाने के लिए:
jj abandon <rev ID> - हटाना वापस लेने के लिए:
jj op undo - किसी मौजूदा revision पर वापस जाने के लिए
jj edit <rev ID> - revision reference देते समय revset expressions भी इस्तेमाल किए जा सकते हैं:
@: वर्तमान revisionx-: parent revisiony+: child revisionz::: z के सभी descendant
Branches (Bookmarks)
- Jujutsu में Git की तरह "किसी branch पर टिके रहने" की स्थिति नहीं होती
- इसके बजाय bookmark सिर्फ एक pointer है जो किसी खास revision की ओर इशारा करता है
- नया bookmark बनाने के लिए:
jj bookmark create <नाम> -r <revision> - commit करने पर bookmark अपने-आप नहीं खिसकता, इसलिए ज़रूरत होने पर
jj bookmark move <नाम> --to <revision>से अलग से ले जाना पड़ता है - push करते समय
--allow-newफ़्लैग से remote पर नया branch बनाना स्वीकार किया जाता है - अगर bookmark remote से अलग हो, तो वह
*से दिखता है औरjj git pushसे sync किया जा सकता है
Conflicts
- Jujutsu का conflict संभालने का तरीका Git की तुलना में अधिक लचीला है
- conflict होने पर revision और उसके descendant revisions पर ‘conflicted’ निशान दिखता है
- conflict वाली फ़ाइलों में conflict markers डाले जाते हैं, और उन्हें हटाकर समाधान किया जाता है
- सीधे संपादन करके या नए revision में बदलाव के बाद
jj squashसे मिलाया जा सकता है
निष्कर्ष
अब तक Git में सबसे अधिक उपयोग होने वाले 80% कामों को Jujutsu से और सरल तरीके से करने का परिचय दिया गया
आगे चलकर सामान्य और उन्नत उपयोग के लिए इसे reference handbook (Quick Reference) के रूप में उपलब्ध कराया जाएगा
Git की तरह jj status कमांड भी समर्थित है
प्रश्न या फ़ीडबैक के लिए मुख्य लेख में दिए गए ईमेल का उपयोग किया जा सकता है
1 टिप्पणियां
Hacker News की राय
जो लोग सोच रहे हैं कि
jjसीखना ठीक रहेगा या नहीं, उनके लिए मैं एक बात ज़रूर कहना चाहूँगाHacker News पर
jjकी बात करो तो लोग आम तौर पर दो तरह के मिलते हैं: जिन्होंने अभी तक इसे आज़माया नहीं है, और जो इसे बहुत ज़ोर से recommend करते हैंमैंने लगभग कभी नहीं देखा कि कोई एक हफ्ते तक
jjइस्तेमाल करके फिरgitपर लौट गया होजिन लोगों ने इसे सच में गंभीरता से इस्तेमाल किया, वे लगभग सभी
jjपर टिक गएउम्मीद है आज ही वह दिन हो जब आप
jjको आज़माएँजितना लगता है उससे कहीं आसान transition है; मैं उसी दिन productive था, और एक हफ्ते के भीतर मुझे
gitcommands पर लौटने की बिल्कुल ज़रूरत नहीं पड़ीमैं बहुत कम समय में ज़्यादा productive हो गया, और अब हैरानी होती है कि पहले मैं
gitकैसे इस्तेमाल करता थामुझे
gitproductivity के हिसाब से बिल्कुल भी परेशान नहीं करतामैं हर दिन लंबे समय तक
gitcommands इस्तेमाल नहीं करता, और ज़्यादातर मामलों में इससे काम में कोई दिक्कत नहीं होतीअगर आपको repo को
gitसे बहुत ज़्यादा manipulate करना पड़ता है, तोjjबेहतर हो सकता है, लेकिन मेरी स्थिति ऐसी नहीं हैयह कुछ वैसा है जैसे कोई आपसे कहे कि
vimजैसा ही लेकिन कुछ extra features वालाbimज़रूर इस्तेमाल करोलेकिन मुझे कुछ बार और
iदबाने की परवाह नहीं है, और न हीjuliaautocomplete की ज़रूरत हैजिन लोगों के लिए
jjबेहतर है, वे आनंद लेंVCS UI के तौर पर
jjनिश्चित रूप से प्रगति है, लेकिनgitpower users के लिए इसकी कुछ सीमाएँ हैंgitattributessupport न होने की वजह से अगर आपकोgit-crypt,git-lfsजैसे filters चाहिए हों तो असुविधा होगीline ending handling जैसी चीज़ों के कारण Windows पर compatibility भी कमज़ोर हो सकती है
और
git-annex,git-bugजैसे external tools भीoplogके साथ integrate नहीं होते, और history को बिखरा हुआ बना सकते हैंमैंने सचमुच एक हफ्ते से ज़्यादा इस्तेमाल करके फिर
gitपर वापसी की हैमुझे व्यक्तिगत रूप से staging area वाला workflow ज़्यादा पसंद है; ज़्यादातर लोग
gitstaging से नफरत करते हैं, लेकिन मेरे लिए यह ऐसा लाभ नहीं था कि मैं उसेjjमें छोड़ दूँआदतें बदली जा सकती हैं, लेकिन अभी मैं
jjसे बंधा हुआ नहीं हूँभविष्य में इसे फिर से आज़माने के लिए तैयार हूँ
मैंने कुछ महीनों तक
jjइस्तेमाल किया और फिर performance issues की वजह सेgitपर लौट गयाjjoperations में कई सेकंड लगते थे, जबकिgitproject के आकार से परे तुरंत response देता थाइसके अलावा
jjइस्तेमाल करते समय मुझे थोड़ा ज़्यादा मानसिक बोझ महसूस होता था, औरgitपर लौटने के बाद सब कुछ हल्का लगाहो सकता है यह सिर्फ मेरे लंबे
gitअनुभव की वजह से हो“आख़िरकार लोग बस दो ही तरह के होते हैं” जैसा कहना अपने-आप में
jjप्रचारकों की एक stereotypical line लगती हैjjकी जो बात मुझे पागल कर देती है, वह यह है कि changes हमेशा अपने-आप staged हो जाते हैंपुराने समय में
SVNका ढाँचा ऐसा था, और मुझे लगा किgitने explicit staging लाकर इसमें बहुत सुधार कियाrepo में हमेशा commit से ज़्यादा changes पड़े रहते हैं, और अगली commit में सिर्फ वही चुनना जिन्हें आप शामिल करना चाहते हैं, यह
gitमें सामान्य बात हैलेकिन
jj(SVNसहित) में commit से पहले changes को अस्थायी रूप से बाहर निकालने जैसे झंझट वाले manual steps करने पड़ते हैंयह issue मेरे लिए भी दुविधा है
staging हमेशा मुझे झंझट लगता था, इसलिए
Mercurialइस्तेमाल करते समय भी मुश्किल होती थीजब 90% से ज़्यादा मामलों में auto add चाहिए होता है, तब यह उल्टा सुविधाजनक भी है, लेकिन समस्या उन files की है जिन्हें
.gitignoreमें नहीं डाल सकतेauto add बंद करो तो भी असुविधा है, चालू रखो तो भी कुछ खटकता है
दोनों में से कोई भी पूरी तरह साफ़ समाधान नहीं है
JJका workflow थोड़ा अलग है; उदाहरण के लिए आप पहले base commit बनाते हैं, और उसके ऊपर anonymous commits stack करके काम करते हैंतैयार होने पर
jj squashयाjj splitसे उन्हें व्यवस्थित कर लेते हैंमैं
jj commit -i, कई commands के-ioption, और config मेंsnapshot.auto-track="none()"इस्तेमाल करता हूँMercurialइस्तेमाल करते समय भी मैं कुछ ऐसा ही करता थाअसल में अगर आप absorb feature काफ़ी इस्तेमाल करते हैं, तो अनचाही files या chunks अपने-आप नज़रअंदाज़ हो जाते हैं
क्या
jj newcommand वही workflow नहीं देती जो आप चाहते हैं?jjtree में non-head branches को भी ठीक से track करता है, इसलिए rebase और merge बिना stash की ज़रूरत के smoothly काम करते हैंauto-added changes की आदत डालना आसान नहीं है
कभी-कभी local में कोई खास file सिर्फ development के दौरान थोड़ी देर के लिए बदलनी होती है, commit करने का इरादा नहीं होता
gitमें जब तक उसे stage न करो, वह कभी commit/push नहीं होगी, इसलिए भरोसा रहता हैलेकिन
jjमें लगता है जैसे कुछ unstage करना पड़ेगा या ज़्यादा सावधान रहना होगायह शायद आदत का मामला हो, लेकिन मैं स्पष्ट रूप से वही चुनना पसंद करता हूँ जिसे मैं commit करना चाहता हूँ
सोच रहा हूँ कि कहीं मैंने
jjको गलत समझ तो नहीं लियाjjमें आपjj splitसे changes अलग कर सकते हैंजो आप चुनते हैं वह पहली revision में चला जाता है, और बाकी दूसरी revision में व्यवस्थित हो जाता है
जब आप कई काम एक साथ करते हैं और उन्हें छोटे-छोटे revisions में बाँटते हैं, तब यह
gitसे कहीं आसान लगता हैgitकी तरह नई revision (jj new) बनाकर changes करो, फिरjj squash -iसे सिर्फ वही हिस्सा ले जाओ जो चाहिएconceptually,
@current revision है और@-एक कदम पहले वाली, इसलिए इसेgitकी working copy/stage जैसा समझ सकते हैंjjकी auto staging हमेशा अच्छी चीज़ नहीं हैअच्छा होता अगर
jjdocs और beginners, दोनों यह और साफ़ बताते कि default behavior को आसानी से बंद किया जा सकता है~/.jjconfigमें[snapshot]
auto-track = "none()"
ऐसे लिख दें
मैं आम तौर पर काम के बाद
jj splitसे review करके commit करने लायक हिस्से अलग करता हूँयह workflow
gitकेadd -pजैसा ही महसूस होता हैऊपर वाला commit अक्सर उस working copy की तरह इस्तेमाल किया जा सकता है जिसे push नहीं करना है
branch बदलते समय भी बिना stash के in-progress changes सुरक्षित रहते हैं
हाँ, वह आदत मेरे लिए भी आसानी से नहीं बदली
इसे बदलने के पक्ष में तर्क यह है कि code को untracked state में चलाना नहीं चाहिए
अर्थपूर्ण changes को commits में रखना और बाकी को record न करना ज़्यादा सुरक्षित है
समस्या तब आती है जब पूरे repo की settings और local settings अलग नहीं रखी जा सकतीं;
VSCodeइसका प्रमुख उदाहरण हैऐसे मामलों में environment-specific ऐसे changes चाहिए होते हैं जिन्हें commit नहीं करना चाहिए, और चीज़ें और जटिल हो जाती हैं
अगर आपको ऐसा workflow चाहिए, तो
jjमें@कोgit indexकी तरह मान सकते हैं, और commit के समय@-में squash करकेgit add --patchजैसा प्रभाव पा सकते हैंमैं टीम को
jjपर लाने की कोशिश कर रहा हूँ, लेकिन अभी सफल नहीं हो पायाअच्छा होता अगर कोई ऐसा पेज होता जो एक नज़र में दिखा दे कि
gitके जटिल कामjjमें कितने आसान हो जाते हैंकुछ elevator pitch जैसा, बहुत संक्षेप में
अब लग रहा है कि मुझे खुद demo देकर दिखाना पड़ेगा
मुझे नहीं लगता कि
gitमें लोग जो आम काम करते हैं, वेjujutsuमें अनिवार्य रूप से आसान हो जाते हैंबल्कि
jujutsuमें कुछ ऐसे नए workflows हैं जोgitमें या तो असंभव हैं या बहुत झंझट वालेजो developers पहले से
gitके आदी हैं, उनके लिए यह बात शायद तुरंत प्रभावशाली न लगेमैं खुद भी
gitका विशेष प्रशंसक नहीं हूँपहले मैं सिर्फ
mercurialइस्तेमाल करता था, लेकिन अबgitमेरे दिमाग में बैठ चुका हैभले ही
Jujutsuमें कुछ ठोस फायदे हों, लेकिन अभी उसमें उतना आकर्षण नहीं दिखता कि मैं initial setup तक की झंझट उठाऊँ, जैसे जटिल color settings या अपने परिचित scripts सेट करनाjjऔरgitके बीच एक प्रतिनिधि task comparison ने मेरी समझ में बहुत मदद कीhttps://lottia.net/notes/0013-git-jujutsu-miniature.html
कुछ अच्छे links भी सुझाता हूँ जो मददगार हो सकते हैं
https://v5.chriskrycho.com/essays/jj-init/
https://v5.chriskrycho.com/journal/jujutsu-megamerges-and-jj-absorb/
https://ofcr.se/jujutsu-merge-workflow
मुझे लगता है कि इस post में जो अगली चीज़ मैं जोड़ने वाला हूँ, वह आपको पसंद आएगी
जल्द ही उसे पेज के नीचे और एक अलग post के रूप में डालूँगा
कुछ हफ्तों तक
jjइस्तेमाल करने के बाद मैंने auto commit message script भी बनाईआज मैं वही script एक पुराने
gitrepo पर port करने की कोशिश कर रहा था, तभी एहसास हुआ किgitमें commit/ammend के सही समय को अपने-आप पहचानने वाला code लिखना पड़ेगाjjमें immutable commit structure की वजह से script बहुत सरल थीमैंने बस repo को
jjसे फिर से clone कर लियाcommit और amend के बीच के भ्रम से मैं तुरंत मुक्त हो गया
https://codeberg.org/jcdickinson/nix/src/branch/main/home/common/scripts/jj-auto.fish
gitrepo मेंjjसाथ-साथ इस्तेमाल कर सकते हैंgitकाफ़ी अच्छी तरह काम करता हैथोड़ा learning curve है, लेकिन एक बार समझ में आ जाए तो सब समझ आता है
ईमानदारी से कहूँ तो 95% स्थितियों में सिर्फ
pull,add,reset,branch,commitजानना ही काफी हैमेरे workflow में stacked diff अनिवार्य है
यह review के इंतज़ार में रुके बिना आगे के काम को भी stack करने देता है
gitमें setup मुश्किल नहीं है, लेकिन stack के निचले हिस्से में changes जोड़ना और फिर सब कुछ restack करना सचमुच नर्क हैcollaboration वाले मामलों में
rebase/squashकी समझ ज़रूरी हैजब तक आप पूरी टीम को यह न मनवा लें कि वे इन्हें न इस्तेमाल करें, तब तक इससे बचा नहीं जा सकता
खासकर जब कई लोग एक branch पर जल्दी-जल्दी development कर रहे हों, तब
gitकी आदतें असुविधाजनक लगने लगती हैंमूल रूप से यह सुविधाजनक है, लेकिन जटिल परिस्थितियों में समस्याएँ बहुत हैं
बस थोड़ा-सा uncommon scenario भी देख लो,
gitकी कमियाँ दिखने लगती हैंjjइस्तेमाल किए मुझे लगभग 2 हफ्ते हुए हैं, और पहली बार मैं सिर्फ command line से version control आराम से चला पा रहा हूँgitइस्तेमाल करते समय मैं हमेशा GUI (Git GraphinVSCode) में right-click ज़्यादा करता थालेकिन
jjमें सिर्फ tutorial पढ़कर भी मैं तुरंत एक consistent command-line workflow में आ गयाहाँ,
jjlog में IDs बार-बार copy-paste करने से बचना है तो शायदrevsetlanguage सीखनी पड़ेगीमेरी भी स्थिति कुछ ऐसी ही है
मैंने
gitलंबे समय तक इस्तेमाल किया, लेकिन जटिल चीज़ें हमेशा UI से ही संभालींलगभग एक महीने से सिर्फ
jjCLI इस्तेमाल कर रहा हूँ और काफ़ी संतुष्ट हूँलेकिन
jjकी official docs इस मानकर लिखी गई लगती हैं कि आपको पहले से basic knowledge है, इसलिए beginners के लिए कभी-कभी उलझन होती हैउम्मीद है कि और blogs और tutorials आएँगे
मैं भी
revsetlanguage औरrebaseको थोड़ा और सीखना चाहता हूँसरल CLI, conflict resolution, और
oplog—तीनों मुझे पसंद हैंमुझे भी ID copy-paste करना असुविधाजनक लगता था, लेकिन
jjui(https://github.com/idursun/jjui) इस्तेमाल करने के बाद सब बहुत smooth हो गयाअब मैं लगभग log को skim करते हुए तेज़ी से काम कर लेता हूँ
मेरे हिसाब से
jjकी सबसे बेहतरीन featureundoहैgitमें undo करना गलती के प्रकार के हिसाब से अलग-अलग command माँगता है, इसलिए कठिन लगता हैjjमें बस एक बारjj undoकाफ़ी हैयह backend system से बँधा भी नहीं है, इसलिए आप local में अकेले
jjइस्तेमाल करें तो teammates पर कोई असर नहीं पड़तामुझे समझ नहीं आ रहा कि
jjआखिर है क्याक्या यह उन लोगों के लिए frontend है जिन्हें
gitconfusing लगता है?कहा जाता है कि यह backend abstraction देता है, लेकिन
gitका असर इसमें इतना ज़्यादा दिखता है किPerforce,Piperजैसे उन systems में इसकी कल्पना करना मुश्किल है जहाँ sequential numbered commits लागू होते हैंworking copy = commit वाली design मुझे quality control के खिलाफ लगती है
commit का मूल मतलब यही है कि सिर्फ वही चीज़ें ऊपर जाएँ जो जानबूझकर चुनी गई हों, लेकिन ऐसी संरचना में “garbage commits” को अलग करना और मुश्किल हो जाता है
gitऔरjjदोनों ही बड़े projects के सामने कमज़ोर लगते हैं, और commit फैलाव को रोक न पाना भी जैसे बना हुआ हैमैं समझना चाहता हूँ कि
jjवास्तव में कौन-सी समस्या हल करता है; कहीं यह सिर्फ author की पसंद का frontend तो नहींPiperbackend तो वास्तव मेंGitbackend से भी ज़्यादा natural लगता हैjjcommits,gitcommits से one-to-one पूरी तरह मेल नहीं खाते, इसलिए इसे लेकर गलतफहमी की ज़रूरत नहीं हैअसल में “commit” को “named diff” की तरह समझना बेहतर है, और push से पहले changes को कभी भी आसानी से दोबारा गढ़कर व्यवस्थित किया जा सकता है
यह
gitमें rebase या history editing से कहीं आसान हैमैं बीच काम में experiment, docs वगैरह के कई commits बना लेता हूँ, जिन्हें
gitमें शायद stash या किसी temporary branch में ठूँसना पड़ताjjसिर्फgitfrontend से बढ़कर हैयह एक version control system है, और backend-agnostic है
इसका सबसे प्रमुख backend
gitहै, इसलिए मौजूदा repo में तुरंत switch किया जा सकता हैमैं
githubआने से पहले सेgitइस्तेमाल कर रहा हूँ, लेकिनjjइस्तेमाल करने के बाद अबgitपर लौटना मुश्किल लगता हैjjज़्यादा simple भी है और powerful भीworking copy = commit को वास्तव में “index भी एक commit है” की तरह समझना चाहिए
उदाहरण के लिए अगर feature x पर काम शुरू करना है, तो
jj new -m "working on feature x" trunkसे नया commit बनाओ, और उसके ऊपर एक खाली commit और रख दोआपका काम working copy (
@) में जाता है, फिर उसे पिछले commit (@-) में “ले जाकर” (squash)gitकेadd-p,resetजैसी जटिल options की जगह commits के बीच diff से सब संभाला जाता हैइसी संरचना की वजह से commits को बाँटना और व्यवस्थित करना
git indexकी तुलना में ज़्यादा flexible और powerful हो जाता हैcommit बिखराव की समस्या ज़्यादा करीब से pull request culture से जुड़ी है, और
jjभी इसे सिर्फ कुछ हद तक ही हल कर सकता हैworking copy को ऐसे ही
GitHubपर push नहीं कर दिया जाता; commit description जोड़ते समय review/cleanup किया जा सकता हैमैंने
jjकुछ दिन इस्तेमाल किया, लेकिन अपने मौजूदाlazygit, workflow, और script setup से मैं काफ़ी संतुष्ट हूँjjनया और ठीक-ठाक लगता है, लेकिन अगर आप अभी-अभी version control शुरू नहीं कर रहे हैं, तो switch करने की ठोस वजह कम लगती हैGitButlerजैसे दूसरे tools इस्तेमाल करें तो frontend का महत्व कम हो जाता है, लेकिन मैंने कुछ दिन पहलेJujutsuअपनाया औरClaudeसे उसके मुख्य operations (commit, branch move,GitHubpush/pull) पूछे, और 10 मिनट में हाथ साफ़ हो गयामैं अभी भी
Lazygitका diff इस्तेमाल करता हूँ, लेकिन detached HEAD state में रहने पर भी कोई समस्या नहीं होतीJJकाgitके साथ अच्छा compatibility है, और जटिल commands याद किए बिना बहुत आसान तरीके से सब कुछ करा देता हैbranches के बीच जाते समय uncommitted files का अपने-आप साथ चलना इसकी सबसे बेहतरीन features में से है
development, bug fix, copy changes जैसी अलग-अलग चीज़ों के बीच आना-जाना बहुत आसान हो जाता है
अगर AI agent changes कर रहा हो, तो
worktreeअलग करके इस्तेमाल किया जा सकता हैकाम पूरा होने से पहले ही change description (= commit message) लगाकर उसे tree में पहले से देख पाना भी सच में बहुत अच्छा है
कुल मिलाकर
JJकाफ़ी शानदार है