git add
إضافة محتوى الملفات إلى الفهرس (منطقة التجهيز)
يحدّث الأمر 'git add' الفهرس بالمحتوى الحالي لشجرة العمل، لتحضير محتوى الـ commit التالي. الفهرس، ويُسمّى أيضًا منطقة التجهيز، هو ما تستخدمه لتحضير محتوى الـ commit التالي. عندما تشغّل 'git commit' دون وسائط أخرى، لا يدخل إلا ما جُهّز. يمكن تشغيل هذا الأمر عدة مرات قبل الـ commit لإضافة التغييرات تدريجيًا.
الصيغة
git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p] [--all | -A] [--update | -u] [--] [<pathspec>...]الخيارات
اختيار الخيار المناسب
أوامر التجهيز
أي الملفات تُجهَّز بكل أمر
| الأمر | ملفات جديدة | ملفات معدّلة | ملفات محذوفة | النطاق |
|---|---|---|---|---|
git add <file> | ✓ | ✓ | ✓ | الملف المحدد فقط |
git add . | ✓ | ✓ | ✓ | المجلد الحالي وما تحته |
git add -A | ✓ | ✓ | ✓ | المستودع كله |
git add -u | ✗ | ✓ | ✓ | الملفات المتتبَّعة فقط |
git add --no-all | ✓ | ✓ | ✗ | يتجاهل الحذف |
خيارات تفاعلية
خيارات للتحكم الدقيق فيما يُجهَّز
| الأمر | الوضع | الدقة | حالة الاستخدام |
|---|---|---|---|
git add -p | Patch | جزءًا جزءًا | تجهيز تغييرات محددة داخل ملف |
git add -e | المحرر | سطرًا سطرًا | تعديل الـ diff يدويًا قبل التجهيز |
git add -i | قائمة | ملفًا ملفًا | قائمة تجهيز تفاعلية كاملة |
خيارات المعاينة والمخرجات
خيارات تعرض معلومات دون تعديل منطقة التجهيز
| الأمر | الإجراء | يعدّل الفهرس | الغرض |
|---|---|---|---|
git add -n | Dry-run | ✗ | معاينة ما سيُجهَّز |
git add -v | تفصيلي | ✓ | عرض الملفات أثناء تجهيزها |
git add --refresh | التحديث | ✗ | تحديث معلومات stat فقط |
ملفات خاصة
خيارات للملفات التي تحتاج معاملة خاصة
| الأمر | يعالج | السلوك | الاستخدام المعتاد |
|---|---|---|---|
git add -f | ملفات متجاهَلة | تجاوز .gitignore | إضافة ملف يُتجاهل عادةً |
git add -N | ملفات جديدة | نية الإضافة (فارغ) | تتبّع ملف لـ git diff دون تجهيزه |
git add --chmod=+x | الملفات التنفيذية | ضبط وضع الملف | جعل السكربتات قابلة للتنفيذ |
git add --sparse | ملفات sparse | خارج المخروط | تجهيز ملفات خارج الـ sparse checkout |
خيارات متقدمة
خيارات للخبراء في حالات محددة
| الأمر | الغرض | متى تستخدمه |
|---|---|---|
git add --renormalize | إعادة تطبيق مرشحات clean | بعد تغيير نهايات الأسطر في .gitattributes |
git add --pathspec-from-file | قراءة المسارات من ملف | تجهيز ملفات كثيرة من قائمة |
git add --ignore-errors | المتابعة رغم الأخطاء | جهّز ما يمكن وتخطَّ الإخفاقات |
git add --no-warn-embedded-repo | إسكات تحذير الوحدة الفرعية | إضافة مستودعات متداخلة عن قصد |
أمثلة على سير العمل
git statusراجع كل التغييرات أولًا
git add -Aجهّز كل الملفات الجديدة والمعدّلة والمحذوفة
git commit -m "Your message"نفّذ commit لكل التغييرات المجهّزة
git add -pاختر تفاعليًا تغييرات الإصلاح فقط (اضغط 'y' لأجزاء الإصلاح و'n' لأجزاء الميزة)
git commit -m "Fix login validation bug"نفّذ commit للإصلاح فقط
git add -Aالآن جهّز تغييرات الميزة المتبقية
git commit -m "Add dark mode toggle"نفّذ commit للميزة منفصلة
git statusاعرف ما المعدّل وما غير المتتبَّع
git add -uجهّز تعديلات الملفات المتتبَّعة فقط
git statusتحقّق أن الملفات الجديدة ما زالت غير متتبَّعة
git commit -m "Update existing files"نفّذ commit دون الملفات الجديدة
git add -n .يعرض dry-run ما سيُضاف
git diffراجع التغييرات الفعلية بالتفصيل
git add .إن كان كل شيء جيدًا، جهّز فعلًا
git add dist/bundle.jsهذا يفشل - الملف متجاهَل
git add -f dist/bundle.jsالإضافة بالإجبار تتجاوز .gitignore
git commit -m "Add build for deployment"نفّذ commit للملف المتجاهَل عادةً
مفاتيح الوضع التفاعلي
اختصارات لوحة المفاتيح لأوضاع git add التفاعلية. تعمل في وضع patch (-p) والوضع التفاعلي (-i).
وضع patch
-pالوضع التفاعلي
-iحل المشكلات
الملف لا يُضاف (متجاهَل)
السبب: الملف يطابق نمطًا في .gitignore
ابحث عن النمط المطابق في .gitignore. استخدم -f لإجبار الإضافة إن كان ذلك مقصودًا.
git add -f <file>خطأ «Permission denied»
السبب: الملف مقفل من عملية أخرى أو ليست لديك صلاحية القراءة
أغلق التطبيقات التي تستخدم الملف، أو تحقّق من صلاحياته. استخدم --ignore-errors لمتابعة الملفات الأخرى.
git add --ignore-errors .لا يحدث شيء عند تشغيل git add
السبب: قد تكون الملفات مجهّزة أصلًا، أو لا توجد تغييرات لإضافتها
شغّل git status لرؤية الحالة الحالية. الملفات المجهّزة أصلًا لا تُضاف مرة أخرى.
git statusالملفات الجديدة لا تظهر في git diff
السبب: الملفات غير المتتبَّعة لا تظهر في git diff افتراضيًا
استخدم git add -N لتعليم نية الإضافة، فيعرض git diff المحتوى بعدها.
git add -N <file> && git diffتحذير بشأن مستودع git مضمَّن
السبب: تضيف مجلدًا يحتوي مجلد .git خاصًا به (مستودع متداخل)
احذف مجلد .git المتداخل، أو استخدم الوحدات الفرعية في git، أو أسكت التحذير.
git add --no-warn-embedded-repo <folder>نهايات الأسطر تظهر كتغييرات باستمرار
السبب: نهايات أسطر غير متّسقة (CRLF مقابل LF) بين نظامك والمستودع
اضبط .gitattributes بـ 'text=auto' وأعد تطبيع كل الملفات.
git add --renormalize .سكربتات (مثل git diff-files) تُظهر الملفات معدّلة مع أن المحتوى لم يتغيّر
السبب: تغيّرت أختام الوقت للملفات، فصارت معلومات stat المخزّنة في الفهرس قديمة
حدّث الفهرس لتجديد معلومات stat دون تجهيز. (يحدّثه git status تلقائيًا.)
git add --refresh .نصائح وأخطاء شائعة
أفضل الممارسات
- ✓راجع التغييرات قبل تجهيزها: استخدم 'git diff' لترى ما ستجهّزه، أو 'git add -p' للمراجعة التفاعلية.
- ✓جهّز التغييرات المترابطة معًا: اجمع التغييرات المترابطة منطقيًا في commit واحد. لا تخلط إصلاح الأخطاء بالميزات الجديدة.
- ✓استخدم 'git add -p' للتغييرات الكبيرة: عندما تُجري عدة تغييرات لا علاقة بينها في ملف، استخدم وضع patch لتجهيزها منفصلة.
- ✓راجع git status كثيرًا: شغّل دائمًا 'git status' قبل التجهيز وبعده لتتحقق مما سيدخل الـ commit.
- ✓احذر من 'git add .': فهو يجهّز كل شيء في المجلد الحالي. فكّر في تحديد أسماء الملفات أو استخدام 'git add -p' لتحكّم أكبر.
- ✓اضبط .gitignore أولًا: قبل أول 'git add'، تأكد أن .gitignore يستبعد مخرجات البناء والاعتماديات والملفات الحساسة.
- ✓استخدم dry-run للتحقق: عند الشك، يعرض 'git add -n .' ما سيُجهَّز دون تجهيز أي شيء.
- ✓جهّز الحذف صراحةً: حذف ملف محليًا لا يجهّز الحذف. استخدم 'git add -u' أو 'git add -A' لتضمين الحذف.
أخطاء متكررة
- ✗'git add .' مقابل 'git add -A': كلاهما يجهّز الملفات الجديدة والمعدّلة والمحذوفة، لكن '.' يغطي المجلد الحالي وما تحته فقط، بينما يغطي '-A' شجرة العمل كلها.
- ✗نسيان أن 'git add' لا ينفّذ commit. الملفات تُجهَّز فقط وتحتاج إلى 'git commit' لتُسجَّل.
- ✗إضافة ملفات كان يجب تجاهلها. راجع دائمًا .gitignore قبل تشغيل 'git add -A' أو 'git add .'
- ✗عدم مراجعة التغييرات قبل تجهيزها. استخدم 'git add -p' لمراجعة ما تجهّزه بعناية أكبر.
- ✗الخلط بين 'git add -u' و'git add -A': الخيار '-u' يجهّز تعديلات الملفات المتتبَّعة وحذفها فقط، لا الملفات الجديدة غير المتتبَّعة.
الأسئلة الشائعة
منذ Git 2.0 يجهّز كلاهما الملفات الجديدة والمعدّلة والمحذوفة. الفرق في النطاق: 'git add .' يغطي المجلد الحالي ومجلداته الفرعية فقط، بينما يغطي 'git add -A' المستودع كله، أيًّا كان مجلدك الحالي.
الملف على الأرجح مدرج في .gitignore. تحقّق بـ 'git check-ignore <file>'. وإن احتجت إلى إضافته رغم ذلك، فاستخدم 'git add -f <file>' للإجبار.
نعم! استخدم 'git restore --staged <file>' (أو 'git reset HEAD <file>' في إصدارات Git القديمة) لإلغاء تجهيز ملف دون فقدان تغييراتك.
استخدم 'git add -p <file>' للدخول في وضع patch التفاعلي. يعرض Git كل تغيير (hunk) ويتيح لك اختيار ما تجهّزه بـ y/n.
يحدث هذا عادةً بسبب تغيّر نهايات الأسطر (CRLF/LF) أو صلاحيات الملفات. راجع 'git diff' لترى ما تغيّر. اضبط .gitattributes للتعامل مع نهايات الأسطر.
أضف أولًا الملفات التي تريد استبعادها إلى .gitignore، ثم استخدم 'git add .'. أو أضف الملفات واحدًا واحدًا أو استخدم أنماطًا مثل 'git add *.js'.
يخبر Git أنك تنوي إضافة الملف لاحقًا. يصبح الملف متتبَّعًا (يظهر في git diff) لكن محتواه لا يُجهَّز بعد. مفيد لمراجعة الملفات الجديدة قبل الـ commit.
لا، يتتبّع Git الملفات فقط، لا المجلدات. الحل الشائع هو إضافة ملف .gitkeep أو .gitignore داخل المجلد الفارغ.