jj – Jujutsu के लिए CLI
(steveklabnik.github.io)jj, Jujutsu का command-line interface है, जो distributed version control system (DVCS) आधारित टूल है- यह
gitसे अधिक सरल और सहज होने के साथ-साथ अधिक शक्तिशाली features प्रदान करता है gitऔर Mercurial के फ़ायदों को जोड़कर core tools की संख्या घटाता है और organic integration को मज़बूत करता हैgit-compatible backend का उपयोग करके मौजूदा collaboration environment को बनाए रखते हुए भी स्वतंत्र experimentation संभव बनाता है- advanced users के लिए
gitमें कठिन अतिरिक्त version control features का उपयोग कर पाना महत्वपूर्ण है
jj का परिचय और विशेषताएँ
-
jjJujutsu का CLI (command-line interface) है, और Jujutsu एक distributed version control system (DVCS) है- उपयोगकर्ता
gitजैसे अन्य DVCS से परिचित हो सकते हैं, और यह tutorialgitusers के दृष्टिकोण को आधार मानता है jjकोgitसे अधिक सरल, उपयोग में आसान, और फिर भी शक्तिशाली टूल के रूप में डिज़ाइन किया गया है- आम तौर पर “शक्तिशाली” और “जटिल” एक-दूसरे के विपरीत माने जाते हैं, लेकिन
jjइस संतुलन को नए तरीके से प्रस्तुत करता है jjgitऔर Mercurial(hg) की खूबियों को मिलाकर DVCS का एक नया रूप बनाता है- यह core tools की संख्या घटाकर और हर टूल के बीच organic integration के ज़रिए अधिक कुशल कार्य-परिवेश देता है
- advanced users,
gitमें कठिन अतिरिक्त version control features का उपयोग कर सकते हैं jjgit-compatible backend का उपयोग करता है, इसलिए collaboration environment बदले बिना स्वतंत्र experimentation संभव है- यह मौजूदा
gitrepositories के साथ compatibility बनाए रखता है, और आवश्यकता होने पर आसानी सेgitपर वापस लौटा जा सकता है - tutorial इन विशेषताओं के माध्यम से सीधे दिखाने का संकेत देता है कि
jjक्यों ध्यान देने योग्य टूल है
- उपयोगकर्ता
1 टिप्पणियां
Hacker News टिप्पणियाँ
बहुत-सी चर्चा git और jj के अंतर पर केंद्रित है, लेकिन मेरा मानना है कि बस git को भूलकर jj के मूल workflow पर ध्यान देना बेहतर है
एक साफ repository में
jjचलाने पर स्थिति देख सकते हैं, और बदलाव के बादjj commit -m "made changes"से commit कर सकते हैंगलती हो जाए तो सुधार करके
jj squashसे उसे आख़िरी commit में मिला सकते हैंजब किसी खास revision से, जैसे नई branch की तरह, काम करना हो तभी
jj new -r lmnopइस्तेमाल करेंgit history को
git logसे देखा जा सकता है, और jj का आंतरिक कामकाज दिखाई नहीं देताalias.save="!git add -A; git commit -m"जैसा git alias बनाकर$ git save "made changes"की तरह इस्तेमाल करता थाJJ मुझे उल्टा सोचने के लिए कहता हुआ लगता है
git में बदलाव के बाद commit message लिखा जाता है, लेकिन jj में पहले नया commit बनता है और फिर उसमें विवरण जोड़ा जाता है
कई features मिले-जुले गंदे state में से सिर्फ ज़रूरी बदलाव चुनकर commit करने की आदत है, लेकिन सिर्फ jj tutorial देखकर यक़ीन नहीं होता कि यह संभव है या नहीं
jj newएक खाली git staging area जैसी अवधारणा हैjj में हमेशा commit मौजूद रहता है, और वह commit folder की contents के आधार पर निकाले गए मान के रूप में stable changeid रखता है
अगर कई बदलावों को अलग-अलग commit करना हो तो
jj splitका इस्तेमाल किया जा सकता हैjj newसे अस्थायी commit बनाता हूँ और message खाली छोड़ देता हूँबाद में तैयार होने पर कई commits को squash करके एक में मिला देता हूँ और message जोड़ता हूँ
यह तरीका एक तरह की undo history की तरह काम करता है, इसलिए प्रयोग करना बहुत आसान हो जाता है
jj newसिर्फ “ऊपर एक नया commit बनाना” है, इसलिए तुरंत विवरण लिखने की ज़रूरत नहीं होतीमैंने भी शुरू में यह आदत डालने की कोशिश की थी, लेकिन उल्टा यह गैर-प्रभावी लगा
Git में भी इसी तरह का workflow सुझाया गया है, और Squash Workflow देखने पर Git index जैसा flow बनाया जा सकता है
इसलिए मैं कई workspaces रखता हूँ और shelve feature (IntelliJ) का अक्सर उपयोग करता हूँ
कभी-कभी git patch से diff को अस्थायी रूप से भी सहेजता हूँ
इस तरह की अव्यवस्थित प्रक्रिया को साथियों से छिपाकर थोड़ा और professional दिखने की कोशिश करता हूँ
jj इस्तेमाल करके जो बात मुझे पसंद नहीं आई, वह यह है कि file edit अपने-आप commit हो जाती है
अगर पुरानी commit को देखने के लिए checkout करने के बाद file बदल दें, तो वही commit बदल जाती है और उसके बाद की पूरी history rebase हो जाती है
इसलिए बचाव के तौर पर एक खाली commit पहले बनानी पड़ती है
git में जब तक मैं साफ़ तौर पर commit नहीं करता, repository नहीं बदलती, इसलिए वह ज़्यादा सहज लगता है
jj evologजानने के बाद राय बदल गईjj के पास staging से बेहतर समाधान पहले से था
git CLI की आदत ही jj सीखने में रुकावट बन रही थी
दिलचस्प बात यह है कि jj इस्तेमाल करने पर git के storage engine structure को और बेहतर समझा जा सकता है
editकी जगहjj newका इस्तेमाल करें, तो बदलावों को साफ़-सुथरे ढंग से ट्रैक किया जा सकता हैयह git stash को juggling करने से कहीं बेहतर लगता है
jj editjj का सबसे बड़ा जाल हैइसकी जगह
jj newका इस्तेमाल करें, और गलती होने परjj undoसे वापस लौट सकते हैंjj commit को सस्ते snapshot की तरह मानता है, इसलिए commit से ज़्यादा “बदलाव” पर ध्यान देना सही है
auto rebase push के बाद immutable होकर सुरक्षित रहता है
jj newऔरjj squashको मिलाकर इसे git branch head की तरह संभाला जा सकता हैdetached head state में काम करना jj बहुत आसान बना देता है
jj editसे पुरानी commit checkout की थीjj newपर स्विच करने से समस्या हल हो जाएगीjj का आख़िरी paragraph ही मुख्य बिंदु है
क्योंकि यह git के साथ पूरी तरह संगत backend इस्तेमाल करता है, इसलिए पूरी टीम को बदले बिना आप अकेले इसे आज़मा सकते हैं
पसंद न आए तो कभी भी git पर वापस जा सकते हैं
git के operations jj log में दर्ज नहीं होते, इसलिए उन्हें manually import करना पड़ता है
किसी project में एक ही interface इस्तेमाल करने की सलाह दी जाती है
मेरा सबसे पसंदीदा feature
jj absorbहैयह current revision के बदलावों को अपने-आप पहले की संबंधित commits में ले जाता है
config file या
.gitignoreमें बदलाव करना भूल जाने पर यह बहुत काम आता हैjj newके बाद बदलाव करें और फिरjj absorbचलाएँऔर सबसे अच्छी बात यह है कि merge conflict से जूझना नहीं पड़ता
jj absorbग़लत जगह लागू हो जाए, तोjj undoसे वापस लौटा जा सकता हैइसी feature की वजह से जटिल rebase भी डरावना नहीं लगता
git absorbमौजूद हैमैं लंबे समय से tutorial update नहीं कर पाया हूँ, लेकिन अब भी हर दिन jj इस्तेमाल करता हूँ
startup ersc.io में व्यस्त होने की वजह से upstream पर काम नहीं कर पाया
कोई भी सवाल हो तो हमेशा स्वागत है
jj stable change ID इस्तेमाल करता है, जबकि git immutable commit ID इस्तेमाल करता है
इसलिए jj में undo या rebase काफ़ी ज़्यादा लचीला लगता है
कभी-कभी ज़्यादा बदलाव एक साथ देखने का मन होता है; जानना चाहता हूँ कि क्या इसके लिए कोई विकल्प है
jj, git से अलग है, इसलिए इसे आज़माना सार्थक है
सिर्फ़ अलग approach का अनुभव करने से ही engineering नज़रिया व्यापक होता है
हर चीज़ आज़माना ज़रूरी नहीं, लेकिन अलग-अलग workflows के trade-offs समझना महत्वपूर्ण है
git और jj का रिश्ता C और Python जैसा लगता है
git forensic tracking है, और jj कहानी के chapters जैसा है
कभी-कभी बाद की कहानी को स्वाभाविक बनाने के लिए शुरुआती chapters फिर से लिखने पड़ते हैं
jj को इस दर्शन के साथ बनाया गया है कि “working tree ख़ुद commit है” और “conflict भी commit किए जा सकते हैं”
“ज़्यादा ताकतवर और आसान” होने के दावे के लिए ठोस उदाहरण चाहिए लगते हैं
अगर ऐसी ज़रूरत नहीं है, तो शायद jj की अहमियत महसूस न हो
इसे समझने के लिए ख़ुद इस्तेमाल करना पड़ता है
jj undoही अपने-आप में काफ़ी मूल्यवान हैgit में आसानी से ऐसी स्थिति आ जाती है जहाँ recovery मुश्किल होती है, लेकिन jj में कुछ undo से बात संभल जाती है
jj की वजह से non-linear DAG का उपयोग करने में आत्मविश्वास आया है
कई parents या children वाले बदलावों को अब स्वतंत्र रूप से संभालता हूँ
पहले मैं बेवजह क्रम थोपता था, लेकिन अब dependency relation को साफ़ तौर पर व्यक्त कर सकता हूँ
review और submit प्रक्रिया भी काफ़ी अधिक प्रभावी हो गई है