Cherry-pick و Patch — انتقال انتخابی تغییرات
کپی یک کامیت خاص به شاخه دیگر با cherry-pick و تبادل تغییرات از طریق فایل patch.
Cherry-pick چیست؟
گاهی فقط یک کامیت خاص از یک شاخه را میخواهید — نه کل شاخه را! git cherry-pick دقیقاً همان یک کامیت را (بهصورت کامیت جدید) روی شاخه فعلی کپی میکند.
سناریوی کلاسیک
روی شاخه feature کار میکردید و وسطش یک باگ فوری را هم همانجا رفع کردید (کامیت E). حالا main هم آن رفع باگ را لازم دارد — بدون بقیه feature:
main: A---B---C---D
feature: A---B---E---F
فقط E را میخواهیم:
# ۱. به شاخه مقصد بروید:
git switch main
# ۲. کامیت E را بردارید:
git cherry-pick E
# نتیجه:
# main: A---B---C---D---E"
# (E" کپی جدید همان تغییرات است)
انواع cherry-pick
# یک کامیت:
git cherry-pick e5f6g7h
# چند کامیت جدا:
git cherry-pick a1b2c3d e5f6g7h
# یک بازه (توجه: کامیت اول هم با ^):
git cherry-pick a1b2c3d^..e5f6g7h
# بدون کامیت — فقط اعمال تغییرات در working dir:
git cherry-pick --no-commit e5f6g7h
تعارض در cherry-pick
مثل merge ممکن است تعارض بدهد:
git cherry-pick e5f6g7h
# CONFLICT (content): Merge conflict in app.py
- تعارض را حل کنید
git add .git cherry-pick --continue- فرار:
git cherry-pick --abort
هشدار: cherry-pick تکراری
اگر بعداً کل شاخه feature را در main ادغام کنید، کامیت E دوباره اعمال میشود (بهصورت E و E") — احتمال تعارض! راهحلها: قبل از merge، rebase کنید یا E اصلی را drop کنید.
Patch — تغییرات بهصورت فایل
گاهی نمیخواهید مستقیم از مخزن دیگری بکشید — تغییرات را بهصورت فایل patch رد و بدل میکنید (ایمیل، چت...):
ساخت patch از کامیتها
# یک فایل patch برای هر کامیت:
git format-patch -1 e5f6g7h
# 0001-رفع-باگ.patch ساخته میشود
# همه کامیتهای اخیر (مثلاً ۳ تا):
git format-patch -3
# تفاوتهای stage نشده بهصورت patch:
git diff > my-changes.patch
اعمال patch
# بررسی اولیه (آیا بدون خطا اعمال میشود؟):
git apply --check my-changes.patch
# اعمال:
git apply my-changes.patch
# اعمال + ساخت کامیت (برای patchهای format-patch):
git am 0001-*.patch
cherry-pick یا merge یا patch؟
| ابزار | کی؟ |
|---|---|
| cherry-pick | یک/چند کامیت خاص از شاخه دیگر، همین حالا |
| merge | کل شاخه را میخواهید |
| patch | بدون دسترسی مستقیم به مخزن طرف (ایمیل/آپلود) |
خلاصه
git cherry-pick <کامیت>کامیت خاص را کپی میکند- بازه با
old^..new— حتماً ^ روی کامیت اول! format-patchخروجی فایل،amاعمال + کامیت- مراقب تکرار شدن cherry-pick در merge بعدی باشید
این مبحث بخشی از دوره آموزش کامل Git است.