Git 2026

فصل ۲۴ · Cherry-pick و rerere

Cherry-pick، revert پیشرفته و rerere

Cherry-pick یک کامیت مشخص را روی شاخهٔ فعلی کپی می‌کند (هش جدید). Revert یک کامیت خنثی‌کننده می‌سازد. rerere تعارضی را که قبلاً حل کرده‌ای به خاطر می‌سپارد.

🎯 اهداف یادگیری

  • cherry-pick را با درک هش جدید به کار ببری
  • revert یک merge را با -m درست انجام دهی
  • rerere را روشن کنی تا تعارض تکراری تکرار نشود
  • محدودهٔ کامیت (A..B) را در cherry-pick بفهمی

🍒 cherry-pick

وصلهٔ یک کامیت را روی HEAD فعلی اعمال می‌کند و کامیت تازه می‌سازد (هش متفاوت، معمولاً همان پیام).

یک هات‌فیکس را به main بیاور
git switch main
git cherry-pick 9f3a1c
git cherry-pick -x 9f3a1c          # در پیام: (cherry picked from ...)
git cherry-pick -n 9f3a1c          # بدون کامیت؛ فقط Index/Working
git cherry-pick feat/auth~3..feat/auth   # چند کامیت (بدون خود ~3)

در VS Code Graph: راست‌کلیک روی گره → Cherry Pick.

دو بار merge کردن همان منطق

اگر بعداً کل شاخه را merge کنی، cherry-pick قبلی ممکن است تعارض یا تکرار ایجاد کند. -x ردیابی را آسان می‌کند. برای جریان منظم، hotfix را روی main بزن و به شاخهٔ فیچر rebase کن.

↩️ revert merge

خنثی کردن PR ادغام‌شده
git revert -m 1 <merge-commit>
# -m 1 یعنی والد اول (معمولاً main) خط اصلی است

اگر دوباره همان شاخه را بخواهی merge کنی، Git فکر می‌کند تغییرات قبلاً آمده‌اند. راه‌حل رایج: revertِِ آن revert، یا rebase شاخه روی main جدید.

در GitHub دکمهٔ Revert روی PR ادغام‌شده یک PR معکوس می‌سازد — برای تیم‌ها امن‌تر از revert دستی.

🧠 rerere — Reuse Recorded Resolution

یک‌بار روشن کن، سال‌ها سود ببر
git config --global rerere.enabled true
git config --global rerere.autoUpdate true

وقتی تعارضی را حل می‌کنی، Git جفت «قبل/بعد» را ذخیره می‌کند. اگر همان تعارض در rebase بعدی آمد، خودش اعمال می‌کند.

بازرس
ls .git/rr-cache
git rerere diff
تیم‌های rebase-heavy

بدون rerere، هر rebase هفتگی همان تعارض CSS را دوباره حل می‌کنی. با rerere، ماشین حافظه می‌شود.

🎯 محدوده و خالی

git cherry-pick --empty=drop در Git جدید کامیت‌هایی که بعد از اعمال خالی‌اند را رد می‌کند. برای picking بازه روی شاخهٔ تقریباً همگام مفید است.

سؤالات مصاحبه (با پاسخ)

Junior — cherry-pick کپی است؟ کپی تغییر است نه کپی شیء؛ کامیت جدید با والد جدید.

Mid — چرا -m 1؟ merge دو درخت والد دارد؛ باید بگویی نسبت به کدام diff را معکوس کنیم.

Senior — rerere با conflict style diff3؟ پیش‌نمایش غنی‌تر است؛ حافظهٔ rerere روی نتیجهٔ staged کار می‌کند نه روی نشانه‌های فایل.

✅ چک‌لیست فهم

  • یک cherry-pick با -x زده‌ای
  • revert merge را فهمیده‌ای
  • rerere جهانی روشن است

فصل بعد: Hooks، commitlint و دروازهٔ کیفیت محلی.

فصل ۲۴ از ۳۶ · مرجع جامع و حرفه‌ای Git و GitHub · ویرایش 1.0.0