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
  1. تعارض را حل کنید
  2. git add .
  3. git cherry-pick --continue
  4. فرار: 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 است.

ابزارهای مرتبط