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^، با
صرف زمان
بیشتر جهت
جلوگیری از
اشتباهات
ناشی از
تطبیق
نادرست
خطوط بافت. |