■ الإجابة أولًا

‏jj يسجل كل عملية في سجل عمليات؛ jj undo يعيدك خلف rebase أو reset خاطئيْن — reflog في git لا ينقذ الكوميتات وحدها.

تخزين متوافق مع git افتراضيًا: استنساخ واحد، الأداتان — الremotes والمنصّات والCI ما زالت تعمل.

السجل يقول: جرّبه مشتركًا مع git على مشروع جانبي; ليست هجرة صاعقة — إنه 0.x، والتغييرات الكاسرة تركب الإصدارات الشهرية.

الشريطتان

اضغط عمليات. شريط الكوميتات (git) وشريط العمليات (jj) يسجلان جنبًا إلى جنب — ثم حاول التراجع عن الأخيرة.

الشريطتان فارغتان — اضغط عملية.

GIT · الreflog — كوميتات، ~90 يومًا

    الreflog لا يملك رأيًا في تسلسل الأوامر الذي أنتج الخدش — أنت تختار الأمر العكسي: reset؟ revert؟ cherry-pick؟

    JJ · سجل العمليات — كل عملية

      «لأن كل شيء مسجل، يمكنك التراجع عن الخطأ الذي ارتكبته للتو بيسر» — سطر الREADME نفسه. jj op log · jj undo.

      قصة التراجع في git تفترض أنك ستختار الأمر الصحيح. قصة jj تفترض أنك لن تختاره.

      ما هو jj، بحسب السجل

      ‏jj نظام إدارة إصدارات متوافق مع git: 31,796 نجمًا على GitHub، 376 مساهمًا، أول إصدار ديسمبر 2020، وإصدار كل شهر منذ ذلك

      من v0.35 (نوفمبر 2025) إلى v0.45.1، سبتمبر 2026: اثنا عشر إصدارًا بضبط ساعة.

      «متوافق مع git» هي الجزء الذي يفلت من الناس: jj يستخدم مستودع git تخزينًا افتراضيًا — الكوميتات والملفات تسكن بصيغة git. الاستنساخ والremotes والمنصّات والCI ما زالت تعمل.

      البحث «jujutsu مقابل git» يضع الإطار الخاطئ: jj هو واجهة جديدة مبرشومة على التخزين الذي تثق به أصلًا.

      (Meta راهنت عكسًا على Sapling — تخزينها الخاص — ودفعت أكثر من جانب بيئة git.)

      تعارضات يمكنك كوميته

      نعم — التعارضات هنا كائنات من الأولى بالرتبة، وهذا أهم من قصة التراجع. git يعامل تعارض الدمج كحالة مؤقتة في شجرة العمل: حُلّ الآن أو التمس.

      ‏jj يخزن التعارضات في التاريخ: كوميت متعارض يمكن أن يوجد، ويُكوميت، بل يُدفع.

      حُلّه لاحقًا؛ jj ينشر الإصلاح إلى كل سليل — نفس الآلية التي تعيد البرمجة لصفّك.

      «‏PRs مكدسة مع rebase متعدد الفروع بلا عناء. التعارضات أشياء حقيقية في التاريخ تُعاد إليها لاحقًا. كل شيء يُكومِت تلقائيًا، فلا أفقد عملًا بسبب reset/stash pop سيئ.» — hellcow، Hacker News عن أنماط jj (236 نقطة)

      الجملة الأخيرة هي التحفة: نسخة عمل jj هي ذاتها كوميت، تُوصَّف عند كل تغيير.

      لا stash، لأنه لا شيء يحتاج إلى stash — تغيير الفرع يحمل شغلك في صورة كوميت.

      متحوّل آخر في وكر لا يعرف إلا git: «صفر مشكلات.»

      ما يقوله السجل ضد jj

      هل تبدَّل؟

      الحكم، وخط الأمانة: قرأتُ السجل، ولم أشغّله.

      كل رقم واقتباس هنا يأتي من المستودع و‏README وسلسلة HN — لا من طرفي.

      ما يسانده السجل: جرّب jj مشتركًا على مشروع جانبي — استنساخ واحد، أداتان، صفر هجرة. معرفة git تنتقل؛ الفرق تتبنى الواحد-واحد، لأن jj يدفع كوميتات git عادية.

      ما لا يسانده: هجرة صاعقة لفريق مستقر، أو تفويض أتمتة إصدار حرجة إلى أداة 0.x قبل زمن تثبيت وتروية.

      فجوة التراجع حقيقية، والتصميم مساغ، والتفاعل يزيل العذر — يبقى العضلة.

      هل تُقايض برهة ذاكرة عضلية يوميْن مقابل سجل تراجع يغطي الأداة نفسها؟

      وسراحة — متى آخر مرة خسرتَ شغلًا بسبب reset؟ هل جبر reflog كل شيء؟

      ■ ختم الأمانة قرأتُ السجل، ولم أشغّله. مُختبَر على: السجل العام — ‏jj v0.35 → v0.45.1 · ‏reflog في git 2.4x. سُجِّل 2026-09-29، جُدِّد 2026-10-04. النجوم والمساهمون وإيقاع الإصدارات وشرط الbookmarks والاقتباسان من HN وسطر الREADME كلها من المستودع و‏README والإذان العام المرتبط. الشريطتان أعلاه مخطط تصميم لا مقياس — تبيّنان ما يسجله كل سجل، دون أي زمن مدَّعى.

      نهاية الشريطتين · لم يُجلب شيء · كل شيء محلي