الاستعادة وسجل المراجع
نادرًا ما يضيّع git شيئًا. الصعب هو العثور عليه مرة أخرى.
سجل المراجع
كل حركة لـ HEAD — ولكل فرع — مع ما سبّبها: سحب، أو إعادة تعيين، أو إعادة
أساس، أو تعديل، أو جلب قسري. ومن أي مدخل ماضٍ تستطيع أن تسحبه، أو تتفرّع
منه، أو تعيد التعيين إليه صلبًا.

هذا هو زر «لقد أعدت تعيين الفرع الخطأ للتو».
لقطات العمل الجاري
العمل غير المُلتزَم به هو الشيء الوحيد الذي لا يستطيع سجل المراجع إنقاذه، ولذا
يلتقط Gitcito لقطة له: شجرة العمل كاملةً — الملفات المعدَّلة والمحضَّرة وغير
المتتبَّعة — تُلتزَم عبر فهرس مؤقت يُرمى بعدها وتُثبَّت تحت
refs/gitcito/wip. لا يُمَسّ فهرسك الحقيقي ولا قائمة مخابئك.

ثلاثة أشياء تلتقط واحدة:
| المُطلِق | متى |
|---|---|
| الحارس | تلقائيًا، قُبيل أي إجراء هدّام مباشرةً — تجاهل، أو تنظيف، أو إعادة تعيين صلبة، أو استعادة من التزام. مفعَّل افتراضيًا؛ بدّله من حوار اللقطات. |
| المؤقّت | كل 5 / 15 / 30 دقيقة ما دام المستودع مفتوحًا. |
| يدويًا | زر التقط لقطة الآن. |
الحارس هو الأهم: اللحظة التي يضيع فيها العمل عادةً إلى الأبد هي الثانية التالية لتجاهل لم تقصده. ومع تفعيل الحارس تصير تلك الحالة لقطة — افتح القائمة، وانقر الاستعادة، وتنفّس من جديد.
اختر لقطة لترى الملفات التي التقطتها، وعايِن تغيير أي ملف، واستعِد ملفًا واحدًا أو الشجرة كلها. الاستعادة تنسخ الملفات من اللقطة فوق النسخ الحالية — وتُلتقط لقطة حارس أولًا، فالاستعادة نفسها قابلة للتراجع.
حدود تستحق المعرفة. نبضة مؤقّت أو حارس لا تجد جديدًا لا تسجّل شيئًا.
والاستعادة تكتب فوق الملفات وتعيد إنشاءها، لكنها لا تحذف أبدًا ملفًا أنشأته
بعد اللقطة. والملفات المتجاهَلة لا تُلتقط. واللقطات مراجع محلية مخفية: لا
تُدفع أبدًا، وهي في مأمن من git gc، ويُحتفظ بأحدث 50 منها.
التنصيف الموجَّه
علّم الالتزامات جيدةً وسيئة، وشاهد النطاق يضيق، واهبط على أول التزام سيئ. ويتتبع Gitcito كم خطوة تبقّت، فتعرف إن كنت على بعد سؤالين من الجواب أم عشرة.

دع أمرًا يقرر
متى بُذر النطاق، سلّم دع أمرًا يقرر البحث كله إلى git bisect run. يسحب git
كل مرشح، ويشغّل أمرك، ويقرأ رمز خروجه:
| رمز الخروج | يعني |
|---|---|
0 |
جيد — العلة ليست هنا |
125 |
لا يمكن اختبار هذا؛ تخطَّه |
| أي شيء آخر | سيئ |
ومجموعة الاختبارات تتكلم تلك اللغة أصلًا، ولهذا يكون npm test عادةً هو الجواب
كله. ويعرض Gitcito سكربتات هذا المشروع نفسها كتعبئات بضغطة واحدة، ويبثّ الناتج
أثناء التشغيل، ويهبط على أول التزام سيئ دون أن تجيب عن سؤال واحد.

ما ينبغي الانتباه له. الأمر يعمل على كل التزام يختبره git، فالأمر الذي ينشر أو يُصدر أو يكتب خارج المستودع سيفعل ذلك عدة مرات. اجعله شيئًا لا يفعل إلا القراءة والإبلاغ. وإيقاف يقتل التشغيل ويترك الجلسة مفتوحة، فتستطيع أن تواصل التعليم بيدك؛ أما إحباط فينهي التنصيف كليًا.
والأمر الذي يفشل لسبب غير ذي صلة — تبعية مفقودة عند تلك النقطة من السجل مثلًا —
يعلّم التزامًا جيدًا بأنه سيئ ويرسل البحث إلى المكان الخطأ. والخروج بالرمز 125
من سكربت غلاف هو مخرج git من ذلك.
ملف قفل متروك
يضع git ملف .lock بجوار ما هو على وشك كتابته ويزيله حين تنتهي الكتابة. أما عملية
تموت وهي ممسكة به — محرّر انهار، طرفية أُغلقت أثناء git commit، عملية fetch قُتلت
وهي تقلّم المراجع البعيدة — فتترك القفل خلفها، ومنذ تلك اللحظة تفشل كل كتابة بالسطر
نفسه:
error: could not delete references: cannot lock ref 'refs/remotes/origin/x':
Unable to create '…/refs/remotes/origin/x.lock': File exists.
المستودع ليس تالفًا. هناك ملف يقف في الطريق، لا أكثر.
يعيد Gitcito المحاولة بضع مرات أولًا، لأن قفلًا يمسكه git قيد التشغيل يتحرر عادةً خلال أجزاء من الألف من الثانية. وإن لم يتحرر، فتح الفشل نافذة بدل جدار من النص: كل قفل ما زال على القرص، وعُمر كل واحد منها، وزر واحد يزيلها ويعيد تنفيذ العملية التي فشلت.
العمر هو الحجّة كلها. يُفترض أن قفلًا أصغر من 30 ثانية يعود إلى git ما زال يعمل، ويرفض Gitcito حذفه — ويعرض الانتظار وإعادة المحاولة بدلًا من ذلك. أما الأقدم فتُعرض للإزالة، من الأقدم فالأحدث، وتقول النافذة بصراحة ما ينبغي التحقق منه قبل الموافقة: ألا يكون أي محرّر أو طرفية أو عميل Git آخر يعمل في هذا المستودع الآن. سحب قفل من تحت كتابة حيّة هو الطريق إلى فهرس ممزّق.
يغطي المسح دليل git الخاص بالمستودع ودليله المشترك، فتُكتشف أقفال شجرة العمل المرتبطة أيضًا. أما الوحدات الفرعية فتُتخطى — فهي تخص مستودعًا آخر، وتُنظَّف بفتحه.
التراجع / الإعادة
معظم العمليات تدفع مدخلًا إلى مكدس التراجع، فـ ⌘Z يعكس آخرها حيث يسمح git بذلك.
انظر أيضًا: ما الذي تغيّر منذ · المخابئ