Jujutsu (jj) - نظام التحكم في الإصدارات المتوافق مع Git
Jujutsu (jj) هو نظام تحكم في الإصدارات حديث متوافق مع Git — يستخدم مستودع Git كخلفية له، لذا يمكنك تبنيه على المستودعات الموجودة والتعاون مع الزملاء الذين يستخدمون Git. نموذجه مختلف وأبسط للكثيرين: نسخة العمل هي التزام بحد ذاتها (لا توجد منطقة تجهيز منفصلة)، والتضاربات هي كائنات من الدرجة الأولى يمكنك الالتزام بها وحلها لاحقاً، وكل عملية يتم تسجيلها في سجل العمليات الذي يمكنك التراجع عنه. لا توجد فروع بمعنى Git بشكل افتراضي؛ تعمل مع التغييرات المعرّفة بواسطة معرّفات التغيير المستقرة.
التثبيت
| المنصة | الأمر |
|---|
| Cargo | cargo install --locked jj-cli |
| macOS (Homebrew) | brew install jj |
| Arch Linux | sudo pacman -S jujutsu |
| Nix | nix profile install nixpkgs#jujutsu |
| Windows (Scoop) | scoop install jujutsu |
| التحقق | jj --version |
الإعداد
| الأمر | الوصف |
|---|
jj config set --user user.name "Your Name" | اضبط اسمك |
jj config set --user user.email "you@example.com" | اضبط بريدك الإلكتروني |
jj git init --colocate | هيّئ jj في مستودع Git موجود (يحتفظ بـ .git) |
jj git clone <url> | استنسخ مستودع Git مع jj |
jj git init | إنشاء مستودع jj جديد (خلفية أصلية) |
المفاهيم الأساسية
| المصطلح | المعنى |
|---|
| التغيير | تغيير منطقي مع معرّف تغيير مستقر (يبقى عند إعادة الكتابة) |
| الالتزام | لقطة؛ نسخة العمل دائماً التزام (@) |
@ | التزام نسخة العمل الحالية |
| Revset | لغة استعلام لتحديد الالتزامات |
| سجل العمليات | سجل العمليات في المستودع، كل منها قابل للتراجع |
| الإشارة المرجعية | مؤشر مسمى (الخريطة إلى فرع Git عند الدفع) |
سير العمل اليومي
| الأمر | الوصف |
|---|
jj status | اعرض تغييرات نسخة العمل |
jj log | اعرض الرسم البياني للالتزامات |
jj diff | فرق التزام نسخة العمل |
jj describe -m "msg" | اضبط/استبدل رسالة الالتزام الحالي |
jj new | ابدأ تغييراً جديداً على رأس الحالي |
jj new <rev> | ابدأ تغييراً جديداً على رأس التزام محدد |
jj edit <rev> | اجعل التزاماً موجوداً نسخة العمل |
jj commit -m "msg" | صف @ وابدأ تغييراً جديداً (مثل Git) |
نقل وتحرير السجل
| الأمر | الوصف |
|---|
jj squash | انقل التغييرات من @ إلى الأب الخاص به |
jj squash -i | اختر بشكل تفاعلي ما الذي ستدمجه |
jj split | انقسم الالتزام الحالي إلى اثنين |
jj rebase -d <dest> | أعد بناء التغيير على الوجهة |
jj abandon <rev> | اترك التزام |
jj duplicate <rev> | انسخ التزام في مكان آخر |
ميزة القاتل: التراجع
| الأمر | الوصف |
|---|
jj op log | اسرد كل عملية تم تنفيذها |
jj undo | تراجع عن العملية الأخيرة |
jj op restore <id> | استعيد المستودع إلى حالة عملية سابقة |
لأن كل أمر هو عملية، يمكن التراجع عن كل شيء تقريباً — بما في ذلك إعادة البناء والتخلي.
الإشارات المرجعية وتشغيل Git
| الأمر | الوصف |
|---|
jj bookmark create main -r @ | إنشاء إشارة مرجعية (≈ فرع Git) |
jj bookmark set main -r @ | انقل إشارة مرجعية إلى التزام |
jj git fetch | استحضر من الجهاز البعيد Git |
jj git push | ادفع الإشارات المرجعية إلى الجهاز البعيد Git |
jj git push -c @ | أنشئ فرع بعيد من التغيير الحالي |
Revsets (تحديد الالتزامات)
| Revset | تحديد |
|---|
@ | التزام نسخة العمل |
@- | أب نسخة العمل |
main | الالتزام الذي تشير إليه الإشارة المرجعية |
mine() | التزاماتك |
ancestors(@) | جميع الأسلاف من @ |
jj log -r "description(glob:''fix*'')" | الالتزامات التي تطابق رسالتها |
سير العمل الشائع
# تبني jj في مستودع Git موجود، استمر في العمل مع الأجهزة البعيدة لـ Git
jj git init --colocate
jj log
# قم بإجراء تغيير بدون تجهيز — فقط عدّل الملفات، ثم صفها
# (الملفات ذات لقطة تلقائية في @)
jj describe -m "Add feature"
jj new # ابدأ التغيير التالي
# عوه — تراجع عن آخر شيء فعلته (حتى إعادة بناء)
jj undo
# ادفع التغيير الحالي كفرع للمراجعة
jj bookmark create feature -r @
jj git push -c @
jj مقابل Git
| الجانب | Jujutsu (jj) | Git |
|---|
| منطقة التجهيز | لا توجد (نسخة العمل هي التزام) | Index/staging |
| التضاربات | من الدرجة الأولى، قابلة للالتزام | يجب حل قبل المتابعة |
| التراجع | عام عبر سجل العمليات | Reflog (جزئي) |
| الفروع | الإشارات المرجعية (اختيارية) | الفروع (مركزية) |
| الخلفية | متوافقة مع Git | Git |
الموارد