واجهة سطر أوامر GitButler: سكوت شاكون، GitButler

GGitButler
컴퓨터/소프트웨어창업/스타트업AI/미래기술

Transcript

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هذا كل شيء، شكراً جزيلاً لكم.

Key Takeaway

تعد أداة GitButler CLI تطويراً نوعياً في إدارة الإصدارات، حيث تبسط العمليات المعقدة في Git مثل إعادة الهيكلة ونقل الملفات بين الالتزامات مع توفير مرونة العمل على فروع متعددة وتتبع دقيق لتاريخ العمليات.

Highlights

تقديم أداة GitButler كواجهة سطر أوامر (CLI) مبتكرة تعتمد على مفاهيم مستوحاة من Jujitsu (JJ).

ميزة الفروع المتوازية (Parallel Branches) التي تسمح بالعمل على عدة فروع في وقت واحد بسلاسة.

إدخال مفهوم الـ "Rubbing" لدمج الملفات والالتزامات أو نقلها بين الفروع والالتزامات بسهولة فائقة.

دعم سجل العمليات (Oplog) الذي يتيح التراجع (Undo) عن أي إجراء والعودة لحالات سابقة للمشروع.

إمكانية تخصيص ملفات معينة لالتزامات محددة عبر مناطق تخزين مؤقت (Staging areas) متعددة.

توفير جميع مخرجات الأوامر بصيغة JSON لتسهيل التعامل معها برمجياً عبر أدوات مثل jq.

Timeline

مقدمة عن GitButler ونظرة عامة على الواجهة

يبدأ سكوت شاكون بتقديم GitButler كأداة جديدة لإدارة الإصدارات تم تطويرها على مدار سنوات، مشيراً إلى استعارة أفكار من أداة Jujitsu. يركز العرض على واجهة سطر الأوامر (CLI) الجديدة التي تحمل الاسم المختصر "but" كبديل لتعقيدات Git التقليدية. يوضح الأمر "but status" الذي يعرض السجل المختصر للملفات المعدلة والالتزامات المحلية بشكل أكثر وضوحاً من Git. تهدف هذه الواجهة لتوفير تجربة مستخدم رسومية داخل سطر الأوامر لتسهيل تتبع التغييرات. هذا القسم يضع الأساس لفهم الفلسفة التصميمية للأداة التي تركز على الوضوح والسهولة.

إدارة الفروع المتوازية والتلقائية

يستعرض المتحدث ميزة قوية وهي القدرة على إدارة فروع مكدسة فوق بعضها البعض بشكل تلقائي تماماً. يوضح كيف يقوم GitButler بتحديث المراجع (Refs) وإعادة الترتيب (Rebasing) دون تدخل يدوي معقد كما في Git التقليدي. تظهر الميزة الأهم في إمكانية تشغيل فروع متوازية، حيث يمكن تطبيق أكثر من فرع والعمل عليها في نفس اللحظة. يوضح العرض العملي كيفية إنشاء فرع جديد والبدء في تعيين التغييرات إليه مباشرة. هذا النهج يغير طريقة تعامل المطورين مع المهام المتعددة التي تتطلب العمل على أكثر من ميزة في آن واحد.

مناطق التخزين المؤقت والالتزام المتعدد

يشرح شاكون مفهوم مناطق التخزين المؤقت (Staging areas) المتعددة، حيث يمتلك كل مكدس فرعي منطقة خاصة به. يمكن للمستخدم تخصيص ملفات محددة لفرع معين باستخدام رموز قصيرة، مما يمنع اختلاط التغييرات غير المرتبطة. يوضح العرض كيفية تنفيذ الالتزام (Commit) لملفات في فروع مختلفة بضغطة واحدة أو أمر واحد. الميزة الكبرى هنا هي التوافق التام مع Git، حيث يتم إنشاء التزامات Git فعلية يمكن دفعها (Push) للمستودعات البعيدة. هذا النظام يحل مشكلة التبديل المستمر بين السياقات المختلفة أثناء البرمجة.

مفهوم الـ Rubbing والتحكم في الالتزامات

يقدم الفيديو مصطلح "Rubbing" الذي ابتكره أحد المطورين لوصف دمج شيئين معاً لإنتاج نتيجة جديدة، مشابه لطاولة الصناعة في ماين كرافت. يستخدم الأمر "but rub" للقيام بمهام معقدة مثل إلغاء الالتزام (Soft Reset) أو تعديل التزام قديم (Amend). يوضح المتحدث كيف يمكن دمج التزامين معاً (Squash) أو نقل ملف واحد من التزام إلى آخر يسبقه أو يلحقه بسهولة. يشدد على أن هذه العمليات ممكنة في Git ولكنها صعبة جداً وتتطلب أوامر متقدمة مثل fixup. يهدف هذا الجزء لإظهار مدى قوة GitButler في معالجة محتوى الالتزامات بدقة متناهية.

الالتزامات الفارغة وميزة التحديد (Marking)

يتناول هذا القسم إنشاء التزامات فارغة باستخدام "but new"، وهو أسلوب متبع في Jujitsu لتنظيم العمل قبل البدء. يشرح ميزة التحديد (Marking) عبر الأمر "but mark"، حيث يتم تحديد التزام معين كهدف مستمر. عند تفعيل هذا الوضع، يتم توجيه أي تغييرات برمجية يقوم بها المطور تلقائياً إلى ذلك الالتزام المحدد. هذا يتيح للمطورين تحديث أجزاء معينة في سجل التاريخ (Commit history) أثناء العمل الفعلي دون الحاجة للتوقف. تعتبر هذه الميزة ثورية في الحفاظ على نظافة سجل الالتزامات بشكل ديناميكي.

سجل العمليات، التراجع، ودعم JSON

في الجزء الختامي، يتم استعراض سجل العمليات (Oplog) الذي يسجل كل حركة يقوم بها المستخدم في GitButler. يسمح هذا السجل باستخدام أوامر "undo" للتراجع عن الأخطاء أو "restore" للعودة إلى حالة محددة للمشروع بالكامل. يوضح المتحدث فائدة هذه الميزة في حالات التعارض (Conflicts) أو التجارب البرمجية غير الناجحة. كما يشير إلى ميزة تقنية هامة وهي دعم مخرجات JSON لجميع الأوامر عبر إضافة العلم "-J". هذا يسهل على المطورين بناء أدوات مخصصة أو أتمتة المهام باستخدام أدوات معالجة البيانات. ينتهي العرض بالتأكيد على أن الهدف هو جعل تجربة المطور مع Git أكثر متعة وإنتاجية.

Community Posts

View all posts