git rm
إزالة الملفات من مجلد العمل ومنطقة التجهيز
يحذف الأمر 'git rm' ملفًا متتبَّعًا ويجهّز الحذف، فلا يحتويه الـ commit التالي. تحتفظ الـ commits الأقدم بالملف. ومع --cached يتوقف Git عن تتبّع الملف لكنه يتركه على قرصك — الحل المعتاد لملف سُجِّل بالخطأ. يرفض git rm حذف ملف فيه تغييرات غير مسجَّلة إلا إذا أضفت -f.
الصيغة
git rm [-f | --force] [-n] [-r] [--cached] [-q] [--] <pathspec>...الخيارات
اختيار الخيار المناسب
طرق إزالة ملف
ما يحدث على القرص وفي Git
| الأمر | على القرص | في الـ commit التالي |
|---|---|---|
rm file | محذوف | يبقى موجودًا حتى تجهّز الحذف |
git rm file | محذوف | مُزال |
git rm --cached file | محفوظ | أُزيل (يصبح الملف غير متتبَّع) |
أمثلة
حذف ملف
git rm old.jsيحذف old.js ويجهّز الحذف.
إيقاف التتبّع
git rm --cached .envينسى Git الملف .env؛ ويبقى الملف على القرص.
حذف مجلد
git rm -r build/يحذف مجلدًا وملفاته المتتبَّعة.
أمثلة على سير العمل
git rm --cached .envإيقاف تتبّعه مع إبقائه على القرص
echo ".env" >> .gitignoreتجاهله من الآن فصاعدًا
git add .gitignoreتجهيز قاعدة التجاهل
git commit -m "Stop tracking .env"Commit
حل المشكلات
error: the following file has local modifications
السبب: في الملف تغييرات غير مسجَّلة
سجّلها أو خبّئها بـ stash، أو استخدم --cached للإبقاء على الملف، أو -f للتخلّص منها
fatal: not removing 'dir' recursively without -r
السبب: المسار مجلد
أضف -r: git rm -r dir
ما زال سرّ في السجل
السبب: لا يؤثر git rm إلا في الـ commits القادمة
غيّر السرّ؛ إعادة كتابة السجل تحتاج أداة مثل git filter-repo
نصائح وأخطاء شائعة
أفضل الممارسات
- ✓استخدم git rm بدل rm + git add: خطوة واحدة ولا شيء يُنسى.
- ✓أضف الملفات غير المتتبَّعة إلى .gitignore مباشرة بعد git rm --cached.
- ✓اعتبر السرّ الذي دخل commit مسرَّبًا: غيّره، حتى بعد حذف الملف.
أخطاء متكررة
- ✗حذف ملف بـ rm العادي ونسيان تجهيز الحذف.
- ✗استخدام git rm وأنت تريد فقط إيقاف التتبّع: أضف --cached للإبقاء على الملف.
- ✗توقّع أن يزيل git rm سرًّا من السجل — الـ commits الأقدم ما زالت تحتويه.
الأسئلة الشائعة
جهّز الحذف بـ git rm <file> أو git add <file>، ثم نفّذ commit.
قبل الـ commit: git restore --staged --worktree <file>. بعده: git restore --source=<commit> <file>.
لا. الـ commits السابقة تحتفظ به؛ فقط الـ commit التالي يستبعده.