00:00:00स्वागत है, मैं एक छोटा सा डेमो दूँगा। अगर आप लोग Git Butler के बारे में नहीं जानते,
00:00:07तो यह एक नया वर्ज़न कंट्रोल टूल है जिस पर हम पिछले कुछ सालों से काम कर रहे हैं। हमने JJ से काफी चीजें ली हैं।
00:00:10तो अगर आप लोग Jujutsu का इस्तेमाल करते हैं, तो हमने आपसे काफी कुछ लिया है।
00:00:16खैर, अगर आपने Git Butler इस्तेमाल नहीं किया है, तो यह एक वर्ज़न कंट्रोल टूल है।
00:00:19आमतौर पर यह एक GUI (ग्राफिकल यूजर इंटरफेस) है।
00:00:21लेकिन हम इसके CLI (कमांड लाइन इंटरफेस) पर भी काम कर रहे हैं। मैं आप सभी को इसके CLI से जुड़ी कुछ चीजें दिखाना चाहता था क्योंकि आप सब Git पर काम करते हैं,
00:00:26और Git का CLI काफी दिलचस्प है।
00:00:29हमारे पास कुछ कॉन्सेप्ट्स हैं जिन्हें हमने Jujutsu से लिया है।
00:00:33लेकिन इसमें कुछ नई चीजें भी हैं जो मुझे लगता है कि काफी बढ़िया हैं।
00:00:36इसलिए मैं आपको यह दिखाना चाहता था ताकि मुझे कुछ अच्छे विचार मिल सकें कि और क्या बेहतर किया जा सकता है।
00:00:40तो हाँ, मैं इन चीजों के बारे में विस्तार से बताऊंगा।
00:00:43तो...
00:00:46इसमें कुछ अलग चीजें हैं। कमांड लाइन टूल का नाम "but" है।
00:00:49चूंकि मैं डैड जोक्स (घिसे-पिटे चुटकुले) सुनाता रहा हूँ, मुझे लगता है कि यह नाम थोड़ा सही बैठता है।
00:00:52आप "but status" चला सकते हैं। यह एक तरह के शॉर्ट लॉग (short log) जैसा है।
00:00:57तो अगर आपने Sapling या Jujutsu इस्तेमाल किया है और लॉग देखते हैं,
00:01:00तो हम उन फाइलों को दिखाएंगे जो डिस्क पर मॉडिफाई की गई हैं।
00:01:05यह आपकी वर्किंग डायरेक्टरी से लेकर आपके टारगेट ब्रांच तक का सारांश दिखाएगा।
00:01:08लेकिन हम आपके कमिट्स (commits) को भी दिखाएंगे, ठीक है?
00:01:11तो आप "but status -F" भी कह सकते हैं और यह आपको दिखाएगा कि हर कमिट में कौन सी फाइलें मॉडिफाई की गई थीं।
00:01:18अगर आप Git Butler GUI चला रहे हैं, तो आप अपनी लेन्स (lanes) वगैरह देख सकते हैं।
00:01:23लेकिन Git Butler में बहुत सी ऐसी कूल चीजें हैं जो Git नहीं कर सकता। उदाहरण के लिए, हम यह बेहतरीन शॉर्ट लॉग टाइप चीज कर सकते हैं।
00:01:29चीजें...
00:01:30लेकिन और आप जानते हैं,
00:01:32हम सामान्य रूप से एक लॉग बना सकते हैं जो बताता है कि क्या ये कमिट्स लोकल हैं या क्या, तो यह एक शॉर्ट लॉग की तरह ही है।
00:01:39लॉग...
00:01:40बाकी चीजों में भी, और हम नई ब्रांचेज (branches) बना सकते हैं।
00:01:44तो अगर मैं स्टेटस देखूँ, तो मैं यहाँ एक ट्विटर क्लोन बना रहा हूँ।
00:01:50मेरे पास कुछ ब्रांचेज हैं, एक के ऊपर एक स्टैक्ड (stacked) हैं।
00:01:52यह वो चीज है जो Git भी कर सकता है अगर आप "update ref" का उपयोग करें।
00:01:56सेट करें, जो रिबेस (rebasing) करते समय आपके रेफरेंस को फिर से लिख देगा।
00:02:00लेकिन हम इसे थोड़ा और स्वाभाविक तरीके से करते हैं, है ना?
00:02:03तो हम ऑटोमैटिकली आपके रेफ्स अपडेट करते हैं और आप बदलाव कर सकते हैं, और रिबेस उसे ट्रैक करेगा।
00:02:09लेकिन हम यह भी कर सकते हैं...
00:02:11पैरेलल ब्रांचेज (parallel branches), यानी हम एक समय में एक से अधिक ब्रांच अप्लाई कर सकते हैं। तो मैं यहाँ क्या करूँगा, ओह,
00:02:23एक नई ब्रांच बनाऊंगा और...
00:02:26फिर इसे दोबारा चलाऊंगा, और मेरे पास यह नई ब्रांच है जो उन अन्य ब्रांचेज के पैरेलल है जिन पर मैं काम कर रहा हूँ, ठीक है?
00:02:33और मैं उस ब्रांच में जा सकता हूँ और चीजें असाइन करना, कमिट करना शुरू कर सकता हूँ।
00:02:39तो हम इसे आगे देखेंगे।
00:02:41दूसरी शानदार चीज जो हम कर सकते हैं वह यह है कि हमारे पास मल्टीपल स्टेजिंग एरिया (staging areas) हैं।
00:02:45तो आपके पास मौजूद प्रत्येक स्टैक का अपना स्टेजिंग एरिया होता है, इसलिए आप कह सकते हैं...
00:02:51"rub" वह कमांड है, आप इस फाइल के लिए "rub KU" कह सकते हैं, और आप कह सकते हैं कि इसे "ZA" में डाल दो और...
00:02:58यह इसे उस विशेष स्टेजिंग एरिया को असाइन कर देता है। अगर मैं इसके लिए कुछ असाइन करना चाहूँ,
00:03:04तो यह आपको ये शॉर्ट कोड देता है, और आप कह सकते हैं ठीक है,
00:03:12यह यहाँ असाइन किया गया है और यह वहाँ असाइन किया गया है।
00:03:15और अगर मैं उन्हें कमिट करता हूँ, तो मैं उन्हें एक ही समय में इनमें से किसी भी ब्रांच में कमिट कर सकता हूँ।
00:03:21तो आइए इसे देखें। हम देख सकते हैं कि यह यहाँ कमिट किया गया है या यहाँ असाइन किया गया है, तो मैं कह सकता हूँ,
00:03:27"but commit -o"
00:03:30और यह इसे यहाँ कमिट कर देता है, ठीक है?
00:03:40तो अब यह फाइल इस कमिट में है। और अच्छी बात यह है कि यह सब Git ही है, इसलिए मैं यह भी कह सकता हूँ,
00:03:48कहना,
00:03:50यह वास्तव में एक Git कमिट बनाता है, मैं उस ब्रांच को पुश कर सकता हूँ और भी बहुत कुछ।
00:03:57लेकिन...
00:03:59हाँ, तो मैं दो ब्रांचेज में असाइन कर सकता हूँ या मैं सिर्फ "but commit" कह सकता हूँ और यह उन सभी चीजों को कमिट कर देगा जो असाइन नहीं की गई हैं,
00:04:07तो मैं चुन सकता हूँ कि मैं किस ब्रांच में नया काम कमिट करना चाहता हूँ।
00:04:11और इसके लिए हमने एक शब्द सोचा है जिसे "rubbing" (रबिंग) कहते हैं।
00:04:14मैंने कालेब के बारे में बहुत से लोगों को बताया है जो रात भर पीता रहा और अभी यहाँ नहीं है।
00:04:18अगर वह अभी आता है, तो हम सबको खड़े होकर तालियों से उसका स्वागत करना चाहिए।
00:04:21लेकिन उसने "rubbing" शब्द दिया, जिसका मूल रूप से मतलब है दो चीजों को एक साथ जोड़ना और यह पता लगाना कि वे क्या हैं।
00:04:28अगर आपने माइनक्राफ्ट (Minecraft) वगैरह खेला है, तो आपको क्राफ्टिंग टेबल का कॉन्सेप्ट पता होगा।
00:04:32आप जानते हैं कि आप इसे और इसे एक साथ रखते हैं और यह कुछ नया और ज्यादा दिलचस्प बना देता है, है ना?
00:04:34और...
00:04:38तो ऐसी बहुत सी चीजें हैं जो आप "but rub" कमांड के साथ चीजों को आपस में रगड़कर (rubbing) कर सकते हैं।
00:04:45मैं आपको कुछ अलग चीजें दिखाऊंगा जो हम कर सकते हैं। हम चीजें असाइन कर सकते हैं जैसा मैंने दिखाया, आप किसी अनकमिटेड या
00:04:52मॉडिफाइड फाइल को किसी ब्रांच में असाइन कर सकते हैं, लेकिन आप चीजों को अनअसाइन (unassign) भी कर सकते हैं। यहाँ एक स्पेशल मोड है "00"
00:05:01जहाँ मैं कह सकता हूँ "but rub"
00:05:05जैसे कि यह पूरा कमिट,
00:05:07"00" पर,
00:05:11और यह उसे अनकमिट कर देता है। तो यह मूल रूप से उस कमिट से "reset soft" जैसा काम करता है।
00:05:17मैं चीजों को अमेंड (amend) भी कर सकता हूँ, जैसे मैं कह सकता हूँ "rub le r"
00:05:24"y"
00:05:27"RV", यार, अब मुझे रीडिंग ग्लासेस चाहिए होंगे। मैं काफी बूढ़ा हो गया हूँ।
00:05:32"SW" जो हमारा... सॉरी, दरअसल...
00:05:35"11W"... चलिए इसे करते हैं।
00:05:38क्या वह "IW" है? धन्यवाद।
00:05:41ओह, गलती हो गई।
00:05:44क्या वह "I" है?
00:05:48माफ करना।
00:06:02और...
00:06:04यह इसे उसमें कमिट कर देता है।
00:06:10"Rub I" कर सकता हूँ।
00:06:14मैं चीजों को अनकमिट कर सकता हूँ?
00:06:16ठीक है, मैं स्क्वैश (squash) कर सकता हूँ। अगर मैं इस कमिट और इस कमिट को मिलाना चाहता हूँ, तो मैं "but rub JE GE" कर सकता हूँ।
00:06:22और यह उन कमिट्स को आपस में स्क्वैश कर देता है। मैं अनकमिट कर सकता हूँ, चीजों को इधर-उधर ले जा सकता हूँ,
00:06:25मूल रूप से जो कुछ भी आप सोचें कि दो चीजों को मिलाने पर होना चाहिए, ठीक है?
00:06:32यह वही करेगा। और अगर आप किसी चीज को अनअसाइन किए गए बदलावों (unassigned changes) के साथ मिलाते हैं, तो यह उसे पहले जैसा कर देगा, ठीक है?
00:06:37और आप यहाँ तक कि... मुझे याद नहीं आ रहा कि यह अभी काम करता है या नहीं।
00:06:42तो आप फाइलों को इधर-उधर भी ले जा सकते हैं, है ना? जैसे
00:06:48"J 8 2"
00:06:53और...
00:07:02यह मूल रूप से उस कमिट से फाइल लेता है और फिर,
00:07:03उसे उस कमिट से हटा देता है और फिर उसे उसके नीचे वाले कमिट में ले जाता है, ठीक है?
00:07:07इसमें दिलचस्प यह नहीं है कि यह Git में संभव नहीं है, बल्कि यह है कि Git में ऐसा करना बहुत मुश्किल है।
00:07:11जैसे किसी खास कमिट को कहीं अनडू (undo) करना या फाइलों को कमिट्स के बीच इधर-उधर करना या तीन कमिट पहले की किसी फाइल को अमेंड करना।
00:07:19हाँ, आप इसे Git में कर सकते हैं, जैसे आप कोई
00:07:27टेंपरेरी "fix up" कमिट और ऑटो-स्क्वैश जैसा कुछ कर सकते हैं।
00:07:31लेकिन चीजों को बस रगड़कर (rubbing) यहाँ-वहाँ ले जाना और कंटेंट को अपनी पसंद की जगह पर रखना काफी अच्छा है।
00:07:34और एक साथ कई ब्रांचेज का होना भी बहुत बढ़िया है।
00:07:40एक और चीज जो आप इसके साथ कर सकते हैं वह है कमिट्स को आसानी से विभाजित (split) करना। हमारे पास यह "but new" कमांड भी है।
00:07:43तो अगर मैं कहना चाहूँ
00:07:51"but new HE" तो यह...
00:07:54वहाँ एक नया खाली कमिट बना देगा जिसमें कुछ भी नहीं होगा।
00:07:56ठीक है। तो यह Jujutsu के स्टाइल जैसा है जहाँ आप एक नया कमिट बना सकते हैं जिसमें कुछ भी नहीं है।
00:07:59और फिर अगर मैं चाहूँ तो इसमें फाइलें "rub" कर सकता हूँ, जैसे मैं कह सकता हूँ,
00:08:03यह फाइल लो,
00:08:080
00:08:12मैं लेता हूँ...
00:08:15यह इस फाइल को इस नए कमिट में ले जाता है, और फिर मैं कह सकता हूँ "describe"।
00:08:23वह क्या था... XUC?
00:08:29मैं कैसे...
00:08:32"status -F" यानी स्टेटस फाइलें। तो यह सिर्फ कमिट्स दिखाने के बजाय हर कमिट की फाइलें दिखाता है।
00:08:45"but ST" या "but status" सिर्फ कमिट्स दिखाता है और
00:08:56"but status -F" आपको हर एक के अंदर की फाइलें दिखाता है ताकि आप रबिंग के साथ उन्हें इधर-उधर ले जा सकें।
00:09:02तो हाँ, इसमें "new" और "describe" है। और आखिरी चीज है "marking" (मार्किंग), यह भी बहुत कुछ JJ के स्टाइल जैसा है।
00:09:04अगर कोई Jujutsu इस्तेमाल करता है, तो आप एक कमिट को मार्क कर सकते हैं, जो इसे टारगेट के रूप में सेट कर देता है।
00:09:11तो इसे जो कुछ भी दिखेगा, वह उसे उस कमिट में डाल देगा। आप मार्क कर सकते हैं,
00:09:16यह वास्तव में एक दिलचस्प चीज है, है ना? मैं कह सकता हूँ,
00:09:21"but new -M" या मैं कह सकता हूँ "but mark ZA" और
00:09:25यह इसे मार्क कर देगा और आप देख सकते हैं कि इसने पहले से ही अनकमिटेड चीजों को लेकर उस लेन में डाल दिया है।
00:09:29और...
00:09:33फिर मैं चीजों को कमिट कर सकता हूँ या मैं किसी खास कमिट को भी मार्क कर सकता हूँ।
00:09:35ओह, वह एक ब्रांच है, माफ कीजिए।
00:09:42और यह एक खास कमिट को मार्क करता है और फिर अगर मैं जैसे कुछ बदलाव (echo new) करूँ,
00:09:44तो यह उसे लेता है और ऑटोमैटिकली उस कमिट में कमिट कर देता है, ठीक है?
00:09:47तो यह दिलचस्प है क्योंकि यह एक स्टैक्ड ब्रांच है और इसमें कई कमिट्स हैं, और मैं अब जो कुछ भी कर रहा हूँ,
00:09:56वह ऑटोमैटिकली एक स्टैक्ड ब्रांच में तीन कमिट नीचे वाले कमिट को अमेंड कर रहा है, ठीक है?
00:09:58तो यह वैसा ही है जैसे JJ काम करता है जहाँ आप "jj new" करते हैं और काम शुरू करते हैं।
00:10:07यह बस ऑटोमैटिकली आपके आखिरी कमिट को अमेंड कर रहा है,
00:10:15सिवाय इसके कि आप किसी भी कमिट को मार्क कर सकते हैं और
00:10:21काम जारी रख सकते हैं, और यह उस कमिट पर काम करता रहेगा। फिर जब आप चाहें, उसे अनमार्क (unmark) कर सकते हैं।
00:10:26ठीक है?
00:10:31खैर, तो हाँ, यह कुछ मजेदार चीजें हैं जिन पर हम काम कर रहे हैं।
00:10:33मुझे इस पर काम करना बहुत अच्छा लग रहा है।
00:10:36एक और चीज जो हमने JJ से ही ली है, वह है "oplog" (ऑपरेशन लॉग)।
00:10:41यह वो चीज है जो हमारे पास काफी समय से है।
00:10:44तो अगर आपने Git Butler इस्तेमाल किया है, तो उसमें एक टैब है जो कहता है कि यहाँ हमारे द्वारा किए गए सभी ऑपरेशन्स हैं।
00:10:48लेकिन हर बार जब मैं कुछ चलाता हूँ, तो यह ऑपरेशन्स की हिस्ट्री बनाता है,
00:10:52और मैं देख सकता हूँ कि Git Butler ने क्या-क्या किया है। मैं इनमें से किसी पर भी रिस्टोर कर सकता हूँ या कह सकता हूँ,
00:10:56जैसे...
00:10:59"undo"
00:11:03ओह, अगर मैं स्पेलिंग सही लिखूँ... मैं "undo" कह सकता हूँ और यह ऑपरेशन को अनडू कर देगा और मेरी वर्किंग डायरेक्टरी और स्टेटस को
00:11:06वापस वहीं ले आएगा जहाँ वो पहले थे। या मैं कह सकता हूँ
00:11:12"restore"
00:11:13इनमें से किसी भी SHA (शॉ) पर।
00:11:14ओह, गलती हो गई।
00:11:20और...
00:11:22यह मेरी वर्किंग डायरेक्टरी, मेरी ब्रांचेज और मेरे पास जो कुछ भी था, उसे वापस वैसा ही कर देता है जैसा वह पहले था।
00:11:24तो इस तरह से डेमो देना वास्तव में दिलचस्प है क्योंकि मैं एक ऐसी स्थिति (scenario) बना सकता हूँ,
00:11:26जिसके बारे में मुझे पता है कि वह काम करेगी, और फिर वापस उस पर रिस्टोर करके डेमो दोबारा शुरू कर सकता हूँ।
00:11:29लेकिन जाहिर है, यह कहना बहुत अच्छा है कि, "पता है क्या, मैं वास्तव में ऐसा नहीं करना चाहता था" या "मैं किसी कॉनफ्लिक्ट (conflict) में फंस गया हूँ।"
00:11:33तो बस उसे अनडू कर दें और मुझे अपना काम जारी रखने दें।
00:11:38तो हाँ, बस इतना ही। और दूसरी बात यह है कि सभी कमांड्स में JSON आउटपुट है, तो आप "but -J" कह सकते हैं
00:11:44या "-json" लगाकर कोई भी कमांड चला सकते हैं और यह आपको वही डेटा देगा, लेकिन JSON फॉर्मेट में।
00:11:50तो अगर आप कुछ स्क्रिप्ट करना चाहते हैं, तो यह Git के पोर्सिलेन (porcelain) आउटपुट से कहीं ज्यादा बेहतर है।
00:11:54आप बस उसे खींच सकते हैं या इसे "jq" के जरिए चलाकर किसी खास एंट्री को ढूंढ सकते हैं और
00:11:58CLI को थोड़ा बेहतर तरीके से स्क्रिप्ट कर सकते हैं।
00:12:06तो बस इतना ही। बहुत-बहुत धन्यवाद।
00:12:11तो अगर आप कुछ स्क्रिप्ट करना चाहते हैं, तो यह Git के पोर्सिलेन (porcelain) आउटपुट जैसा कुछ होने से कहीं ज्यादा बेहतर है
00:12:15जैसे आप बस उसे इस्तेमाल कर सकते हैं या आप उसे jq के ज़रिए चलाकर किसी खास एंट्री या वैसी ही कोई चीज़ ढूँढ सकते हैं और
00:12:21इस तरह से CLI को थोड़ा बेहतर ढंग से स्क्रिप्ट करने में सक्षम हो सकते हैं
00:12:24तो बस इतना ही। बहुत-बहुत धन्यवाद