jj ب0.46، القراءة الثانية: منحدر الدخول اتسع، واكتسب الـundo حواجز
أسبوعان، +216 نجمة وإصدار واحد لاحقًا: تجاور الـworktree يرخص التجرية، والـundo عبر الـworkspaces مرفوض افتراضيًا — والمنظومة ما تزال مستحقة.
■ space · قراءة الفرق — jujutsu v0.46، المرور الثاني
صدرت v0.46.0 في 7 أكتوبر — فمساحات عمل jj تتمازج الآن عبر worktrees git حقيقية، ويرفض jj undo بين المساحات افتراضيًا. أأمن، لا أجدد فقط.
الأسبوعان، من قراءتَينا نحن: من 31 796 إلى 32 012 نجمة، إيقاعُ إصدارٍ كل 34 يومًا، ومستودعٌ دُفع صباحَ كتابة هذا.
مستودعك يبقى git بنسبة 100 %. ففي التمازج، يرى GitHub وزملاؤك مستودعَ git عاديًّا تمامًا — وتكلفة النقلة ذاكرةٌ عضلية لا هجرة.
والكذبة التي يرفضها هذا الرقي: أن رقم إصدارٍ خبرٌ. نعم، معظم الإصدارات النقطية سباكة. أما v0.46.0 فليست كذلك — إنها تغيّر حساب الانتقال، وتُفسّر بياناتُ الطلب في الأسبوعين لماذا يهمّ ذلك أكثر مما يعترف به سجلّ التغييرات.
بطاقة الأسبوعين
الأرقام أولًا، لأنها الجزء الوحيد من هذا الرقي الذي لا يقدر أحدٌ على خاصمته.
| القياس | القراءة الأولى (29 سبتمبر) | القراءة الثانية (13 أكتوبر) |
|---|---|---|
| نجوم GitHub | 31 796 | 32 012 (+216 / 14 يومًا ≈ 15 يوميًّا) |
| آخر إصدار | v0.45.1 (3 سبتمبر) | v0.46.0 (7 أكتوبر — فجوة 34 يومًا) |
| آخر دفعة للمستودع | نشِط | 05:22 UTC هذا الصباح |
| قضايا مفتوحة | — | 1 260 |
النجوم تطفل، والإيقاع إشارة: إصداران خلال ستة أسابيع وسردٌ مرتبٌ للكسور، هذا مشروعٌ يُسلّم ويخبرك بما كسر. والـ1 260 قضيةً مفتوحة تُقرأ بالمثل — أداةٌ متحركة، لا مكتملة.
والإشارة الثانية يحملها سجلّنا نحن. فأكبر عائلة طلبات في عنقود git هذا الشهر ما تزال undo a commit but keep the changes — طلباتٌ في تزايد 100 % أسبوعًا بعد أسبوع، ونقراتٌ تكاد تكون صفرية، لأن الجواب git الصادق يمتد على ثلاثة أوامر، والقرّاء يشعرون بذلك. ولم ينتظر الطلبُ على undo فقر jj. وهو لا ينتظر قط.
JUJUTSU أمام GIT: جدول الـundo
شرحت القراءة الأولى النموذج — فالنسخة العاملة تبريزة، وكل عمليةٍ تكتب في سجل العمليات، والتعارضات مواطنو المرتبة الأولى. وما تجاوزته، وما تقول بياناتُ البحث إن الناس يحتاجونه فعلًا في السادسة صباحًا، هو الجدول على مستوى العبارات: المهمة، مكتوبةً كما يكتبها الباحثون، باللهجتين معًا.
| المهمة | git (التعويذة) | jj (العملية) |
|---|---|---|
| ألغِ آخر ما قمت به | reflog، وتحوّقث، reset --soft أو reset --keep | jj undo |
| ألغِ الإلغاء نفسه | لا يوجد طريق نظيف | jj redo |
| انظر ماذا حدث للتو | git reflog | jj op log |
| راجع آخر تبريزة | git commit --amend | حرّر الملفات — تبريزةُ النسخة العاملة تراجع نفسها |
| احفظ تعارضًا لوقت لاحق | غير مسموح — خُلّه الآن أو توقّف | التعارضات تبريزات؛ خُلّها متى أردت |
في git، الإلغاء كشفٌ أثري — تحفر في الـreflog، وتجد القرقوف، وتعيد البناء. وفي jj لم تُدفن الشريط يومًا: فالإلغاء عملية على سجل العمليات. تنقيبٌ مقابل زر إعادة لف.
تصوّر: يمنحك git مسجّل الرحلات — مركبًا خلف الطائرة، يُقرأ بعد الانهيار. وقد وضعه jj على لوحة العدادات وأوصله بزر إعادة لف.
V0.46.0: التغييران المهمان
مساحات عملٍ تتمازج عبر worktrees git حقيقية. فالـjj workspace add --colocate (أو الإعداد git.colocate) يضع مساحة عمل jj جانبَ checkout git عادي دون أن يستملك الكلون.اقرأ ذلك بِأن منحدرَ الدخول اتسع: يستطيع فريقٌ أن يُشغّل مساحة عمل jj بجوار checkout git على الجهاز نفسه والمستودع نفسه، ويقارن — وهذه بالضبط التجربة التي طالب بها حكمُ القراءة الأولى. وهي تستند إلى git worktree add --orphan، ولهذا يعلو الحد الأدنى للـgit إلى 2.42.0.
undo يعرف حده. jj undo وjj redo يرفضان الآن لمس عمليات مساحة عملٍ أخرى ما لم تمرّر --allow-cross-workspace. أداةٌ كلُّ عروضها "الإلغاء آمن" تُحكِم الحواجز حول الإلغاء، وهذا اجتيازُ امتحان الثقافة. وتُقرأ بقية الملاحظات بالمثل: jj bisect run يفحص طرفيه الجيد والرديء قبل أن يسير، وjj split كفّ عن التلاعب بجلسات المحرر.
جرِّب المسجّل دون أن تخاطر بشيء
كلونٍ يُنسى، ثلاثة أوامر، فيصير السجل حقيقيًا على جهازك — لا بقاءَ له حكرًا على الوثائق.
# in a throwaway clone — git keeps working exactly as before
jj git init --colocate
# a .jj directory now sits beside .git; the recorder is running:
jj op log
# the door out, whenever you want it:
rm -rf .jj
تحقّق: يسرد jj op log في ذلك الكلون عملياتك مع تواريخها — سطرٌ لكل أمر يعني أن السجل حقيقي.
سجلّ الصدق: ما الذي يكسر
الذاكرة العضلية أولًا. رقصة الفهرس — git add -p، وكحل الفهرس جزئيًّا — تُدعى squash وsplit في jj، يحلّان المشكلةَ نفسها بيدين مختلفتين. وفي أسبوعك الأول سوف تكتب أفعال git وتتضجر.
بصرياتُ الفريق ثانيًا. المستودعات المتمازجة تبدو gitًا عاديًّا للاستضافة وللزملاء — لكن تبريزات النسخة العاملة عند مستخدم jj لا تظهر إلا عند الدفع، وسؤال «أين عملي نصف المنجز» يجيب جوابًا يخالف ما يتوقعه أهل git. الفرقُ الصغيرة تلوي حواجبها؛ monorepo ذو الأدوات العميقة عليه الانتظار. ورفضُ الإلغاء عبر المساحات في v0.46 حدٌّ إضافي للتعلّم — عن قصد، وبصدق، الاختيار الصائب.
والرفع الشاغل بعد: الأرقام المستَعارة (benchmarks). بعد قراءتين ما زالت القضية غير مقوّمة. لا نستطيع أن نطمئنك أن rebase الجيد في jj يتفوق على rebase في git في مستودع 10 000 تبريزة — لأننا لم نُشغّله؛ فالرقم لا يشيد حتى يشيده المنبر، والقراءة الثانية لا تبدّل قراءة بطاقةٍ إلى منبر.
الحكم، مُنقَح: من يتحرك هذا الأسبوع
قالت القراءة الأولى: جرّب. فبعد أسبوعين وإصدار قدر الحساب في اتجاه واحد فقط — فقد خفضت تمازجَ worktree في v0.46 تكلفة التجربة نفسها، وصحّت بيانات الطلب. وعائلة الإلغاء التي تراقبها لوحتنا ما بردت من طلب؛ والأداة التي تجيبها بأمر واحد أطلقت مرتين. وكلما اتسع شقٌّ كهذا اتسع أكثر، وطال البعد، فسيتولى أحدٌ إغلاقه. وهذا ما يفعله jj على مستوى النموذج لا على مستوى الحفظ اللفي — ويمتد المقارنة الكاملة إلى جانب القرار الكلاسيكي الذي يهبط عليه: revert مقابل reset، التي لها الآن جواب ثالث، والجواب الثالث زر.
- المطوّرون المنفردون والفرق الصغيرة ذوو ندوب الإلغاء.
- كل من يعلّم git وقد ضاق ذرعًا من رؤية الوجوه تسقط عند reflog.
- المستودعات جارية بالوكلاء — من المسارات التي نراقبها أدق نظر — حيث كل عمليةٍ ينبغي أن تكون قابلة للإرجاع والتفتيش افتراضيًا. سجل العمليات هناك ليس رفًا؛ إنه سطح التفتيش الذي لم يسلّمه git أبدًا.
- سلاسل أدوات git العميقة وافتراضات CI الثقيلة بالخطاطيف.
- ومن في وسط هجرة — لا شيء من هذا يتحمل جوّه الطيران.
- و انتظرو المنظومة القياسية. ستشغّل القطعة jj القادمة في هذا الموقع jj مقابل git على مستودع حقيقي، وتطبع الرقم الأقبح أولًا — بطاقة الأسبوعين اشترت حق الشك مرةً واحدة تمامًا.
سؤالان قبل ذلك المنبر: هل أخلّتك إسعافات reflog في أخطر اللحظات الممكنة — وإذا شغّلت jj بمزاجٍ ماهر هذا الشهر، فما الذي ينكسر أولًا؟ أخبرنا ما الذي نختبره.
نهاية القراءة الثانية · لم يُجلب شيء · كل شيء محلي