المدونة

كيفية التراجع عن التغييرات في Claude Code: /rewind وgit

Markdown

أوضاع التراجع، وقيود نقاط التحقق، وأوامر git checkout وstash وreflog، والحماية من الأوامر التدميرية. خمس طرق لاستعادة حالة سابقة.

قراءة المقال كاملًا

تجد في الوثائق معلومات عملية عن العمل باستخدام Ailoot.

ما التراجع في Claude Code، ولماذا لا تكفي ثلاثة مستويات؟

النقاط الأساسية

للتراجع في Claude Code ثلاثة مستويات: الأمر المدمج /rewind (استعادة فورية ضمن الجلسة)، وgit checkout (الاستعادة إلى آخر commit)، وgit reflog (شبكة أمان للطوارئ إذا نفّذ أحدهم git reset --hard). يتعامل كل مستوى مع فئة مختلفة من الأخطاء، ولا يتجاوز حدوده. إذا كنت تعرف /rewind وحده، فستجد نفسك مكشوفًا عند أول خطأ جسيم.

فعّلت /rewind في أسبوعي الأول من استخدام Claude Code، حين أفسد منطق المصادقة في مشروعي خلال promptين. تراجعت، وتنهدت بارتياح، ثم واصلت العمل. وبعد شهر، واجهت موقفًا آخر: كنت أكتب ترحيلًا للمخطط، وساعدني Claude، ثم أجريت commit وانتقلت إلى فرع آخر، وأدركت أنني نسيت خطوة ضرورية. لم يفدني /rewind؛ فقد أصبحت الجلسة مختلفة. أفادني git checkout إلى commit السابقة. وبعد شهر آخر، طلبت من الوكيل بالخطأ: «أعِد كل شيء إلى آخر push»، فنفّذ git reset --hard وأهدر ثلاث ساعات من العمل. أنقذني git reflog؛ فقد ظلت تجزئات commits المحذوفة موجودة.

توضح هذه القصص الثلاث مستويات الحماية الثلاثة: تعمل بطرق مختلفة، وتلتقط أخطاء مختلفة، وكلها ضرورية. يشرح هذا الدليل كل مستوى بأوامره وقيوده وأمثلته، ويوضح أيضًا كيفية إعداد المشروع مسبقًا حتى لا يُسقطه Claude من أول مرة.

مستويات التراجع الثلاثة — ما الذي يغطيه كل منها ومتى؟

المستوىالأمرما يغطيهما لا يغطيه
1. ضمن جلسة/rewind أو Esc Escالملفات التي غيّرها Claude عبر أدواته؛ سجل المحادثةأوامر Bash، والمحررات الخارجية، وترحيلات قاعدة البيانات
2. قبل commitgit checkout . أو git stashجميع التغييرات غير المعتمدة في الملفاتcommits التي اعتُمدت
3. كارثةgit reflog + git reset --hard <hash>commits التي حذفها reset --hard أو force-pushأوامر Bash التدميرية (rm، وترحيلات قاعدة البيانات)

سنستعرض الآن كل مستوى: ما الذي ينبغي فعله تحديدًا، وما المزالق، وكيفية الإعداد بحيث لا يكون هناك ما يستدعي التراجع لأن شيئًا لم ينكسر.

كيف تستدعي /rewind: بكتابة الأمر أم بالضغط على Esc مرتين؟

النقاط الأساسية

هناك طريقتان لفتح قائمة Rewind في Claude Code. الأولى كتابة /rewind في حقل الإدخال. والثانية الضغط على Esc مرتين عندما يكون حقل الإدخال فارغًا. إذا كان في الحقل نص، فإن الضغط مرتين على Esc يمسحه أولًا ويحفظ محتواه في سجل الإدخال؛ ثم يؤدي الضغط مرتين مرة أخرى إلى فتح القائمة. الأمر /rewind له الاسم البديل /checkpoint.

بعد كل استجابة، يلتقط Claude تلقائيًا لقطة لجميع الملفات التي عدّلها في تلك الجلسة. تُخزّن اللقطات في ~/.claude/file-history/{sessionId}/ وتُحتفظ بها لمدة تصل إلى 30 يومًا. اللقطات تزايدية؛ فلا تُحفظ الملفات كاملة، بل الفروق بين الحالات فقط. افتراضيًا، تُخزّن حتى 100 لقطة لكل جلسة. وهذا يعني أنك، في معظم المشاريع الفعلية، تملك في أي لحظة سجلًا كاملًا لكل تغييرات Claude خلال يوم العمل.

لفتح قائمة التراجع، اضغط على Esc مرتين عندما يكون حقل الإدخال فارغًا:

[user-input is empty]
> _

[press Esc, Esc]

Rewind to which message?
  1. Create a migration for the User table          (3 files changed)
  2. Add the lastLoginAt field                      (1 file changed)
  3. Rewrite the authorization logic                (5 files changed)
  ...

إذا كان في حقل الإدخال نص، فإن الضغط مرتين على Esc يمسحه ويحفظه في سجل Up. يفيد ذلك إذا بدأت الكتابة ثم أدركت أنك بحاجة إلى التراجع. إليك اقتباسًا من وثائق Anthropic الرسمية:

إذا كان هناك نص في حقل prompt، فسيؤدي الضغط مرتين على Esc إلى مسحه أولًا بدلًا من فتح القائمة. يُحفظ النص الممسوح في سجل الإدخال، لذا يمكنك استعادته بسهم الأعلى بعد فتح قائمة التراجع.

— Anthropic Docs, https://code.claude.com/docs/en/checkpointing

يؤدي الأمر /rewind الوظيفة نفسها؛ إذ يفتح القائمة. وهناك اسم بديل هو /checkpoint، ويؤدي إلى المكان نفسه. يعتمد اختيار الطريقة الأنسب على العادة. أستخدم Esc Esc؛ فهي أسرع ولا ترفع يديّ عن لوحة المفاتيح.

أوضاع Rewind الستة: أيها تختار ومتى؟

النقاط الأساسية

بعد اختيار نقطة تراجع في قائمة Rewind، تظهر قائمة ثانية تضم ستة أوضاع. ثلاثة تستعيد الحالة (Restore code and conversation وRestore conversation وRestore code)، واثنان يضغطان السجل (Summarize from here وSummarize up to here)، وواحد يلغي الإجراء (Never mind). السيناريو الأكثر شيوعًا — «التراجع عن كل من الكود والمحادثة» — هو الخيار الأول.

اختر نقطة من القائمة، وستصل إلى قائمة الإجراءات. فيها ستة خيارات، لكل منها وظيفة مختلفة.

الجدول الكامل للأوضاع:

الوضعما يفعلهمتى تختاره
Restore code and conversationيعيد الملفات وسجل المحادثة إلى النقطة المحددةالسيناريو الأكثر شيوعًا: اتجه Claude إلى المسار الخطأ وأريد البدء من جديد بصياغة صحيحة
Restore conversationيعيد سجل المحادثة فقط؛ وتظل الملفات على حالها الآنالكود جيد، لكن المحادثة خرجت عن المسار؛ سأعيد الصياغة من هذه النقطة مع الحفاظ على التغييرات الحالية
Restore codeيعيد الملفات، بينما تظل المحادثة كما هيكانت بعض تغييرات Claude غير ضرورية، لكنني ما زلت بحاجة إلى سياق المحادثة (مثلًا، اتفقنا على الخطوات التالية)
Summarize from hereيضغط كل ما يأتي بعد النقطة المحددة في ملخص. لا يمس الملفاتاستهلكت جلسة تصحيح طويلة مساحة السياق؛ أحتاج إلى إخلاء مساحة مع إبقاء التعليمات الأولية كاملة
Summarize up to hereيضغط كل ما يسبق النقطة المحددة في ملخص. لا يمس الملفاتسبق مهمة محددة موجز أولي طويل؛ نضغط الموجز في رسالة واحدة ونُبقي العمل الأحدث كما هو
Never mindيغلق القائمة دون تغييراتغيّرت رأيي

ظهر خيار Summarize up to here في Claude Code v2.1.139-v2.1.142، التي صدرت في الفترة من 11 إلى 15 مايو 2026، الأسبوع 20:

يمكنك ضغط السياق المبكر من خلال قائمة Rewind باستخدام 'Summarize up to here'.

— Anthropic What's new, https://code.claude.com/docs/en/whats-new

الفرق بين Restore وSummarize جوهري. يعيد Restore الحالة إلى نقطة سابقة، متراجعًا عن كل ما حدث بعد النقطة المحددة. أما Summarize فلا يتراجع عن أي شيء؛ بل يضغط المحتوى فقط. تبقى الرسائل الأصلية في سجل الجلسة للرجوع إليها، لكن لا يبقى في السياق النشط سوى الملخص. استخدم restore عندما تريد أن يبدو الأمر «كما لو أن ذلك لم يحدث قط». واستخدم summarize عندما تريد «الإبقاء عليه من دون أن يشغل مساحة في السياق».

بعد Restore conversation أو Summarize from here، يعود النص الأصلي للـ prompt المحدد إلى حقل الإدخال؛ ويمكنك تعديله وإرساله مجددًا. أما بعد Summarize up to here، فيبقى حقل الإدخال فارغًا وتظل عند نهاية المحادثة.

ما التغييرات التي لا يتراجع عنها /rewind؟

النقاط الأساسية

لا يتتبع /rewind إلا التغييرات التي يجريها Claude عبر أدواته الخاصة لتحرير الملفات. ولا يستطيع رؤية أي شيء آخر أو استعادته. هناك ثلاث فئات من التغييرات غير المرئية: أوامر Bash (rm وmv وcp)، والتعديلات الخارجية (تعديلاتك اليدوية في IDE أو تغييرات جلسات أخرى)، والعمليات التي لا تتعلق بالملفات (ترحيلات قاعدة البيانات وgit push واستدعاءات API البعيدة).

هذا هو القيد الأساسي الذي يواجهه الناس: يعرض /rewind علامة صح خضراء ويقول «نجح التراجع»، لكن المشروع يظل معطّلًا لأن Claude لم يغيّر الملفات وحدها. لنلقِ نظرة على الحالات الثلاث.

1. لا تُتتبّع أوامر Bash. إذا نفّذ Claude rm file.txt أو mv old.txt new.txt في إحدى الجولات، فلن تُضمّن هذه التغييرات في نقطة التحقق. وتنص وثائق Anthropic صراحةً على ما يلي:

لا يتتبع نظام نقاط التحقق الملفات التي تغيّرت عبر أوامر Bash. على سبيل المثال، إذا نفّذ Claude Code الأوامر rm file.txt أو mv old.txt new.txt أو cp source.txt dest.txt، فلا يمكن التراجع عن تغييرات الملفات هذه باستخدام أمر التراجع.

— Anthropic Docs, https://code.claude.com/docs/en/checkpointing

وهذا يعني أنه إذا حذف Claude ملفًا أو نقله أو نسخه بنفسه باستخدام أداة Bash، فلن يستعيد /rewind كل شيء. قد يساعد git checkout أو الاستعادة من نسخة احتياطية، لكن ذلك يتطلب أكثر من الضغط على مفتاحين.

2. لا تُلتقط التعديلات الخارجية. إذا فتحت ملفًا يدويًا في VS Code وعدّلته، أو غيّرت جلسة Claude ثانية الملفات نفسها بالتوازي، فلن تتمكن الجلسة الأولى من رؤية تلك التغييرات. تُلتقط لقطة نقطة التحقق عندما ينهي Claude جولة في الجلسة الحالية. وما يحدث بين الجولات يقع خارج نطاق مسؤوليته.

3. لا تغطي هذه الميزة العمليات التي تقع خارج الملفات إطلاقًا. يغيّر ترحيل Prisma المطبّق عبر npx prisma migrate dev مخطط قاعدة البيانات؛ ولن يتراجع عنه /rewind لأن قاعدة البيانات تقع خارج نظام ملفات المشروع. وينطبق الأمر نفسه على force-push إلى origin/main: فقد وصل commit إلى الخادم البعيد، ولن تعيده نقطة التحقق. ولا يمكن التراجع عن استدعاء API بعيد حمّل رسومًا أو حذف سجل إلا عبر آليات API نفسها.

قاعدة: إذا أثّرت المهمة في شيء خارج ملفات المشروع — مثل ترحيلات قاعدة البيانات أو git push أو واجهات API البعيدة — فضع استراتيجية تراجع منفصلة لكل أثر خارجي. يقتصر /rewind على سجل الملفات المحلي ضمن الجلسة الحالية.

ما الفرق بين /rewind وgit، ولماذا تحتاج إلى كليهما؟

النقاط الأساسية

/rewind آلية تراجع محلية ضمن جلسة Claude Code واحدة. تخزّن لقطات تزايدية لمدة تصل إلى 30 يومًا، وبحد أقصى 100 لقطة لكل جلسة. أما git فهو سجل المشروع طويل الأمد، ومشترك مع الفريق، ويشمل الفروع وتعارضات الدمج والمستودع البعيد. لا يحل أحدهما محل الآخر. تتمثل الممارسة الأفضل في إنشاء git commit عند كل مرحلة منطقية والاعتماد على /rewind بين commits.

توضح وثائق Anthropic هذا الجمع مباشرةً:

صُممت نقاط التحقق للتعافي السريع على مستوى الجلسة. أما commits والفروع والسجل طويل الأمد، فواصل استخدام نظام للتحكم في الإصدارات (مثل Git). تكمل نقاط التحقق نظام التحكم المعتاد في الإصدارات، لكنها لا تحل محله. فكّر في نقاط التحقق على أنها «تراجع محلي»، وفي Git على أنه «سجل دائم».

— Anthropic Docs, https://code.claude.com/docs/en/checkpointing

إليك الفروق في جدول واحد:

المعيار/rewindgit
مستوى التفصيلكل جولة في المحادثةكل commit
التخزينحتى 30 يومًا، وبحد أقصى 100 لكل جلسة، محليًا في ~/.claude/file-history/دائمًا، في .git/ داخل المستودع وعلى الخادم البعيد
ما يتتبعهتعديلات Claude عبر أدواته الخاصةجميع التغييرات المعتمدة
ما لا يتتبعهBash والتعديلات الخارجية والترحيلات وpushالتغييرات غير المعتمدة
الأمرأمر داخل Claudeنظام خارجي للتحكم في الإصدارات
هل يتراجع عن المحادثة؟نعملا
هل يعمل عبر الجلسات؟ضمن الجلسة نفسها فقطفي كل مكان

الجمع بينهما بسيط: كلما وصلت إلى حالة تقول فيها «هذا يعمل، ولا أريد خسارته»، أنشئ git commit. وبين commits، اعتمد على /rewind؛ فهو فوري، ولا يحتاج إلى رسالة commit، ولا يكدّس حالات وسيطة في سجل git. وعند اكتمال العمل، أنشئ commit، ويفضل أن يكون ذا معنى وذرّيًا.

لماذا لا يكفي /rewind واحد للمهمة بأكملها؟

التراجع حالة من حالات هندسة السياق. أَدِر سياق الجلسة (متى تنشئ commit، ومتى تضغط /rewind، وما القواعد التي تضعها في CLAUDE.md) لتحصل على Claude يمكن التنبؤ بتصرفاته ولا يدمّر المشروع أو يضيّع العمل.

لماذا يُعدّ git reset --hard خطيرًا عندما تطلب من Claude «العودة»؟

النقاط الأساسية

تعني عبارة «العودة» في اللغة الطبيعية «الاطلاع على السجل»، لا «تدميره»؛ وينبغي أن يقترح Claude git checkout افتراضيًا، لا reset --hard؛ وتُضبط الحماية في CLAUDE.md.

قد يؤدي طلب «حفظ الحالة الحالية والعودة إلى آخر push» إلى تنفيذ الأوامر التالية:

git stash save "WIP: Tracker enter/leave disabled + fsSyncModule fix"  # saved uncommitted changes
git reset --hard 35eb731                                                # destroyed commits d63695e..882e618

كان الأمر الأول صحيحًا؛ فقد حفظ التغييرات غير المعتمدة في stash. أما الثاني فكان تدميريًا: أعاد كتابة الفرع إلى commit 35eb731، وأصبحت جميع commits الواقعة بينه وبين 882e618 يتيمة. افتراضيًا، تبقى commits اليتيمة في .git/objects/ حتى تشغيل git gc، وهو ما يحدث تلقائيًا عادةً خلال أسبوعين. لكن إن لم تكن تعرف ما ينبغي فعله في تلك اللحظة، فقد بدأ الوقت يعمل ضدك بالفعل.

المنطق بسيط: تعني عبارات «العودة» و«الرجوع» و«الاستعادة» و«التراجع» و«الإلغاء» في اللغة الطبيعية «راجع السجل» أو «ارجع إلى مكان آمن». ولا تعني «دمّر السجل». يدمّر الأمر git reset --hard السجل؛ إذ يعيد كتابة الفرع ويزيل commits التي لم يعد الوصول إليها ممكنًا من HEAD. والبديل الآمن هو git checkout <commit>، إذ ينشئ HEAD منفصلًا يتيح لك عرض الحالة القديمة من دون المساس بالفروع.

أهم نصيحة عملية هي إجراء git commit للحالة الحالية قبل أي مهمة كبيرة، ولا سيما قبل إعادة هيكلة عدة ملفات. يحوّل commit واحد أي خطأ من Claude إلى أمر git checkout . واحد من دون خسارة العمل.

كيف ينقذك git reflog بعد reset تدميري؟

النقاط الأساسية

يعرض git reflog السجل المحلي لجميع تحركات HEAD في المستودع، حتى commits التي أُزيلت عبر git reset --hard أو force-push. تُحفظ كل حركة لمدة 90 يومًا افتراضيًا. إذا دمّر Claude (أو أنت أو شخص آخر) commits بأمر تدميري، فسيعرض git reflog تجزئاتها، ويمكنك استعادة الفرع باستخدام git reset --hard <reflog-hash>.

بعد إعادة ضبط تدميرية، شغّل الأمر git reflog فورًا:

git reflog

يبدو الخرج على النحو التالي:

35eb731 HEAD@{0}: reset: moving to 35eb731
882e618 HEAD@{1}: commit: middleware refactoring complete
d63695e HEAD@{2}: commit: leaveRemove method finalized
1f9c8a3 HEAD@{3}: commit: tracker enter/leave disabled
35eb731 HEAD@{4}: pull origin main

HEAD@{1} حتى HEAD@{3} هي تلك الـ commits «المحذوفة». لم تختفِ من مخزن كائنات git المحلي؛ بل أصبحت غير قابلة للوصول عبر الفرع فحسب. لاستعادتها:

# Create a branch from the last “destroyed” commit
git branch recovered-work 882e618

# Or switch directly
git reset --hard 882e618

بعد ذلك، سيحتوي الفرع مرة أخرى على السجل كله حتى وقوع الكارثة.

قيود reflog:

  1. محلي فقط. يُخزّن reflog في .git/logs/HEAD؛ ولا يوجد في المستودع البعيد. إذا أجريت force-push ثم حذفت نسختك المحلية من المستودع، فسيختفي reflog مع المجلد.
  2. 90 يومًا افتراضيًا. قد يزيل git gc الإدخالات الأقدم. ويمكنك ضبطه باستخدام git config gc.reflogExpire 200.days.ago.
  3. لا يغطي ما لم يكن في HEAD أصلًا. إذا كان commit موجودًا في stash وحده ثم دُمّر stash، فسيعرض reflog أحدث حالة لـ stash فقط، لا سجله الداخلي.

قاعدة للفريق: لا تشغّل أبدًا git gc --aggressive مباشرةً بعد وقوع كارثة. تحقّق أولًا باستخدام reflog واستعد العمل، ثم افعل أي شيء آخر. ولا تحذف أبدًا نسخة المستودع المحلية إلى أن تتأكد من دفع كل ما تحتاجه.

كيف تحمي مشروعًا من أوامر git التدميرية عبر CLAUDE.md؟

النقاط الأساسية

أضف إلى CLAUDE.md في مشروعك مجموعة تعليمات تحدد أوامر git التي يستطيع Claude تنفيذها بمفرده، وتلك التي تتطلب تأكيدًا صريحًا، وتلك الممنوعة ما لم يذكر المستخدم عبارة محددة بحروفها. يتعامل Claude مع CLAUDE.md على أنه prompt النظام الخاص بالمشروع ويتبع هذه القواعد افتراضيًا. وهكذا يتحول prompt واحد «خطير» إلى أمرين آمنين.

تكمن الثغرة في أن Claude لا يملك سياقًا وقائيًا افتراضيًا. فهو يفسر «العودة» على أنها git reset --hard لأنه أسلوب صالح من الناحية التقنية. أضف الحماية إلى CLAUDE.md، ملف prompt النظام الخاص بالمشروع.

قاعدة مختصرة (أدرجها في CLAUDE.md):

## بروتوكول أمان Git

- لا تشغّل أبدًا أوامر git التدميرية (push --force, reset --hard, checkout ., restore ., clean -f, branch -D) ما لم أطلب هذه الإجراءات صراحةً. فالإجراءات التدميرية غير المصرّح بها لا تساعد، وقد تؤدي إلى فقدان العمل.
- عندما أقول "roll back" أو "go back" أو "restore" أو "revert" أو "undo"، ففسّر ذلك على أنه طلب لمراجعة الحالة: استخدم `git log` أو `git diff` أو `git checkout <commit>` (ينشئ HEAD منفصلًا) أو `git stash` (يحفظ التغييرات).
- اطلب التأكيد دائمًا قبل أي أمر:
  - يغيّر موضع HEAD إلى commit مختلف على أحد الفروع
  - يعدّل سجل commits
  - قد يؤدي إلى فقدان عمل غير معتمد
  - يتضمن العلامات --hard أو --force أو --aggressive
- قبل أي أمر تدميري، اعرض مقارنة مرقّمة:
  - آمن: استخدم `git checkout <commit>` للاطلاع مؤقتًا.
  - تدميري: استخدم `git reset --hard` للتدمير نهائيًا.
- انتظر اختياري الصريح قبل التنفيذ.

قاعدة موسّعة للفريق (أضفها إلى CLAUDE.md في جذر المستودع):

## قواعد سير عمل Git

- أنشئ commit عند كل مرحلة تعمل. قبل commit لـ WIP، نفّذ `git status` و`git diff`، وأضف فقط الملفات المسماة التي راجعتها صراحة باستخدام `git add -- path/to/file`، ثم افحص الفروق المرحلية قبل التثبيت. المؤقت تذكير للمراجعة، وليس إذنًا بإضافة شجرة العمل كاملة.
- لا تستخدم أبدًا `git add .` أو `git add -A` لإجراء commits بواسطة Claude. حدّد الملفات بأسمائها فقط، بعد `git status` + `git diff`.
- قبل تنفيذ `git push --force` إلى main، توقّف واسألني. في فروع الميزات، استخدم force-push بحذر، وفقط إذا كنت متأكدًا أنني مستعد لفقدان النسخة السابقة.
- عند حل تعارضات الدمج، لا تختَر "ours" أو "theirs" فورًا؛ اعرض عليّ النسختين أولًا، ثم أقرر.
- يجب أن يحتوي `.gitignore` على `.env*` و`.claude/personal/` و`node_modules/` و`dist/`. أضفها إذا كانت مفقودة.

بعد إضافة هذه القواعد، ستؤدي عبارة «عُد إلى آخر push» إلى الرد التالي:

أرى 3 ملفات لم تُعتمد و4 commits تسبق آخر push. أمامك خياران:

  1. آمن: أنشئ فرع view-last-push باستخدام git checkout <last-push-hash>؛ سأحافظ على كل العمل، وأعرض مؤقتًا الحالة التي وصل إليها push.
  2. تدميري: git reset --hard <last-push-hash> — سأدمّر نهائيًا 4 commits والتغييرات التي لم تُعتمد. لن يمكن استعادتها إلا عبر git reflog خلال 90 يومًا. أي الخيارين تختار؟

هذه محادثة تستغرق نصف دقيقة بدلًا من أربع ساعات من العمل الضائع.

ما الطرق الخمس للتراجع في Claude Code، وكيف تختار الطريقة المناسبة؟

النقاط الأساسية

إذا حدث خطأ، فهناك خمسة مستويات بحسب شدة الموقف: /rewind (ضمن الجلسة)، وgit checkout . (التغييرات غير المعتمدة)، وgit checkout <commit> (العودة إلى commit قديم من دون فقد السجل)، وgit reset --hard <commit> (إعادة الفرع إلى نقطة سابقة مع فقد commits التي تسبقها)، وgit reflog + الاستعادة (كارثة اختفى فيها كل شيء). كل مستوى أشد وأخطر من سابقه.

في سيناريو «أفسد Claude المشروع وأحتاج إلى استعادته بسرعة»، اصعد هذا السلم من أدنى درجاته. ابدأ دائمًا بالمستوى 1.

المستوى 1. /rewind — تراجع فوري ضمن الجلسة.

اضغط Esc Esc أو اكتب /rewind. اختر النقطة التي تسبق الخطأ. اختر وضعًا (غالبًا Restore code and conversation). وبعد لحظة تعود إلى الماضي ويمكنك البدء من جديد. يغطي 80% من حالات «نفّذ Claude الشيء الخطأ».

المستوى 2. git checkout . — التراجع عن جميع التغييرات غير المعتمدة.

git diff                    # first see what actually changed
git checkout .              # undo all uncommitted changes in all files
# or selectively:
git checkout -- path/to/file.ts   # only one file

يفيد عندما لا يعمل /rewind (مثلًا، إذا عدّل Claude الملفات عبر Bash)، أو حين تحتاج إلى التراجع عن تغييرات خارج سجل الجلسة. ستختفي نهائيًا جميع التغييرات التي لم تُعتمد. إذا كنت قد تندم على ذلك، فنفّذ git stash أولًا (راجع المستوى 2.5).

المستوى 2.5. git stash — ضع تغييراتك على الرف.

git stash save "might still need this"
# return to a clean state (without changes)
# ...
# if you change your mind—restore from stash:
git stash pop

حل وسط جيد بين «فقدانها إلى الأبد» و«تركها كما هي». يبقى stash محليًا إلى أن يُمسح صراحةً.

المستوى 3. git checkout <commit> — العودة إلى commit قديم من دون فقد السجل.

git log --oneline               # find the hash of the right commit, e.g. abc1234
git checkout abc1234            # detached HEAD—view without changing anything
# like the state? create a branch from it:
git checkout -b recovery abc1234
# return:
git checkout main

هذه «عودة مؤقتة» آمنة. لا يغيّر HEAD المنفصل الفرع؛ فيظل عملك الحالي في main (أو أي فرع كنت تعمل عليه) سليمًا. إذا أردت العمل على هذه الحالة، فأنشئ فرعًا.

المستوى 4. git reset --hard <commit> — إعادة الفرع إلى نقطة سابقة.

⚠️ تدميري. تصبح commits التي تسبق التجزئة المحددة يتيمة.

git reflog                                  # note the hash of the current state
git reset --hard abc1234                    # rewrite the branch
# found a mistake? return through reflog:
git reset --hard HEAD@{1}                   # to where you were before the reset

استخدمه فقط إذا كنت متأكدًا من أنك لا تحتاج إلى commits التي تسبق ذلك الموضع. وافحص git reflog دائمًا قبل reset حتى تعرف إلى أين تعود إذا غيّرت رأيك.

المستوى 5. git reflog + الاستعادة — سيناريو كارثي.

نفّذ أحدهم (Claude أو أنت أو زميل) بالفعل git reset --hard أو force-push ومَحا العمل. ماذا تفعل؟

git reflog                                          # look for the last hash before the disaster
git branch recovered HEAD@{N}                       # create a branch from it
git checkout recovered                              # switch to it
git diff main                                       # compare with the current state
git checkout main && git merge recovered            # restore into main, if you're sure

إذا كان reflog قد مُحي بالفعل (بعد 90 يومًا افتراضيًا)، فالملاذ الأخير هو git fsck --lost-found، الذي يعرض commits المعلّقة في .git/objects/. يشبه ذلك التنقيب الأثري، لكنه ينجح أحيانًا.

قاعدة اختيار المستوى:

ما الذي حدثالمستوى
أعاد Claude كتابة 3 ملفات على نحو خاطئ1. /rewind
جرّبت التغيير ولم يعجبني، ولا تساعدني الجلسة2. git checkout .
أفسدت الأمر يدويًا، ولا أريد خسارته، وقد أستعيده2.5. git stash
أجريت commit وأحتاج إلى الرجوع commit واحدة3. git checkout <commit>
أنا متأكد أنني لا أحتاج إلى commits التي تسبق الموضع الحالي4. git reset --hard
محوت العمل بالفعل بأمر تدميري5. git reflog

كيف تحمي مشروعًا بحيث لا يكون هناك ما يستدعي التراجع؟

النقاط الأساسية

أفضل تراجع هو الذي لا تحتاج إليه. ثلاث قواعد للحماية: راجع التقدم كل 30 دقيقة وثبّت مرحلة تعمل بإضافة المسارات المراجعة فقط صراحة؛ وضع السطرين المطلوبين .claude/personal/ و.env* في .gitignore؛ ونفّذ التجارب الكبيرة في فرع منفصل باستخدام git checkout -b experiment-<name>. يضيق ذلك فجوة الاستعادة للملفات المثبتة؛ أما الأنظمة الخارجية والعمل غير المثبت فيحتاجان إلى خطة استعادة مستقلة.

القاعدة 1. أنشئ commit كل 30 دقيقة.

لا تنتظر حتى «تنتهي المهمة». أنشئ commit لكل خطوة وسيطة تعمل. يمكن أن تكون رسائل commit أي شيء؛ المهم أن يتمكن Claude (أو أنت) من العودة إلى حالة صالحة للعمل باستخدام أمر git checkout واحد.

# at the beginning of a task
git status                        # inspect all staged and unstaged paths
git diff                          # review the changes
# Replace this example path with the actual file you reviewed.
git add -- path/to/file.ts
git diff --cached                 # verify exactly what will be committed
git commit -m "wip: starting User schema migration"

# after 30 minutes (or after the first working iteration)
git status
git diff
git add -- path/to/file.ts         # actual reviewed path, not a directory wildcard
git diff --cached
git commit -m "wip: User schema is ready, migration applied locally"

# at the end of the task—a meaningful commit
git reset --soft HEAD~2           # combine the three wip commits into one
git commit -m "feat(auth): add lastLoginAt field to User table"

إذا أضفت تذكير PostToolUse، فأبق قاعدة المراجعة وإضافة المسارات الصريحة نفسها. لا تحول المؤقت إلى commit تلقائي دون فحص؛ فقد تدخل تعديلات غير مرتبطة أو ملفات مرحلية سابقة في commit.

القاعدة 2. الحد الأدنى من .gitignore.

يجب أن توجد الأسطر التالية في جذر المشروع:

# secrets
.env
.env.local
.env.*.local

# local Claude Code settings (not pushed to the team repository)
.claude/personal/
.claude/sessions/
.claude/file-history/

# dependencies and build
node_modules/
dist/
.next/
build/

أحتفظ بمجلد .claude/personal/ لتجاربي وملاحظاتي الخاصة، ويجب ألا يُضمّن في المستودع المشترك. أما .claude/sessions/ و.claude/file-history/ فهما للتخزين المحلي لـ Claude Code؛ لا مكان لهما في المستودع، ويشغلان مساحة كبيرة ويرتبطان بجهاز معين.

القاعدة 3. نفّذ التجارب في فرع منفصل.

إذا كانت المهمة كبيرة (إعادة هيكلة أكثر من 10 ملفات، أو الانتقال إلى قاعدة بيانات جديدة، أو إعادة كتابة وحدة)، فلا تنفذها على الفرع الرئيسي:

git checkout -b experiment/auth-rewrite
# work, commit every 30 minutes
# if it works:
git checkout main
git merge experiment/auth-rewrite
# if it doesn't:
git checkout main
git branch -D experiment/auth-rewrite     # delete the branch
# that's it, the main branch is intact

تحوّل هذه العادة البسيطة عبارة «أفسد Claude المشروع» إلى «أفسد Claude فرعًا واحدًا، فحذفته وسنبدأ من جديد».

القاعدة 4. استخدم git tag قبل العمليات الخطيرة.

أنشئ وسمًا قبل ترحيل قاعدة بيانات أو إعادة هيكلة كبيرة أو تحديث اعتماد:

git tag pre-prisma-migration-v2
# work
# something went wrong:
git reset --hard pre-prisma-migration-v2
# or just take a look:
git checkout pre-prisma-migration-v2

الوسم مؤشر مُسمّى إلى commit، ولن تفقده حتى عند تنظيف reflog.

ما الخطوة التالية: ما علاقة التراجع بهندسة السياق؟

النقاط الأساسية

التراجع ليس مهارة منفصلة، بل جزء من إدارة سياق جلسة Claude Code. عندما تعرف متى تضغط /rewind ومتى تنشئ git commit ومتى تستخدم git stash، فأنت تدير سير عمل كاملًا، لا أمرًا واحدًا. هذا جزء من Context Engineering. من دونها، يتصرف Claude كمساعد عادي؛ ومعها، يصبح أداة يمكن التنبؤ بها.

توفر مستويات التراجع الثلاثة البنية التحتية لمهارة واحدة: معرفة كيفية استعادة حالة عند حدوث خلل. وهذه المهارة محدودة بمفردها، لكنها تصبح أكثر أهمية عند جمعها بأدوات أخرى لهندسة السياق.

لا يتيح Plan Mode كتابة الكود فورًا؛ إذ تأتي الخطة أولًا، ثم التأكيد، ثم التنفيذ. إنه تراجع وقائي: لن تكتب ما ستضطر إلى التراجع عنه لاحقًا لأن الخطة روجعت مسبقًا. اقرأ المزيد في دليل Plan Mode في Claude Code.

يضع CLAUDE.md قواعد يحترمها Claude افتراضيًا، بما فيها بروتوكول أمان Git الذي تناولناه أعلاه. وهذه حماية وقائية من الأوامر التدميرية.

يمنح Second Brain Claude ذاكرة بالمشروع بين الجلسات؛ فيعرف الكود الموجود ومنطق العمل والاتفاقات السابقة. وكلما زادت الذاكرة، قلّ احتمال أن يفعل الشيء الخطأ.

Skills والوكلاء الفرعيون هم منهجيتك مكتوبة في صورة كود. إذا أُدرج سير عمل Git الصحيح في Skill، فلن ينفّذ أي وكيل فرعي git reset --hard من دون تأكيد.

وكل ذلك معًا هو Context Engineering. أدر السياق قبل prompt، لا أثناءه. اقرأ المزيد في ما هندسة السياق.

التراجع هو خط الدفاع الأخير. أما الخطوط الأربعة الأولى فهي Plan Mode وCLAUDE.md وSecond Brain وSkills. عندما تُعدّ، يصبح التراجع نادرًا وسريعًا. وإذا لم تُعدّ، يصبح طقسًا يوميًا.

يبدأ التراجع حيث ينتهي التخطيط.

افتح Ailoot.

المزيد من التفاصيل

أسئلة شائعة

هل ينبغي لنقطة حفظ WIP استخدام git add .؟

لا. نفّذ git status وgit diff، وأضف الملفات المسماة التي راجعتها فقط، ثم افحص git diff --cached قبل commit. لا تأذن نقطة الحفظ الدورية بإدراج تغييرات غير مرتبطة أو مرحلية سابقة.

هل يعكس /rewind ترحيل قاعدة بيانات أو إجراء API بعيدًا؟

لا. يقصر الدليل نقاط الحفظ على تعديلات الملفات المدعومة في الجلسة. تحتاج آثار قاعدة البيانات وGit البعيد وAPI إلى خطوات استعادة منفصلة؛ واستخدم Git أو نسخة احتياطية للملفات خارج تغطية نقطة الحفظ.

جميع المقالات