Jujutsu مقابل git: زر التراجع الذي لم يملكه git قط
التراجع عن rebase خاطئ، كوميت التعارضات، استنساخ واحد بالأداتين — سجلُّ المشروع مقروء لا مُشغَّل، وخطُّ الأمانة واضح.
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
- الـ0.x، بصراحة. اثنا عشر إصدارًا شهريًا يعني أيضًا اثني عشر حظًا شهريًا بالتغييرات الكاسرة. المشروع يصدر بسرعة ويقول ذلك بنفسه.
- Bookmarks تسكن خارج git. الكوميتات والملفات تستخدم تخزين git؛ وبيانات الفروع الوصفية تستخدم صيغة jj الخاصة. الاستنساخ المشترك يذرع الجسر — قطعة متحركة إضافية للفهم.
- 1,262 issue مفتوحة. مشروع بصحة جيدة، وحساب مؤجل حقيقي.
- المنكّر ما زال محقًا في شيء. التحفظ الأكثر تصويتًا في خيط HN ذاك: «قرأت عن jj مرات عدة الآن وما زلت ملتبسًا أي مسألة يحل فعلًا.» إن كانت سيرتك في git فرعًا واحدًا ودمجًا عابرًا، فسجل العمليات لن يغيّر أسبوعك. المكاسب تأتي مع الشغل المكدّس، والتواريخ المتعارضة، وأيام التراجع المتوالية.
هل تبدَّل؟
الحكم، وخط الأمانة: قرأتُ السجل، ولم أشغّله.
كل رقم واقتباس هنا يأتي من المستودع وREADME وسلسلة HN — لا من طرفي.
ما يسانده السجل: جرّب jj مشتركًا على مشروع جانبي — استنساخ واحد، أداتان، صفر هجرة. معرفة git تنتقل؛ الفرق تتبنى الواحد-واحد، لأن jj يدفع كوميتات git عادية.
ما لا يسانده: هجرة صاعقة لفريق مستقر، أو تفويض أتمتة إصدار حرجة إلى أداة 0.x قبل زمن تثبيت وتروية.
فجوة التراجع حقيقية، والتصميم مساغ، والتفاعل يزيل العذر — يبقى العضلة.
هل تُقايض برهة ذاكرة عضلية يوميْن مقابل سجل تراجع يغطي الأداة نفسها؟
وسراحة — متى آخر مرة خسرتَ شغلًا بسبب reset؟ هل جبر reflog كل شيء؟
نهاية الشريطتين · لم يُجلب شيء · كل شيء محلي