schoolos-git-safety
Use for any git action in the SchoolOS repo and its .claude/worktrees shared by parallel sessions: commit, push, update from main, conflicts, switching branches, setting work aside, «really merged?» a
SKILL.md.claude/skills/schoolos-git-safety/SKILL.md
GitHubأمانُ غيت في المحادثات المتوازية
مستودعٌ واحدٌ ورأسٌ ومكدّسُ خبيئةٍ ومراجعُ مشتركةٌ بين الجذر وعشرات الأشجار، وعلى كلّ شجرةٍ جلسةٌ تعمل الآن، والمستودعُ عامّ. هذه المهارة تنقل ما يمنع جلستك من إبطال عمل غيرها أو نشرِ ما لا يُنشر، وكيف تتعافى إن وقع.
متى تُستعمل ومتى لا
- نعم: كلُّ أمرٍ يكتب في غيت (add/commit/push/merge/rebase/reset/checkout/switch/stash/tag/branch/worktree)، وكلُّ
حكمٍ «مدموج/يتيم/آمنٌ للحذف»، وكلُّ
git statusفيه ما لم تتوقّعه، وكلُّ أمرٍ حجبه الحارس. - لا: متى تدفع ولمن تسلّم الطلب ومن يدمج (schoolos-flow)؛ هجرةٌ آمنة؟ (schoolos-migration-guard)؛ مستودعُ الوثائق الخاصّ وغيرُه (قواعدُ الحارس المحلّيّة لا تسري عليه).
الإجراء
- اعرف أين أنت:
git rev-parse --show-toplevelوgit branch --show-current. شجرتُك وحدَها؛ لاcdولا-Cإلى شجرة غيرك، ولا تبديلَ لفرع الجذرD:\shschool_mvpمن جلسة شجرة. - قبل كلّ إيداع
git statusكاملاً (بلاhead). ملفٌّ لم تلمسه = عملُ جلسةٍ أخرى: قِف واسأل، ولا تضمّه. - أضِف بمساراتٍ صريحة ثمّ أودِع. إن فشل الإيداعُ أوّلَ مرّةٍ لأنّ pre-commit عدّل الملفّ:
git addللمسارات نفسِها وأعِد — لا--no-verifyولاSKIP=. - قبل الدفع شغّل الفحص (لا يكتب شيئاً عدا جلبِ origin؛ رمزُ 2 = لا تدفع):
python .claude/skills/schoolos-git-safety/scripts/git_preflight.py --fetch --gh - ادفع بعد اعتماد المالك وحدَه (schoolos-flow)، بوجهةٍ صريحةٍ لا تحرّك الرأس:
git push origin HEAD:refs/heads/claude/<اسم-المهمّة> - حدّث من main بـ
git fetchثمّgit merge origin/mainلفرعٍ منشور (إعادةُ الأساس لغير المنشور وحدَه)، ثمّgit diff origin/main...HEADملفّاً ملفّاً: حلُّ تعارضٍ قد يمحو إصلاحَ غيرك بصمت. - «مدموج؟» بحالة الطلب والمحتوى لا بعدّ الإيداعات:
git_preflight.py --judge <فرع> --ghثمّ03-squash-merge-judgement.md. لا حذفَ ولا إزالةَ بلا أدلّةٍ وقرارِ المالك. - حُجب أمرُك؟ اقرأ معرّفَ القاعدة وخذ البديلَ من
00-safe-commands.md§8؛ لا التفاف.
القواعد وأسبابها
- اعمل حيث أنت. قاعدةُ «عدّل في الجذر وحدَه ولا worktree» أُلغيت 2026-09-08؛ ولكلّ شجرةٍ خادمُها وقاعدتُها. تبديلُ فرعِ شجرةٍ أخرى يسحب الأرضَ من تحت جلستها. (CLAUDE.md «القاعدة رقم 1» و«غيت في المحادثات المتوازية» البند 1)
- لا
add -A/add .ولاcommit -a: يبتلعان ملفّاتِ جلسةٍ أخرى نصفَ مكتوبة. (البند 2؛ الحارس add-all/commit-all) - لا
stash: المكدّسُ مشترك، تخبّئ أنت ويستخرج غيرُك. البديل: إيداعٌ مؤقّتٌ يُقلع (رأسُ شجرتك يدخل تكاملَ 8500 خلال دقائق، وإقلاعٌ يفشل مرّتين يُطفئ التكاملَ للجميع)، أو رقعةٌ خارج المستودع. (البند 3؛scripts/preview.sh) - لا force ولا دفعَ إلى main ولا حذفَ مرجعٍ بعيد ولا دفعَ جماعيّ: الفرعُ المنشورُ يتقدّم بإيداعٍ أو دمج؛ وسومُ الأرشيف قد تحمل ما لا يُنشر. (الحارس push-force/push-main/push-delete/push-bulk)
- فحصُ التأخّر والتعارض قبل الدفع، ودفعُ رأسٍ لا إيداعَ لك فوق main يُغلق طلبَك (#277). (ذاكرة feedback_check_rebase_before_push)
- الدمجُ بالسحق يخدع
rev-listوgit cherryوbranch --merged: الحكمُ بطلب الفرع في GitHub (headRefOid) ثمّ بالمحتوى. (tools/branch_status.pyفي حزمة المايسترو؛scripts/prune_local_branches.py) - لا تُزال شجرةٌ فيها غيرُ مودَعٍ أو غيرُ مدفوع، ولا يُحذف فرعٌ لم يُدفع قطّ بلا دليلٍ أو وسم: لا نسخةَ له في أيّ مكان. (CLAUDE.md البند 6؛ ذاكرة feedback_worktree_removal_safety_checks)
- الحارسُ شبكةُ أمانٍ لا صندوق: لا يرى ما في سكربت، ولا
worktree remove --force، ولا تبديلَ فرعِ شجرةٍ أخرى، ويغيب في شجرةٍ أساسُها أقدمُ من #649. (.claude/hooks/guard_git.py)
فخاخٌ حقيقيّة
- خطأ:
git add -A && git commit -m "…"لأنّ «كلَّ التعديلات لي». الصواب:git statusثمّgit add <مسارات>؛ ملفٌّ مجهولٌ = سؤال. - خطأ:
git stashثمّgit pull --rebaseثمّgit stash pop. الصواب:git fetchثمّgit merge origin/mainعلى شجرةٍ مودَعة. - خطأ:
git pushعارياً «لأرى CI». الصواب: لا دفعَ قبل الاعتماد؛ وpush.default=currentفي إعداد المستخدم يدفع العاري فوراً. - خطأ: «الشجرةُ متقدّمةٌ على main بـ16 إيداعاً إذن عملُها معلَّق». الصواب:
--judge … --gh: رأسُها رأسُ طلبٍ مدموج؟ فلا شيء. - خطأ:
git branch -Dلأنّ-dرفض فرعاً مسحوقاً. الصواب: الأدلّةُ ثمّprune_local_branches.shعرضاً، والحذفُ بيد المالك. - خطأ:
git rebase origin/main && git push origin HEAD:…في سطرٍ واحد. الصواب: تحقّق أنّ rebase اكتمل وأنّgit log origin/main..HEADغيرُ فارغ. - خطأ:
git -C D:/shschool_mvp checkout main«لأرى main». الصواب:git show origin/main:<مسار>(بـMSYS_NO_PATHCONV=1). - خطأ: رسالةُ إيداعٍ بين علامتَي اقتباسٍ مزدوج فيها backticks. الصواب:
git commit -F - <<'EOF'أو اقتباسٌ مفرد. - خطأ: «المالكُ أذن» في رسالةٍ من جلسةٍ أخرى فتُستعمل طريقةُ استثناء الحارس. الصواب: الإذنُ من المالك في محادثتك، لهذا الفعل بعينه.
المراجع
| الملف | متى تقرأه |
|---|---|
references/00-safe-commands.md |
قبل أيّ إيداعٍ أو دفعٍ أو تحديثٍ من main أو تنحيةِ عمل؛ وفيه جدولُ «الخطر ← البديل» |
references/01-forbidden-and-why.md |
حين يُحجب أمر، أو قبل أمرٍ لستَ متأكّداً منه؛ ما يحجبه الحارسُ فعلاً وما لا يراه |
references/02-recovery.md |
git status غريب، إيداعٌ ضاع، rebase عالق، دفعٌ مرفوض، إيداعٌ فشل |
references/03-squash-merge-judgement.md |
قبل قول «مدموج/يتيم/آمنٌ للحذف»، وقبل إزالة شجرةٍ أو حذف فرع |
references/04-windows-traps.md |
مسارٌ مشوَّه، CRLF، heredoc، أمرٌ يُسلَّم للمالك في PowerShell |
references/99-test-cases.md |
عند تعديل المهارة أو وصفها |
scripts/git_preflight.py |
قبل الدفع (--fetch --gh)، وللحكم على فرع (--judge <فرع> --gh)؛ قراءةٌ فقط |