GIT-CHERRY-PICK(1) Git Manual GIT-CHERRY-PICK(1)

git-cherry-pick - اعمال تغییرات ایجادشده توسط برخی کامیت‌های موجود

git cherry-pick [--edit] [-n] [-m <parent-number>] [-s] [-x] [--ff]
                  [-S[<keyid>]] <commit>...
git cherry-pick (--continue | --skip | --abort | --quit)

با دریافت یک یا چند کامیت موجود، تغییراتی را که هر یک ایجاد کرده‌اند اعمال می‌کند و برای هر کدام یک کامیت جدید ثبت می‌نماید. این کار نیازمند آن است که درخت کاری (working tree) شما تمیز باشد (هیچ تغییری نسبت به کامیت HEAD وجود نداشته باشد).

هنگامی که نحوه اعمال یک تغییر مشخص و بدیهی نباشد، موارد زیر رخ می‌دهد:

1.شاخه فعلی و اشاره‌گر HEAD روی آخرین کامیتی که با موفقیت ایجاد شده است باقی می‌مانند.
2.ارجاع CHERRY_PICK_HEAD به‌گونه‌ای تنظیم می‌شود که به کامیتی اشاره کند که تغییر دشوار برای اعمال را ایجاد کرده است.
3.مسیرهایی که در آن‌ها تغییر بدون مشکل اعمال شده است، هم در فایل نمایه و هم در درخت کاری شما به‌روزرسانی می‌شوند.
4.برای مسیرهای دارای تداخل، فایل نمایه تا سه نسخه را ثبت می‌کند، همان‌طور که در بخش "TRUE MERGE" از git-merge(1) توصیف شده است. فایل‌های درخت کاری شامل توضیحی از تداخل خواهند بود که میان نشانگرهای معمول تداخل <<<<<<< و >>>>>>> قرار گرفته‌اند.
5.هیچ تغییر دیگری اعمال نمی‌شود.

برای نکاتی در مورد حل چنین تداخل‌هایی، به git-merge(1) مراجعه کنید.

<commit>...

کامیت‌هایی که باید گلچین شوند. برای فهرستی کامل‌تر از روش‌های ارجاع به کامیت‌ها، به gitrevisions(7) مراجعه کنید. مجموعه‌ای از کامیت‌ها می‌توانند داده شوند اما به‌طور پیش‌فرض هیچ پیمایشی انجام نمی‌شود، درست مانند زمانی که گزینه --no-walk مشخص شده باشد؛ به git-rev-list(1) مراجعه کنید. توجه داشته باشید که تعیین یک محدوده، تمام آرگومان‌های <commit>... را به یک پیمایش بازنگری واحد ارسال می‌کند (به مثالی در ادامه که از maint master..next استفاده می‌کند مراجعه کنید).

-e, --edit

با این گزینه، git cherry-pick به شما امکان می‌دهد پیام کامیت را پیش از ثبت آن ویرایش کنید.

--cleanup=<mode>

این گزینه نحوه پاک‌سازی پیام کامیت را قبل از ارسال به سازوکار کامیت تعیین می‌کند. برای جزئیات بیشتر به git-commit(1) مراجعه کنید. به‌ویژه، اگر به <mode> مقدار scissors داده شود، در صورت بروز تداخل، پیش از ارسال به MERGE_MSG علامت قیچی (خط برش) اضافه خواهد شد.

-x

هنگام ثبت کامیت، خطی با مضمون "(cherry picked from commit ...)" به پیام کامیت اصلی اضافه می‌کند تا مشخص شود این تغییر از کدام کامیت گلچین شده است. این کار فقط برای گلچین‌های بدون تداخل انجام می‌شود. اگر از شاخه خصوصی خود گلچین می‌کنید از این گزینه استفاده نکنید، زیرا این اطلاعات برای دریافت‌کننده بی‌فایده است. از سوی دیگر، اگر بین دو شاخه عمومی در حال گلچین کردن هستید (به‌عنوان مثال، انتقال یک اصلاح از یک شاخه توسعه به شاخه نگهداری یک نسخه قدیمی‌تر)، افزودن این اطلاعات می‌تواند مفید باشد.

-r

در گذشته رفتار پیش‌فرض دستور اجرای -x توضیح داده شده در بالا بود و -r برای غیرفعال کردن آن به کار می‌رفت. اکنون رفتار پیش‌فرض عدم اجرای -x است، بنابراین این گزینه بی‌اثر است.

-m <parent-number>, --mainline <parent-number>

معمولاً نمی‌توانید یک کامیت ادغام را گلچین کنید زیرا مشخص نیست کدام سمت ادغام باید به عنوان خط اصلی (mainline) در نظر گرفته شود. این گزینه شماره والد خط اصلی را (با شروع از ۱) مشخص می‌کند و به cherry-pick امکان می‌دهد تغییر را نسبت به والد مشخص‌شده بازپخش کند.

-n, --no-commit

معمولاً این دستور به‌طور خودکار دنباله‌ای از کامیت‌ها را ایجاد می‌کند. این فلگ تغییرات لازم برای گلچین کردن هر کامیت مشخص‌شده را روی درخت کاری و نمایه شما اعمال می‌کند، بدون اینکه کامیتی ثبت شود. علاوه بر این، هنگامی که این گزینه استفاده می‌شود، نیازی نیست نمایه شما با کامیت HEAD مطابقت داشته باشد. عملیات گلچین نسبت به وضعیت اولیه نمایه شما انجام می‌شود.

این گزینه زمانی مفید است که اثر بیش از یک کامیت را پشت سر هم روی نمایه خود اعمال کنید.

-s, --signoff

یک دنباله Signed-off-by در انتهای پیام کامیت اضافه می‌کند. برای اطلاعات بیشتر گزینه signoff را در git-commit(1) ببینید.

-S[<keyid>], --gpg-sign[=<keyid>], --no-gpg-sign

امضای کامیت‌ها با GPG. آرگومان keyid اختیاری است و مقدار پیش‌فرض آن هویت کامیت‌کننده است؛ در صورت تعیین، باید بدون فاصله به گزینه بچسبد. گزینه --no-gpg-sign برای لغو هر دو مورد متغیر پیکربندی commit.gpgSign و گزینه قبلی --gpg-sign مفید است.

--ff

اگر HEAD فعلی با والد کامیت گلچین‌شده یکی باشد، یک پیش‌روی سریع (fast forward) به این کامیت انجام خواهد شد.

--allow-empty

به‌طور پیش‌فرض، گلچین کردن یک کامیت خالی ناموفق خواهد بود که نشان می‌دهد اجرای صریح git commit --allow-empty لازم است. این گزینه آن رفتار را نادیده می‌گیرد و اجازه می‌دهد کامیت‌های خالی به‌طور خودکار در عملیات گلچین حفظ شوند. توجه داشته باشید که وقتی "--ff" فعال است، کامیت‌های خالی که شرط "پیش‌روی سریع" را دارند حتی بدون این گزینه نیز حفظ خواهند شد. همچنین توجه داشته باشید که استفاده از این گزینه فقط کامیت‌هایی را که در ابتدا خالی بودند (یعنی کامیت همان درختی را ثبت کرده بود که والدش داشت) حفظ می‌کند. کامیت‌هایی که به دلیل یک کامیت قبلی خالی شده‌اند باعث شکست عملیات گلچین می‌شوند. برای اجبار به گنجاندن این کامیت‌ها، از --empty=keep استفاده کنید.

--allow-empty-message

به‌طور پیش‌فرض، گلچین کردن یک کامیت با پیام خالی ناموفق خواهد بود. این گزینه این رفتار را نادیده می‌گیرد و اجازه می‌دهد کامیت‌های با پیام خالی گلچین شوند.

--empty=(drop|keep|stop)

نحوه مدیریت کامیت‌های در حال گلچین شدن که با تغییرات موجود در تاریخچه فعلی تکراری (redundant) هستند را تعیین می‌کند.

drop

کامیت کنار گذاشته خواهد شد.

keep

کامیت حفظ خواهد شد. مستلزم --allow-empty است.

stop

با اعمال شدن کامیت، عملیات گلچین متوقف می‌شود و به شما امکان می‌دهد کامیت را بررسی کنید. این رفتار پیش‌فرض است.

توجه داشته باشید که --empty=drop و --empty=stop تنها نحوه مدیریت کامیتی را مشخص می‌کنند که در ابتدا خالی نبوده، بلکه به دلیل یک کامیت قبلی خالی شده است. کامیت‌هایی که در ابتدا خالی بوده‌اند همچنان باعث شکست عملیات گلچین خواهند شد، مگر اینکه یکی از گزینه‌های --empty=keep یا --allow-empty مشخص شده باشد.

--keep-redundant-commits

مترادف منسوخ‌شده برای --empty=keep.

--strategy=<strategy>

استفاده از راهبرد ادغام مشخص‌شده. فقط باید یک بار استفاده شود. برای جزئیات به بخش MERGE STRATEGIES در git-merge(1) مراجعه کنید.

-X<option>, --strategy-option=<option>

ارسال گزینه ویژه راهبرد ادغام به راهبرد ادغام. برای جزئیات به git-merge(1) مراجعه کنید.

--rerere-autoupdate, --no-rerere-autoupdate

پس از اینکه سازوکار rerere از یک راه‌حل ثبت‌شده برای تداخل فعلی جهت به‌روزرسانی فایل‌ها در درخت کاری استفاده کرد، به آن اجازه می‌دهد تا نمایه را نیز با نتیجه حل تداخل به‌روز کند. گزینه --no-rerere-autoupdate راه خوبی برای بررسی مجدد کاری است که git-rerere(1) انجام داده تا خطاهای احتمالی در ادغام را قبل از ثبت نتیجه در نمایه با یک دستور جداگانه git-add(1) شناسایی کند.

--continue

عملیات در حال انجام را با استفاده از اطلاعات موجود در .git/sequencer ادامه می‌دهد. می‌تواند برای ادامه کار پس از حل تداخل‌ها در یک cherry-pick یا revert ناموفق استفاده شود.

--skip

از کامیت فعلی صرف‌نظر کرده و با ادامه دنباله پیش می‌رود.

--quit

عملیات فعلی در حال انجام را نادیده می‌گیرد. می‌تواند برای پاک کردن وضعیت دنباله‌ساز پس از یک cherry-pick یا revert ناموفق استفاده شود.

--abort

عملیات را لغو کرده و به وضعیت پیش از دنباله بازمی‌گردد.

git cherry-pick master

تغییر ایجادشده توسط کامیت موجود در نوک شاخه master را اعمال کرده و یک کامیت جدید با این تغییر ایجاد می‌کند.

git cherry-pick ..master, git cherry-pick ^HEAD master

تغییرات ایجادشده توسط تمام کامیت‌هایی را که نیاکان master هستند اما نیاکان HEAD نیستند اعمال کرده تا کامیت‌های جدید ایجاد کند.

git cherry-pick maint next ^master, git cherry-pick maint master..next

تغییرات ایجادشده توسط تمام کامیت‌هایی را که نیاکان maint یا next هستند، اما نیاکان master یا هیچ‌یک از نیاکان آن نیستند اعمال می‌کند. توجه داشته باشید که عبارت دوم به معنی maint و همه موارد بین master و next نیست؛ به‌ویژه، اگر maint در master گنجانده شده باشد، استفاده نخواهد شد.

git cherry-pick master~4 master~2

تغییرات ایجادشده توسط پنجمین و سومین کامیت آخر مورد اشاره master را اعمال کرده و ۲ کامیت جدید با این تغییرات ایجاد می‌کند.

git cherry-pick -n master~1 next

تغییرات ایجادشده توسط دومین کامیت آخر مورد اشاره master و آخرین کامیت مورد اشاره next را روی درخت کاری و نمایه اعمال می‌کند، اما هیچ کامیتی با این تغییرات ایجاد نمی‌کند.

git cherry-pick --ff ..next

اگر تاریخچه خطی باشد و HEAD یکی از نیاکان next باشد، درخت کاری را به‌روزرسانی کرده و اشاره‌گر HEAD را جلو می‌برد تا با next مطابقت پیدا کند. در غیر این صورت، تغییرات ایجادشده توسط آن کامیت‌هایی را که در next هستند اما در HEAD نیستند بر روی شاخه فعلی اعمال کرده و برای هر تغییر جدید یک کامیت تازه ایجاد می‌کند.

git rev-list --reverse master -- README | git cherry-pick -n --stdin

تغییرات ایجادشده توسط تمام کامیت‌های روی شاخه master را که README را تغییر داده‌اند بر روی درخت کاری و نمایه اعمال می‌کند تا در صورت مناسب بودن، نتیجه بررسی شده و به یک کامیت جدید واحد تبدیل شود.

دنباله زیر تلاش می‌کند یک وصله را منتقل کند، اما به دلیل اینکه کد اعمال وصله بیش از حد تغییر کرده است متوقف می‌شود، و سپس دوباره تلاش می‌کند؛ این بار با دقت بیشتر در تطبیق خطوط بافت (context lines).

$ git cherry-pick topic^             (1)
$ git diff                           (2)
$ git cherry-pick --abort            (3)
$ git cherry-pick -Xpatience topic^  (4)
1. اعمال تغییری که توسط git show topic^ نمایش داده می‌شود. در این مثال، وصله بدون مشکل اعمال نمی‌شود، بنابراین اطلاعات مربوط به تداخل در نمایه و درخت کاری نوشته شده و کامیت جدیدی ایجاد نمی‌شود.
2. خلاصه‌سازی تغییراتی که باید رفع تعارض شوند
3. لغو عملیات cherry-pick. به عبارت دیگر، بازگشت به وضعیت پیش از cherry-pick، با حفظ هرگونه تغییر محلی که در درخت کاری داشته‌اید.
4. تلاش مجدد برای اعمال تغییر ایجادشده توسط topic^، با صرف زمان بیشتر جهت جلوگیری از اشتباهات ناشی از تطبیق نادرست خطوط بافت.

git-revert(1)

بخشی از مجموعه git(1)

2026-06-29 Git 2.55.0