Cherry-pick یک کامیت مشخص را روی شاخهٔ فعلی کپی میکند (هش جدید). Revert یک کامیت خنثیکننده میسازد. rerere تعارضی را که قبلاً حل کردهای به خاطر میسپارد.
🎯 اهداف یادگیری
- cherry-pick را با درک هش جدید به کار ببری
- revert یک merge را با
-mدرست انجام دهی rerereرا روشن کنی تا تعارض تکراری تکرار نشود- محدودهٔ کامیت (
A..B) را در cherry-pick بفهمی
🍒 cherry-pick
وصلهٔ یک کامیت را روی HEAD فعلی اعمال میکند و کامیت تازه میسازد (هش متفاوت، معمولاً همان پیام).
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 کنی، cherry-pick قبلی ممکن است تعارض یا تکرار ایجاد کند. -x ردیابی را آسان میکند. برای جریان منظم، hotfix را روی main بزن و به شاخهٔ فیچر rebase کن.
↩️ revert merge
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
بدون 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 و دروازهٔ کیفیت محلی.