00:00:00أهلاً بكم، سأقوم بعرض تجريبي سريع لأداة Git Butler لمن لا يعرفها، وهي أداة جديدة لإدارة الإصدارات
00:00:07نعمل عليها منذ بضع سنوات. لقد استعرنا الكثير من الأفكار من JJ
00:00:10لذا، إذا كنتم تستخدمون Jujitsu، فقد اقتبسنا الكثير من الأشياء منكم
00:00:16على أي حال، لمن لم يجرب Git Butler، فهي أداة لإدارة الإصدارات
00:00:19وهي عبارة عن واجهة رسومية بشكل عام
00:00:21لكننا نعمل على واجهة سطر أوامر (CLI)، وأردت استعراض بعض ميزاتها بما أنكم تعملون جميعاً على Git
00:00:26ولدى Git واجهة سطر أوامر مثيرة للاهتمام
00:00:29لدينا بعض المفاهيم التي استعرناها من Jujitsu أيضاً
00:00:33ولكن هناك بعض الإضافات الجديدة التي أعتقد أنها رائعة حقاً
00:00:36لذا أردت عرضها عليكم لأستلهم بعض الأفكار حول ما يمكن أن يكون مذهلاً
00:00:40حسناً، سأستعرض هذه الأمور
00:00:43لذا
00:00:46هناك عدة خيارات. أداة سطر الأوامر تُسمى “but”
00:00:49وبما أنني كنت ألقي نكاتاً سخيفة، أشعر أن هذا الاسم مناسب نوعاً ما
00:00:52يمكنك تشغيل “but status”، وهو يشبه السجل المختصر
00:00:57فإذا كنت قد استخدمت Sapling أو Jujitsu واطلعت على السجل
00:01:00فسنقوم بعرض الملفات التي تم تعديلها على القرص
00:01:05من دليل العمل الخاص بك مقارنة بالفرع المستهدف
00:01:08ولكننا سنعرض أيضاً الالتزامات (commits) الموجودة لديك، حسناً؟
00:01:11يمكنك أيضاً كتابة “but status -F” وسيعرض لك الملفات التي تم تعديلها في كل التزام
00:01:18إذا كنت تشغل الواجهة الرسومية لـ Git Butler، يمكنك رؤية المسارات وما إلى ذلك
00:01:23ولكن هناك الكثير من الأشياء الرائعة في Git Butler التي لا يستطيع Git القيام بها، مثل هذا السجل المختصر الجميل
00:01:29الذي توفره “but”
00:01:30و.. كما تعلمون
00:01:32يمكننا عرض سجل عام يوضح ما إذا كانت هذه الالتزامات محلية أم لا، وهذا يشبه السجل المختصر
00:01:39في الأدوات الأخرى، ويمكننا إنشاء فروع جديدة
00:01:40لذا إذا طلبت الحالة (status)، سأرى ذلك.. أنا أعمل على نسخة تقليدية من تويتر هنا
00:01:44لدي عدة فروع، أحدها مكدس فوق الآخر
00:01:50وهو أمر يمكن لـ Git القيام به إذا استخدمت “update ref”
00:01:52بشكل صحيح، حيث يقوم بإعادة كتابة المراجع عند إجراء “rebasing” أو ما شابه
00:01:56لكننا نقوم بذلك بشكل أكثر سلاسة وتلقائية، أليس كذلك؟
00:02:00فنحن نقوم بتحديث مراجعك تلقائياً، ويمكنك تغيير الأشياء وسيتتبع الـ “rebase” ذلك
00:02:03ولكن يمكننا أيضاً القيام بـ
00:02:09الفروع المتوازية، حيث يمكننا تطبيق أكثر من فرع في نفس الوقت. وما سأفعله هنا.. أوه
00:02:11هو إنشاء فرع جديد
00:02:23ثم تشغيله مرة أخرى، وسأحصل على هذا الفرع الجديد الموازي للفروع الأخرى التي أعمل عليها، تماماً؟
00:02:26وما يمكنني فعله هو الدخول إلى ذلك الفرع والبدء في تعيين الأشياء والالتزام بها
00:02:33سنرى ذلك في الخطوة التالية
00:02:39الشيء الرائع الآخر الذي يمكننا فعله هو توفير مناطق تخزين مؤقت (staging areas) متعددة
00:02:41فكل مكدس لديك له منطقة تخزين مؤقت خاصة به، لذا يمكنك قول
00:02:45“rub”.. هذا هو الأمر.. يمكنك قول “rub KU” لهذا الملف هنا، ونقله إلى “ZA”
00:02:51وسيتم تعيينه لتلك المنطقة المحددة. وإذا أردت تعيين شيء ما لهذا
00:02:58فإنه يعطيك هذه الرموز القصيرة، ويمكنك القول: حسناً
00:03:04هذا الملف مخصص هنا، وهذا مخصص هناك
00:03:12وإذا قمت بتنفيذ الالتزام (commit)، فيمكنني إضافتها إلى هذين الفرعين في نفس الوقت
00:03:15فلنلقِ نظرة. نرى أن هذا قد تم الالتزام به أو تعيينه هنا، لذا يمكنني قول
00:03:21“but commit -o”
00:03:27وسيتم الالتزام به هنا، أرأيتم؟
00:03:30الآن أصبح هذا الملف ضمن هذا الالتزام، والجميل أيضاً أن كل هذا متوافق مع Git، لذا يمكنني أيضاً
00:03:40قول
00:03:48هذا.. إنه ينشئ التزام Git فعلياً، ويمكنني دفع (push) ذلك الفرع وما إلى ذلك
00:03:50لكن
00:03:57أجل، يمكنني التعيين لفرعين، أو يمكنني فقط قول “but commit” وسيقوم بكل ما هو غير معين للمستهدف
00:03:59أياً كان، حيث يمكنني تحديد الفرع الذي أريد إضافة الالتزامات الجديدة إليه
00:04:07لقد ابتكرنا هذا المصطلح المسمى “rubbing” (الفرك/الدمج)
00:04:11لقد أخبرت الكثير من الناس عن “كاليب” الذي كان يشرب طوال الليل ولم يحضر
00:04:14الآن إذا دخل، علينا جميعاً الوقوف والتصفيق له
00:04:18لكنه هو من ابتكر مصطلح “rubbing”، وهو في الأساس أخذ شيئين ودمجهما معاً وتحديد النتيجة
00:04:21إذا كنتم قد لعبتم ماين كرافت أو ما شابه واستخدمتم طاولة الصناعة
00:04:28فأنتم تعرفون هذا المفهوم، حيث
00:04:32تأخذ هذا مع ذاك وتضعهما معاً لتبتكر شيئاً جديداً وأكثر إثارة، أليس كذلك؟
00:04:34وهناك قائمة طويلة من الأشياء التي يمكنك فعلها باستخدام أداة “but” لدمج الأشياء عبر “but rub”
00:04:38سأريكم بعض الأشياء المختلفة التي يمكننا القيام بها؛ يمكننا التعيين، كما أريتكم، حيث تخصص ملفاً غير ملتزم به
00:04:45أو معدلاً لفرع معين، ولكن يمكنك أيضاً إلغاء التعيين. هناك هذا الوضع الخاص هنا “00”
00:04:52حيث يمكنني قول “but rub”
00:05:01لهذا الالتزام بالكامل مثلاً
00:05:05إلى “00” و
00:05:07سيقوم بإلغاء الالتزام، فهو يشبه تماماً عملية “soft reset”
00:05:11لذلك الالتزام. يمكنني أيضاً التعديل (amend)، كأن أقول “rub le r”
00:05:17y
00:05:24RV.. يا إلهي، أحتاج لنظارات القراءة الآن، لقد كبرت في السن
00:05:27SW.. وهي.. في الواقع دعونا نجرب
00:05:3211 W. لنفعل هذا
00:05:35هل هي IW؟ شكراً لك
00:05:38عذراً
00:05:41هل هذا حرف I؟
00:05:44آسف
00:05:48و
00:06:02لقد قام بدمجه هناك. يمكنني أيضاً
00:06:04استخدام Rub I
00:06:10يمكنني إلغاء التزام الأشياء،
00:06:14ويمكنني دمج (squash) الالتزامات. فإذا أردت دمج هذا الالتزام مع ذاك، يمكنني قول “but rub”
00:06:16J e GE
00:06:22وسيقوم بدمجهما معاً. يمكنني إلغاء الالتزام ونقل الأشياء
00:06:25ببساطة أي شيء تتوقع حدوثه عند دمج شيئين،
00:06:32سيقوم به. وإذا دمجت شيئاً مع التغييرات غير المعينة، فسيقوم بإلغائه أساساً، أليس كذلك؟
00:06:37وحتى أنني لا أذكر إن كان هذا يعمل حالياً أم لا
00:06:42يمكنك أيضاً نقل الملفات من مكان لآخر
00:06:48J 8 2
00:06:53و
00:07:02يأخذ الملف من ذلك الالتزام ثم
00:07:03يلغيه من هناك وينقله إلى الالتزام الذي يليه مباشرة
00:07:07المثير في الأمر ليس أن Git لا يستطيع فعل ذلك، بل أنه من الصعب جداً القيام به في Git،
00:07:11مثل إلغاء التزامات فردية في مكان ما أو نقل ملفات بين الالتزامات أو تعديل ملف في التزام يسبقه بثلاث مراحل
00:07:19يمكنك فعل ذلك في Git، باستخدام
00:07:27التزام إصلاح مؤقت (fixup commit) و”auto squash” أو ما شابه
00:07:31لكن من الرائع جداً أن تتمكن من دمج الأشياء ونقل المحتوى إلى حيث تريده
00:07:34وأن يكون لديك عدة فروع متزامنة
00:07:40الشيء الآخر الذي يمكنك فعله هو تقسيم الالتزامات بسهولة. لدينا أيضاً أمر “but new”
00:07:43فإذا أردت أن أقول
00:07:51“but new”
00:07:54H e.. فسيقوم بـ
00:07:56إنشاء التزام فارغ وجديد ليس فيه أي شيء
00:07:59هذا هو أسلوب Jujitsu حيث يمكنك إنشاء التزام فارغ تماماً
00:08:03وبعدها يمكنني دمج الملفات فيه إذا أردت، كأن أقول
00:08:08خذ هذا الملف
00:08:12صفر
00:08:15سآخذ
00:08:23وسينقل هذا الملف إلى الالتزام الجديد، ثم يمكنني الوصف (describe)
00:08:29ما كان ذلك الرمز؟ X y c
00:08:32كيف يمكنني
00:08:45Status - F تعرض الملفات، فهي تظهر الملفات الموجودة في كل التزام بدلاً من.. حسناً “but ST”
00:08:56أمر “but status” يظهر الالتزامات فقط و
00:09:02أما “but status -F” فيظهر الملفات داخل كل منها، لتتمكن من نقلها عبر الـ “rubbing”
00:09:04إذاً، لدينا “new” و “describe”، وآخر شيء هو “marking” (التحديد)، وهذا أيضاً بأسلوب JJ
00:09:11إذا كان أحدكم يستخدم Jujitsu، يمكنك تحديد التزام ليكون هدفاً
00:09:16وبعد ذلك، أي شيء تفعله سيوضع في ذلك الالتزام، ويمكنك تحديد
00:09:21إنه أمر مثير للاهتمام حقاً، يمكنني قول
00:09:25“but new -M” أو يمكنني التحديد بقول “but mark”
00:09:29Z a و
00:09:33سيقوم بتحديد هذا، وتلاحظون أنه أخذ بالفعل الشيء غير الملتزم به ووضعه في ذلك
00:09:35المسار و
00:09:42بعدها يمكنني الالتزام بالأشياء أو يمكنني أيضاً تحديد
00:09:44التزام معين مثلاً
00:09:47أوه، هذا فرع، معذرة
00:09:56وهكذا يحدد التزاماً معيناً، وإذا كتبت مثلاً “echo new”
00:09:58فإنه يأخذ ذلك ويقوم بالالتزام به تلقائياً في ذلك المكان، أرأيتم؟
00:10:07هذا مذهل لأنه فرع مكدس يحتوي على عدة التزامات، وأي شيء أفعله الآن
00:10:15سيقوم تلقائياً بتعديل التزام يسبقه بثلاث مراحل في الفرع المكدس، تماماً؟
00:10:21وهذا يشبه ما يفعله JJ عندما تستخدم “jj new” وتبدأ العمل
00:10:26فهو يقوم تلقائياً بتعديل آخر التزام قمت به
00:10:31باستثناء أنه هنا يمكنك تحديد أي التزام تقريباً و
00:10:33تواصل العمل، وسيحاول الاستمرار في تحديث ذلك الالتزام، ويمكنك إلغاء التحديد متى شئت
00:10:36حسناً
00:10:41على كلٍ، هذه بعض الأشياء الممتعة التي نعمل عليها
00:10:44أجد العمل على هذا الأمر ممتعاً للغاية
00:10:48الشيء الآخر الذي نفعله، والمقتبس أيضاً من JJ، هو سجل العمليات (oplog)
00:10:52وهذا شيء كان متوفراً لدينا منذ فترة طويلة
00:10:56إذا استخدمتم Git Butler، فهناك تبويب يعرض جميع العمليات التي قمنا بها
00:10:59وفي كل مرة أقوم بتشغيل شيء ما، فإنه يسجل
00:11:03تاريخ العمليات، ويمكنني رؤية كل ما فعله Git Butler، ويمكنني الاستعادة لأي منها أو قول
00:11:06مثل
00:11:12“undo” (تراجع)
00:11:13إذا كتبتها بشكل صحيح، سيقوم بالتراجع عن العملية وإعادة دليل العمل والحالة
00:11:14إلى ما كانت عليه قبل ذلك، أو يمكنني قول
00:11:20“restore” (استعادة)
00:11:22لأي من هذه الرموز (SHA)
00:11:24عذراً
00:11:26و
00:11:29سيعيد دليل العمل والفروع وكل ما كان لديّ إلى الحالة السابقة
00:11:33من المثير للاهتمام تقديم عرض تجريبي بهذه الطريقة لأنني أستطيع إنشاء سيناريو
00:11:38أعرف أنه يعمل، ثم أستطيع العودة إليه والبدء من جديد
00:11:44ولكنه بالتأكيد مفيد جداً لتقول: في الحقيقة لم أرغب في فعل ذلك، أو لقد دخلت في
00:11:50منطقة تعارض، فما عليك سوى التراجع ومواصلة العمل
00:11:54هذا كل شيء. والشيء الآخر هو أن جميع الأوامر تدعم مخرجات JSON، حيث يمكنك إضافة “-J”
00:11:58أو “--json” مع أي أمر، وسيعطيك نفس البيانات ولكن بصيغة JSON
00:12:06لذا إذا أردت برمجة شيء ما، سيكون الأمر أسهل بكثير من التعامل مع مخرجات Git العادية
00:12:11حيث يمكنك معالجتها عبر “jq” والعثور على مدخل معين مثلاً و
00:12:15برمجة واجهة سطر الأوامر بشكل أكثر سلاسة
00:12:21هذا كل ما لدي، شكراً جزيلاً لكم
00:12:24هذا كل شيء، شكراً جزيلاً لكم.