git format-patch
الـ patches وإعادة الكتابة
تحويل الـ commits إلى ملفات patch جاهزة للبريد
يكتب الأمر 'git format-patch' كل commit في نطاق إلى ملف .patch مرقّم خاص به: المؤلف والتاريخ ورسالة الـ commit كعنوان ونص للبريد وملخّص التغييرات والـ diff. المشاريع التي تراجع عبر القوائم البريدية (مثل Git نفسه ونواة Linux) تستقبل المساهمات هكذا، ويعيد git am الملفات إلى commits.
الصيغة
git format-patch [-o <dir>] [--stdout] [-<n>] [<since> | <revision-range>][ ] اختياري| أو<arg> قيمة تُستبدل... قابل للتكرار--flag خيار
الخيارات
اختيار الخيار المناسب
طرق تسليم الـ commits
مع الإبقاء على المؤلف والرسالة
| الأمر | يحفظ التأليف |
|---|---|
git diff > change.diff | No |
git format-patch + git am | نعم |
git bundle | نعم (commits وفروع كاملة) |
أمثلة
الـ commits منذ main
git format-patch mainملف لكل commit غير موجود في main.
آخر commit
git format-patch -1أحدث commit فقط.
في مجلد
git format-patch main -o patchesاكتب الملفات في patches/.
مع رسالة تقديم
git format-patch --cover-letter mainإضافة رسالة تمهيدية 0000.
أمثلة على سير العمل
1
git format-patch main -o outgoingملف لكل commit
2
git send-email outgoing/*.patchإرسالها إلى القائمة
حل المشكلات
لم يُنشأ أي ملف patch
السبب: النطاق فارغ (مثلًا لا commits في فرعك بعد main)
تحقّق بـ git log --oneline main..HEAD
نصائح وأخطاء شائعة
أفضل الممارسات
- ✓نفّذ rebase على أحدث main قبل إنشاء الـ patches.
- ✓تغيير منطقي واحد لكل commit — كل واحد يصبح رسالة بريد.
أخطاء متكررة
- ✗إرسال git diff بدل format-patch — يضيع في الـ diff المؤلف والتاريخ والرسالة.
- ✗نسيان النطاق وعدم الحصول على شيء: يحتاج format-patch نقطة بداية (main، -1…).
الأسئلة الشائعة
A:
نعم، لكن git apply يغيّر الملفات فقط؛ أما git am فينشئ الـ commit بالمؤلف والرسالة الأصليين أيضًا.