| GIT-REBASE(1) | Git Manual | GIT-REBASE(1) |
نام (NAME)
git-rebase - بازاعمال کامیتها بر روی سرشاخه جدید
خلاصه دستور (SYNOPSIS)
git rebase [-i | --interactive] [<options>] [--exec <cmd>]
[--onto <newbase> | --keep-base] [<upstream> [<branch>]]
git rebase [-i | --interactive] [<options>] [--exec <cmd>] [--onto <newbase>]
--root [<branch>]
git rebase (--continue|--skip|--abort|--quit|--edit-todo|--show-current-patch)
توضیحات (DESCRIPTION)
پیوند زدن مجموعهای از کامیتها بر روی یک نقطه شروع متفاوت. همچنین میتوانید از git rebase برای بازآرایی یا ترکیب کامیتها استفاده کنید: برای چگونگی انجام این کار، بخش INTERACTIVE MODE در زیر را مشاهده کنید.
برای مثال، فرض کنید در این تاریخچه روی شاخه topic کار میکردهاید و میخواهید کارهای انجامشده روی شاخه master را دریافت کرده و همگام شوید.
A---B---C topic
/
D---E---F---G master
شما میخواهید کامیتهایی را که از زمان جدا شدن topic از master ایجاد کردهاید (یعنی A، B و C)، بر روی نوک شاخه فعلی master منتقل کنید. این کار را میتوانید با اجرای git rebase master در زمانی که شاخه topic بررسی (checkout) شده است انجام دهید. اگر میخواهید topic را زمانی که روی شاخه دیگری هستید بازاعمال کنید، دستور git rebase master topic یک میانبر برای git checkout topic && git rebase master است.
A'--B'--C' topic
/
D---E---F---G master
اگر در حین این فرآیند با یک تعارض ادغام مواجه شوید، git rebase در اولین کامیت دارای مشکل متوقف شده و نشانگرهای تعارض را باقی میگذارد. در این حالت میتوانید یکی از این کارها را انجام دهید:
git rebase --continue
git rebase --abort
git rebase --skip
اگر شاخه بالادستی <upstream> را برای بازاعمال بر روی آن تعیین نکنید، بالادست پیکربندیشده در گزینههای branch.<name>.remote و branch.<name>.merge استفاده خواهد شد (برای جزئیات به git-config(1) رجوع کنید) و گزینه --fork-point فرض میشود. اگر هماکنون روی هیچ شاخهای قرار ندارید یا اگر شاخه فعلی بالادست پیکربندیشدهای ندارد، عملیات بازاعمال لغو خواهد شد.
در اینجا شرح سادهشدهای از عملکرد git rebase <upstream> آورده شده است:
نکته
هنگام آغاز بازاعمال، ORIG_HEAD طوری تنظیم میشود که به کامیت رأس شاخهای که قرار است بازاعمال شود اشاره کند. با این وجود، تضمینی نیست که در پایان بازاعمال نیز ORIG_HEAD همچنان به آن کامیت اشاره داشته باشد، در صورتی که دستورات دیگری که ORIG_HEAD را تغییر میدهند (مانند git reset) در طول بازاعمال استفاده شوند. با این حال، رأس قبلی شاخه با استفاده از reflog شاخه فعلی (یعنی @{1}، به gitrevisions(7) مراجعه کنید) در دسترس است.
انتقال یک شاخه موضوعی با استفاده از --ONTO (TRANSPLANTING A TOPIC BRANCH WITH --ONTO)
در اینجا نحوه انتقال یک شاخه موضوعی مبتنی بر یک شاخه به شاخهای دیگر با استفاده از rebase --onto آورده شده است، تا وانمود شود که شاخه موضوعی را از شاخه دومی منشعب کردهاید.
ابتدا فرض کنیم شاخه topic شما مبتنی بر شاخه next است. برای مثال، قابلیتی که در topic توسعه داده شده به عملکردی وابسته است که در next وجود دارد.
o---o---o---o---o master
\
o---o---o---o---o next
\
o---o---o topic
ما میخواهیم کاری کنیم که topic از شاخه master منشعب شود؛ مثلاً به این دلیل که عملکردی که topic به آن وابسته است در شاخه پایدارتر master ادغام شده است. میخواهیم درخت ما به این شکل باشد:
o---o---o---o---o master
| \
| o'--o'--o' topic
\
o---o---o---o---o next
میتوانیم با استفاده از دستور زیر به این نتیجه برسیم:
git rebase --onto master next topic
مثال دیگری از گزینه --onto بازاعمال بخشی از یک شاخه است. اگر وضعیت زیر را داشته باشیم:
H---I---J topicB
/
E---F---G topicA
/
A---B---C---D master
در این صورت دستور
git rebase --onto master topicA topicB
نتیجه زیر را در پی خواهد داشت:
H'--I'--J' topicB
/
| E---F---G topicA
|/
A---B---C---D master
این حالت زمانی مفید است که topicB به topicA وابسته نباشد.
همچنین میتوان محدودهای از کامیتها را با بازاعمال حذف کرد. اگر وضعیت زیر را داشته باشیم:
E---F---G---H---I---J topicA
در این صورت دستور
git rebase --onto topicA~5 topicA~3 topicA
منجر به حذف کامیتهای F و G خواهد شد:
E---H'---I'---J' topicA
این کار زمانی مفید است که F و G به گونهای دارای ایراد باشند، یا نباید بخشی از topicA باشند. توجه داشته باشید که آرگومان --onto و پارامتر <upstream> میتوانند هر شبهکامیت (commit-ish) معتبری باشند.
گزینههای حالت (MODE OPTIONS)
گزینههای این بخش نمیتوانند همراه با هیچ گزینه دیگری استفاده شوند، از جمله نه با یکدیگر:
--continue
--skip
--abort
--quit
--edit-todo
--show-current-patch
گزینهها (OPTIONS)
--onto <newbase>
در یک حالت خاص، در صورتی که دقیقاً یک پایه ادغام (merge base) وجود داشته باشد، میتوانید از "A...B" به عنوان میانبری برای پایه ادغام A و B استفاده کنید. میتوانید حداکثر یکی از A یا B را حذف کنید، که در این حالت مقدار پیشفرض آن HEAD خواهد بود.
برای مثالها، بخش TRANSPLANTING A TOPIC BRANCH WITH --ONTO در بالا را ببینید.
--keep-base
این گزینه در مواردی مفید است که در حال توسعه یک قابلیت بر روی یک شاخه بالادست هستید. در حالی که روی این قابلیت کار میشود، شاخه بالادست ممکن است جلو برود و بازپایهریزی مداوم روی سرشاخه بالادست ایده چندان مناسبی نباشد، بلکه حفظ کامیت پایه همانطور که هست ترجیح داده شود. از آنجا که کامیت پایه بدون تغییر باقی میماند، این گزینه برای جلوگیری از گم شدن کامیتها به طور ضمنی --reapply-cherry-picks را فعال میکند.
اگرچه هم این گزینه و هم --fork-point پایه ادغام میان <upstream> و <branch> را پیدا میکنند، اما این گزینه از پایه ادغام به عنوان نقطه شروع که کامیتهای جدید روی آن ایجاد خواهند شد استفاده میکند، در حالی که --fork-point از پایه ادغام برای تعیین مجموعه کامیتهایی که بازپایهریزی خواهند شد بهره میگیرد.
همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.
<upstream>
<branch>
--apply
همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.
--empty=(drop|keep|stop)
drop
keep
stop, ask
توجه داشته باشید کامیتهایی که از ابتدا خالی هستند حفظ میشوند (مگر اینکه --no-keep-empty مشخص شده باشد)، و کامیتهایی که گلچینهای تمیز هستند (همانطور که توسط git log --cherry-mark ... تعیین میشود) در یک مرحله اولیه شناسایی شده و کنار گذاشته میشوند (مگر اینکه --reapply-cherry-picks یا --keep-base ارسال شده باشد).
همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.
--no-keep-empty, --keep-empty
استفاده از این فلگ احتمالاً به ندرت پیش خواهد آمد، زیرا میتوانید صرفاً با شروع یک بازپایهریزی تعاملی و حذف خطوط مربوط به کامیتهایی که نمیخواهید، از شر کامیتهایی که خالی شروع میشوند خلاص شوید. این فلگ به عنوان یک میانبر آسان وجود دارد، مثلاً برای مواردی که ابزارهای خارجی کامیتهای خالی متعددی تولید کردهاند و شما میخواهید همه آنها حذف شوند.
برای کامیتهایی که خالی شروع نمیشوند اما پس از بازپایهریزی خالی میگردند، فلگ --empty را ببینید.
همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.
--reapply-cherry-picks, --no-reapply-cherry-picks
در نبود --keep-base (یا در صورتی که --no-reapply-cherry-picks داده شده باشد)، این کامیتها به طور خودکار کنار گذاشته میشوند. از آنجا که این امر مستلزم خواندن تمام کامیتهای بالادست است، در مخازنی با تعداد بسیار زیادی کامیت بالادست که نیاز به خوانده شدن دارند میتواند فرآیندی پرهزینه باشد. هنگام استفاده از بکاند merge، برای هر کامیت کنار گذاشتهشده هشدارهایی صادر میشود (مگر اینکه --quiet داده شده باشد). همچنین راهنماییهایی ارائه خواهد شد مگر اینکه advice.skippedCherryPicks روی false تنظیم شده باشد (به git-config(1) مراجعه کنید).
گزینه --reapply-cherry-picks به rebase امکان میدهد از خواندن تمام کامیتهای بالادست صرفنظر کند، که به طور بالقوه موجب بهبود کارایی و عملکرد میشود.
همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.
--allow-empty-message
همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.
-m, --merge
توجه داشته باشید که بازپایهریزی ادغامی با بازپخش هر کامیت از شاخه کاری بر روی شاخه <upstream> عمل میکند. به همین دلیل، هنگام بروز تداخل در ادغام، سمتی که به عنوان ours گزارش میشود همان سری کامیتهای بازپایهریزیشده تا این لحظه است که با <upstream> شروع میشود، و سمت theirs شاخه کاری است. به عبارت دیگر، سمتها جابهجا شدهاند.
همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.
-s <strategy>, --strategy=<strategy>
از آنجا که git rebase هر کامیت از شاخه کاری را بر روی شاخه <upstream> با استفاده از راهبرد دادهشده بازپخش میکند، استفاده از راهبرد ours صرفاً تمام وصلهها را از <branch> خالی میکند، که این کار چندان منطقی نیست.
همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.
-X <strategy-option>, --strategy-option=<strategy-option>
همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.
--rerere-autoupdate, --no-rerere-autoupdate
-S[<keyid>], --gpg-sign[=<keyid>], --no-gpg-sign
-q, --quiet
-v, --verbose
--stat
-n, --no-stat
--no-verify
--verify
-C<n>
همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.
--no-ff, --force-rebase, -f
ممکن است پس از بازگردانی ادغام یک شاخه موضوعی (topic branch)، این گزینه برایتان مفید باشد؛ زیرا این گزینه شاخه موضوعی را با کامیتهای تازه بازسازی میکند تا بتوان آن را بدون نیاز به «بازگردانیِ بازگردانی» (revert the reversion) مجدداً با موفقیت ادغام کرد (برای جزئیات به revert-a-faulty-merge How-To[1] مراجعه کنید).
--fork-point, --no-fork-point
هنگامی که --fork-point فعال است، fork_point به جای <upstream> برای محاسبه مجموعه کامیتها جهت بازپایهریزی استفاده خواهد شد، که در آن fork_point نتیجه دستور git merge-base --fork-point <upstream> <branch> است (به git-merge-base(1) مراجعه کنید). اگر fork_point در نهایت خالی باشد، <upstream> به عنوان جایگزین استفاده خواهد شد.
اگر <upstream> یا --keep-base در خط فرمان مشخص شده باشد، حالت پیشفرض --no-fork-point است، در غیر این صورت پیشفرض --fork-point میباشد. همچنین به rebase.forkpoint در git-config(1) مراجعه کنید.
اگر شاخه شما بر پایه <upstream> بوده باشد، اما <upstream> به عقب بازگردانده شده (rewound) و شاخه شما شامل کامیتهایی باشد که کنار گذاشته شدهاند، این گزینه میتواند به همراه --keep-base برای کنار گذاشتن آن کامیتها از شاخه شما استفاده شود.
همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.
--ignore-whitespace
بکاند apply
بکاند merge
--whitespace=<option>
همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.
--committer-date-is-author-date
هشدار
سازوکار پیمایش تاریخچه فرض میکند که کامیتها دارای برچسبهای زمانی نامتناقص برای کامیت هستند. باید بررسی کنید که آیا واقعاً نیاز به استفاده از این گزینه دارید یا خیر. در این صورت فقط باید زمانی از این گزینه برای بازنویسی تاریخ کامیتکننده استفاده کنید که در حال بازپایهریزی کامیتها بر روی پایهای هستید که کامیت آن (از نظر تاریخ کامیت) قدیمیتر از قدیمیترین کامیتی است که در حال اعمال آن هستید (از نظر تاریخ نویسنده).
--ignore-date, --reset-author-date
همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.
--signoff
همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.
--trailer=<trailer>
همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.
-i, --interactive
قالب فهرست کامیتها را میتوان با تنظیم گزینه پیکربندی rebase.instructionFormat تغییر داد. یک قالب دستورالعمل سفارشی به طور خودکار هش کامیت را در ابتدای قالب قرار میدهد.
همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.
-r, --rebase-merges[=(rebase-cousins|no-rebase-cousins)], --no-rebase-merges
هنگام بازپایهریزی ادغامها، دو حالت وجود دارد: rebase-cousins و no-rebase-cousins. اگر حالت مشخص نشده باشد، مقدار پیشفرض آن no-rebase-cousins است. در حالت no-rebase-cousins، کامیتهایی که <upstream> را به عنوان نیای مستقیم خود ندارند نقطه انشعاب اصلی خود را حفظ خواهند کرد، یعنی کامیتهایی که توسط گزینه --ancestry-path در git-log(1) مستثنی میشوند به طور پیشفرض تبار اصلی خود را حفظ خواهند کرد. در حالت rebase-cousins، چنین کامیتهایی در عوض روی <upstream> (یا در صورت تعیین، روی <onto>) بازپایهریزی میشوند.
در حال حاضر تنها امکان بازسازی کامیتهای ادغام با استفاده از استراتژی ادغام ort وجود دارد؛ استراتژیهای ادغام متفاوت را فقط میتوان از طریق دستورات صریح exec git merge -s <strategy> [...] استفاده کرد.
همچنین بخشهای REBASING MERGES و INCOMPATIBLE OPTIONS در ادامه را ببینید.
-x <cmd>, --exec <cmd>
میتوانید چندین دستور را با استفاده از یک نمونه از --exec به همراه چندین دستور اجرا کنید:
git rebase -i --exec "cmd1 && cmd2 && ..."
یا با مشخص کردن بیش از یک --exec:
git rebase -i --exec "cmd1" --exec "cmd2" --exec ...
اگر از --autosquash استفاده شود، خطوط exec برای کامیتهای میانی اضافه نخواهند شد، و تنها در انتهای هر سری از squash/fixup ظاهر میشوند.
این گزینه در داخل از سازوکار --interactive استفاده میکند، اما میتواند بدون یک --interactive صریح نیز اجرا شود.
همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.
--root
همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.
--autosquash, --no-autosquash
در فهرست کارهای بازپایهریزی، عملیات مربوط به کامیتهای squash، fixup و amend به ترتیب از pick به squash، fixup یا fixup -C تغییر مییابد و آنها دقیقاً بعد از کامیتی که تغییرش میدهند منتقل میشوند. گزینه --interactive میتواند برای بررسی و ویرایش فهرست کارها پیش از ادامه فرآیند استفاده شود.
روش توصیهشده برای ایجاد کامیتهایی با نشانگرهای squash استفاده از گزینههای --squash، --fixup، --fixup=amend: یا --fixup=reword: در دستور git-commit(1) است که کامیت هدف را به عنوان یک آرگومان دریافت میکنند و عنوان کامیت جدید را به طور خودکار از روی آن پر میکنند.
تنظیم متغیر پیکربندی rebase.autoSquash روی true، فشردهسازی خودکار را به طور پیشفرض برای بازپایهریزی تعاملی فعال میکند. گزینه --no-autosquash میتواند برای باطل کردن این تنظیم استفاده شود.
همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.
--autostash, --no-autostash
--reschedule-failed-exec, --no-reschedule-failed-exec
این گزینه پس از شروع یک بازپایهریزی اعمال میشود. این تنظیم در کل فرآیند بازپایهریزی به ترتیب بر اساس: گزینه خط فرمان ارائهشده به دستور اولیه git rebase، پیکربندی rebase.rescheduleFailedExec (به git-config(1) یا بخش "CONFIGURATION" در ادامه مراجعه کنید)، و یا در غیر این صورت با مقدار پیشفرض false حفظ میشود.
ثبت این گزینه برای کل بازپایهریزی یک ویژگی تسهیلکننده است. در غیر این صورت، استفاده صریح از --no-reschedule-failed-exec در ابتدا، در صورت وجود پیکربندی rebase.rescheduleFailedExec=true هنگام فراخوانی git rebase --continue باطل میشد. در حال حاضر، شما نمیتوانید --[no-]reschedule-failed-exec را به git rebase --continue ارسال کنید.
--update-refs, --no-update-refs
اگر متغیر پیکربندی rebase.updateRefs تنظیم شده باشد، این گزینه میتواند برای باطل کردن و غیرفعالسازی این تنظیم استفاده شود.
همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.
گزینههای ناسازگار (INCOMPATIBLE OPTIONS)
گزینههای زیر:
با گزینههای زیر ناسازگار هستند:
علاوه بر این، جفتگزینههای زیر ناسازگار هستند:
تفاوتهای رفتاری (BEHAVIORAL DIFFERENCES)
git rebase دارای دو بکاند اصلی است: apply و merge. (بکاند apply پیشتر به عنوان بکاند am شناخته میشد، اما این نام باعث سردرگمی بود زیرا به جای یک اسم شبیه به یک فعل به نظر میرسید. همچنین بکاند merge پیشتر به عنوان بکاند تعاملی (interactive) شناخته میشد، اما اکنون برای موارد غیرتعاملی نیز استفاده میشود. هر دو بر اساس عملکردهای سطح پایینتری که زیربنای هر یک بود تغییر نام یافتند.) تفاوتهای ظریفی در نحوه رفتار این دو بکاند وجود دارد:
کامیتهای خالی (Empty commits)
متأسفانه بکاند apply کامیتهای تعمداً خالی را، یعنی کامیتهایی که از ابتدا خالی بودهاند، نادیده گرفته و حذف میکند، گرچه این موارد در عمل نادر هستند. این بکاند همچنین کامیتهایی را که خالی میشوند نیز حذف میکند و هیچ گزینهای برای کنترل این رفتار ندارد.
بکاند merge بهطور پیشفرض کامیتهای تعمداً خالی را نگه میدارد (اگرچه با گزینه -i در ویرایشگر فهرست وظایف به عنوان خالی علامتگذاری میشوند، یا میتوان آنها را بهطور خودکار با --no-keep-empty حذف کرد).
مشابه بکاند apply، بکاند merge نیز بهطور پیشفرض کامیتهایی را که خالی میشوند حذف میکند، مگر اینکه -i/--interactive مشخص شده باشد (که در این صورت متوقف شده و از کاربر میپرسد چه کاری انجام دهد). بکاند merge همچنین دارای گزینه --empty=(drop|keep|stop) برای تغییر رفتار مدیریت کامیتهایی است که خالی میشوند.
تشخیص تغییر نام دایرکتوری (Directory rename detection)
به دلیل فقدان اطلاعات دقیق درباره درخت (ناشی از ایجاد نیاکان ساختگی بر اساس اطلاعات محدود موجود در وصلهها)، قابلیت تشخیص تغییر نام دایرکتوری در بکاند apply غیرفعال است. غیرفعال بودن تشخیص تغییر نام دایرکتوری به این معنی است که اگر یک طرف تاریخچه دایرکتوری را تغییر نام دهد و طرف دیگر فایلهای جدیدی به دایرکتوری قدیمی اضافه کند، آنگاه فایلهای جدید بدون هیچ هشداری در زمان ریبیس مبنی بر اینکه شاید بخواهید این فایلها را به دایرکتوری جدید منتقل کنید، در دایرکتوری قدیمی باقی میمانند.
تشخیص تغییر نام دایرکتوری با بکاند merge کار میکند تا در چنین مواردی به شما هشدار دهد.
زمینه (Context)
بکاند apply با ایجاد توالیای از وصلهها (از طریق فراخوانی داخلی format-patch) و سپس اعمال وصلهها به ترتیب (از طریق فراخوانی داخلی am) عمل میکند. وصلهها از چندین تکه (hunk) تشکیل شدهاند که هر یک شامل شماره خطوط، ناحیه زمینه (context region) و تغییرات واقعی است. شماره خطوط باید با مقداری افست (انحراف) در نظر گرفته شوند، زیرا طرف دیگر احتمالاً خطوطی را پیشتر در فایل اضافه یا حذف کرده است. ناحیه زمینه به این منظور در نظر گرفته شده که چگونگی تنظیم شماره خطوط را مشخص کند تا تغییرات روی خطوط صحیح اعمال شوند. با این حال، اگر چندین بخش از کد دارای خطوط زمینه مشابه در اطراف خود باشند، ممکن است بخش اشتباهی انتخاب شود. موارد واقعی وجود داشته است که در آنها این امر موجب اعمال نادرست کامیتها بدون گزارش هیچ تعارضی شده است. تنظیم diff.context روی یک مقدار بزرگتر ممکن است از چنین مشکلاتی جلوگیری کند، اما احتمال تعارضهای کاذب را افزایش میدهد (زیرا برای اعمال شدن به خطوط زمینه منطبق بیشتری نیاز خواهد داشت).
بکاند merge با یک رونوشت کامل از هر فایل مربوطه کار میکند، که آن را در برابر این گونه مشکلات مصون میدارد.
برچسبگذاری نشانگرهای تعارض (Labelling of conflicts markers)
هنگامی که تعارض محتوایی وجود دارد، سازوکار ادغام تلاش میکند نشانگرهای تعارض هر طرف را با کامیتهایی که محتوا از آنها آمده است برچسبگذاری کند. از آنجا که بکاند apply اطلاعات اصلی درباره کامیتهای ریبیسشده و والدین آنها را دور میاندازد (و در عوض بر اساس اطلاعات محدود موجود در وصلههای تولیدشده، کامیتهای جعلی جدیدی میسازد)، آن کامیتها قابل شناسایی نیستند؛ در عوض مجبور است به خلاصهای از کامیت بازگردد. همچنین، هنگامی که merge.conflictStyle روی diff3 یا zdiff3 تنظیم شده باشد، بکاند apply از "constructed merge base" (پایه ادغام ساختهشده) برای برچسبگذاری محتوای حاصل از پایه ادغام استفاده میکند و بدین ترتیب هیچگونه اطلاعاتی درباره کامیت پایه ادغام ارائه نمیدهد.
بکاند merge با کامیتهای کامل در هر دو سوی تاریخچه کار میکند و بنابراین چنین محدودیتهایی ندارد.
قلابها (Hooks)
بکاند apply بهطور سنتی قلاب post-commit را فراخوانی نکرده است، در حالی که بکاند merge آن را فراخوانی کرده است. هر دو بکاند قلاب post-checkout را فراخوانی کردهاند، هرچند بکاند merge خروجی آن را بیصدا (squelch) کرده است. علاوه بر این، هر دو بکاند قلاب post-checkout را فقط با کامیت نقطه شروع ریبیس فراخوانی میکنند، نه با کامیتهای میانی و نه کامیت نهایی. در هر مورد، فراخوانی این قلابها بر حسب تصادف در پیادهسازی بوده تا از روی طراحی (هر دو بکاند در اصل به صورت اسکریپت شل پیادهسازی شده بودند و تصادفاً دستورات دیگری مانند git checkout یا git commit را اجرا میکردند که آن قلابها را فراخوانی میکردند). هر دو بکاند باید رفتار یکسانی داشته باشند، گرچه کاملاً مشخص نیست کدامیک (در صورت صحت هر کدام) درست است. ما احتمالاً در آینده کاری خواهیم کرد که rebase فراخوانی هر دوی این قلابها را متوقف کند.
قابلیت وقفه (Interruptability)
بکاند apply در مواجهه با وقفههای بدموقع دچار مشکلات ایمنی است؛ اگر کاربر در زمان نامناسبی برای لغو ریبیس کلیدهای Ctrl-C را فشار دهد، ریبیس ممکن است وارد وضعیتی شود که نتوان آن را با یک دستور بعدی git rebase --abort لغو کرد. به نظر نمیرسد بکاند merge از همین کاستی رنج ببرد. (برای جزئیات بیشتر به https://lore.kernel.org/git/20200207132152.GC2868@szeder.dev مراجعه کنید.)
بازنویسی پیام کامیت (Commit Rewording)
هنگامی که در حین ریبیس تعارضی رخ میدهد، عملیات rebase متوقف شده و از کاربر میخواهد آن را حل کند. از آنجا که ممکن است کاربر در حین حل تعارض نیاز به اعمال تغییرات چشمگیری داشته باشد، پس از حل تعارضها و اجرای git rebase --continue توسط کاربر، عملیات ریبیس باید یک ویرایشگر را باز کرده و از کاربر بخواهد پیام کامیت را بهروز کند. بکاند merge این کار را انجام میدهد، در حالی که بکاند apply کورکورانه پیام کامیت اولیه را اعمال میکند.
سایر تفاوتها (Miscellaneous differences)
چند تفاوت رفتاری دیگر نیز وجود دارد که بیشتر افراد احتمالاً آنها را کماهمیت تلقی میکنند، اما برای کامل بودن به آنها اشاره میشود:
راهبردهای ادغام (MERGE STRATEGIES)
سازوکار ادغام (دستورهای git merge و git pull) امکان انتخاب راهبردهای ادغام پسزمینه را با گزینه -s فراهم میکند. برخی راهبردها نیز میتوانند گزینههای ویژه خود را دریافت کنند که میتوان آنها را با دادن آرگومانهای -X<option> به git merge یا git pull ارسال کرد.
ort
در حالتی که مسیر مورد نظر یک زیرماژول است، اگر کامیت زیرماژول استفادهشده در یک طرف ادغام، نواده (descendant) کامیت زیرماژول استفادهشده در طرف دیگر ادغام باشد، گیت تلاش میکند تا به آن نواده فستفوروارد کند. در غیر این صورت، گیت این حالت را بهعنوان یک تعارض در نظر میگیرد و کامیت زیرماژولی را که نواده کامیتهای دارای تعارض است (در صورت وجود) بهعنوان راهحل پیشنهاد میکند.
راهبرد ort میتواند گزینههای زیر را بپذیرد:
ours
این گزینه نباید با راهبرد ادغام ours اشتباه گرفته شود؛ آن راهبرد اصلاً به آنچه درخت دیگر شامل میشود نگاه نمیکند و هر کاری را که درخت دیگر انجام داده دور میاندازد و اعلام میکند که تاریخچه ما شامل تمام رویدادهایی است که در آن رخ داده است.
theirs
ignore-space-change, ignore-all-space, ignore-space-at-eol, ignore-cr-at-eol
renormalize
no-renormalize
find-renames[=<n>]
rename-threshold=<n>
no-renames
histogram
patience
diff-algorithm=(histogram|minimal|myers|patience)
subtree[=<path>]
recursive
resolve
octopus
ours
subtree
در راهبردهایی که از ادغام ۳-طرفه استفاده میکنند (از جمله راهبرد پیشفرض، ort)، اگر تغییری در هر دو شاخه ایجاد شود اما بعداً در یکی از شاخهها بازگردانی (revert) شود، آن تغییر در نتیجه ادغام وجود خواهد داشت؛ برخی این رفتار را گیجکننده میدانند. این حالت رخ میدهد زیرا هنگام انجام ادغام، فقط سرشاخهها و پایه ادغام (merge base) در نظر گرفته میشوند، نه تکتک کامیتها. بنابراین الگوریتم ادغام، تغییر بازگرداندهشده را اصلاً بهعنوان هیچ تغییری در نظر نمیگیرد و در عوض نسخه تغییریافته را جایگزین میکند.
نکات (NOTES)
شما باید پیامدهای استفاده از git rebase را بر روی مخزنی که به اشتراک میگذارید درک کنید. همچنین به بخش RECOVERING FROM UPSTREAM REBASE در ادامه مراجعه فرمایید.
هنگامی که rebase اجرا میشود، در صورت وجود ابتدا یک قلاب pre-rebase را اجرا میکند. میتوانید از این قلاب برای بررسیهای صحتسنجی استفاده کنید و در صورت نامناسب بودن، rebase را رد نمایید. لطفاً برای مشاهده یک مثال به اسکریپت الگوی قلاب pre-rebase مراجعه کنید.
پس از تکمیل، <branch> شاخه جاری خواهد بود.
حالت تعاملی (INTERACTIVE MODE)
بازپایهریزی تعاملی به این معنی است که شما فرصت ویرایش کامیتهایی را که بازپایهریزی میشوند خواهید داشت. میتوانید ترتیب کامیتها را تغییر دهید و آنها را حذف کنید (زدودن وصلههای نامناسب یا ناخواسته).
حالت تعاملی برای این نوع جریان کاری در نظر گرفته شده است:
که در آن مورد ۲ شامل چندین نمونه از این موارد است:
الف) استفاده معمول
ب) اصلاح مستقل (fixup)
گاهی موردی که در ب.۲. رفع شده است را نمیتوان به کامیت نهچندان کاملی که آن را اصلاح میکند الحاق (amend) کرد، زیرا آن کامیت در اعماق یک سری وصله قرار گرفته است. این دقیقاً همان چیزی است که بازپایهریزی تعاملی برای آن در نظر گرفته شده است: استفاده از آن پس از تعداد زیادی «الف» و «ب»، با بازآرایی و ویرایش کامیتها، و ادغام (squash) چندین کامیت در یک کامیت واحد.
آن را با آخرین کامیتی که میخواهید به همین شکل باقی بماند شروع کنید:
git rebase -i <after-this-commit>
یک ویرایشگر همراه با تمام کامیتهای شاخه فعلی شما (با صرفنظر از کامیتهای ادغام) که پس از کامیت ارائهشده آمدهاند باز خواهد شد. شما میتوانید تا هر اندازه که مایلید ترتیب کامیتها را در این فهرست تغییر دهید و میتوانید آنها را حذف کنید. این فهرست کموبیش به این صورت است:
pick deadbee The oneline of this commit pick fa1afe1 The oneline of the next commit ...
توضیحات تکخطی صرفاً برای راحتی شما هستند؛ دستور git rebase به آنها نگاه نمیکند بلکه به نامهای کامیت توجه میکند (در این مثال "deadbee" و "fa1afe1")، بنابراین نامها را حذف یا ویرایش نکنید.
با جایگزین کردن دستور "pick" با دستور "edit"، میتوانید به git rebase بگویید که پس از اعمال آن کامیت متوقف شود، تا بتوانید فایلها و/یا پیام کامیت را ویرایش کنید، کامیت را اصلاح (amend) نمایید و به بازپایهریزی ادامه دهید.
برای ایجاد وقفه در بازپایهریزی (دقیقاً همانطور که دستور "edit" عمل میکند، اما بدون گلچینکردن (cherry-pick) هیچ کامیتی پیش از آن)، از دستور "break" استفاده کنید.
اگر فقط میخواهید پیام یک کامیت را ویرایش کنید، دستور "pick" را با دستور "reword" جایگزین نمایید.
برای دور انداختن یک کامیت، دستور "pick" را با "drop" جایگزین کنید، یا به سادگی خط مربوط به آن را حذف نمایید.
اگر میخواهید دو یا چند کامیت را در یک کامیت ادغام (fold) کنید، دستور "pick" را برای کامیت دوم و کامیتهای بعدی با "squash" یا "fixup" جایگزین کنید. اگر کامیتها نویسندگان متفاوتی داشته باشند، کامیت ادغامشده به نویسنده کامیت نخست نسبت داده خواهد شد. پیام کامیت پیشنهادی برای کامیت ادغامشده، الحاق پیام کامیت نخست با پیامهای مشخصشده توسط دستورهای "squash" است، با حذف پیامهای کامیتهایی که با دستورهای "fixup" مشخص شدهاند، مگر اینکه از "fixup -c" استفاده شود. در این صورت، پیام کامیت پیشنهادی فقط پیام کامیت "fixup -c" خواهد بود و یک ویرایشگر باز میشود که به شما اجازه میدهد پیام را ویرایش کنید. محتویات (وصله) کامیت "fixup -c" همچنان در کامیت ادغامشده گنجانده میشود. اگر بیش از یک کامیت "fixup -c" وجود داشته باشد، پیام مربوط به آخرین مورد استفاده خواهد شد. همچنین میتوانید از "fixup -C" استفاده کنید تا همان رفتار "fixup -c" را داشته باشید با این تفاوت که ویرایشگری باز نمیشود.
دستور git rebase هنگامی که "pick" با "edit" جایگزین شده باشد یا زمانی که دستوری به دلیل خطاهای ادغام شکست بخورد متوقف خواهد شد. هنگامی که ویرایش و/یا حل تعارضها را به پایان رساندید، میتوانید با git rebase --continue ادامه دهید.
به عنوان مثال، اگر میخواهید ۵ کامیت آخر را به گونهای بازآرایی کنید که آنچه قبلاً HEAD~4 بود به HEAD جدید تبدیل شود. برای رسیدن به این منظور، git rebase را به این صورت فراخوانی میکنید:
$ git rebase -i HEAD~5
و نخستین وصله را به انتهای فهرست منتقل میکنید.
ممکن است بخواهید کامیتهای ادغام را دوباره ایجاد کنید، برای مثال اگر چنین تاریخچهای داشته باشید:
X
\
A---M---B
/
---o---O---P---Q
فرض کنید میخواهید شاخه فرعی را که از "A" آغاز میشود بر روی "Q" بازپایهریزی کنید. مطمئن شوید که HEAD فعلی "B" است، و این دستور را فراخوانی کنید:
$ git rebase -i -r --onto Q O
بازآرایی و ویرایش کامیتها معمولاً مراحل میانی آزمایشنشدهای ایجاد میکند. شاید بخواهید با اجرای یک آزمون، یا حداقل کامپایل مجدد در نقاط میانی تاریخچه با استفاده از دستور "exec" (میانبر "x") بررسی کنید که ویرایش تاریخچه شما چیزی را خراب نکرده باشد. میتوانید این کار را با ایجاد یک فهرست کارها (todo list) مانند این انجام دهید:
pick deadbee Implement feature XXX fixup f1a5c00 Fix to feature XXX exec make pick c0ffeee The oneline of the next commit edit deadbab The oneline of the commit after exec cd subdir; make test ...
بازپایهریزی تعاملی در صورت شکست یک دستور (یعنی خروج با وضعیتی غیر از ۰) متوقف میشود تا به شما فرصت رفع مشکل را بدهد. میتوانید با git rebase --continue ادامه دهید.
دستور "exec" فرمان را در یک پوسته (پوسته پیشفرض، معمولاً /bin/sh) اجرا میکند، بنابراین میتوانید از ویژگیهای پوسته (مانند "cd"، ">"، ";" و ...) استفاده کنید. این فرمان از ریشه درخت کاری اجرا میشود.
$ git rebase -i --exec "make test"
این دستور به شما امکان میدهد بررسی کنید که کامیتهای میانی قابل کامپایل هستند. فهرست کارها به این شکل درمیآید:
pick 5928aea one exec make test pick 04d0fda two exec make test pick ba46169 three exec make test pick f4593f9 four exec make test
تقسیم کامیتها (SPLITTING COMMITS)
در حالت تعاملی، میتوانید کامیتها را با عملیات "edit" علامتگذاری کنید. با این حال، این لزوماً به این معنی نیست که git rebase انتظار دارد نتیجه این ویرایش دقیقاً یک کامیت باشد. در واقع، میتوانید کامیت را لغو (undo) کنید یا کامیتهای دیگری اضافه نمایید. از این قابلیت میتوان برای تقسیم یک کامیت به دو کامیت استفاده کرد:
اگر کاملاً مطمئن نیستید که بازبینیهای میانی سازگار و پایدار هستند (کامپایل میشوند، مجموعه آزمایشها را با موفقیت میگذرانند، و غیره)، باید پس از هر کامیت از git stash برای ذخیره موقت تغییرات کامیتنشده استفاده کنید، آزمایش را انجام دهید، و در صورت نیاز به اصلاحات، کامیت را اصلاح (amend) نمایید.
بازیابی پس از ریبیس بالادست (RECOVERING FROM UPSTREAM REBASE)
ریبیس کردن (یا هر شکل دیگری از بازنویسی) شاخهای که دیگران کار خود را بر پایه آن بنا نهادهاند، ایده بدی است: هر کسی در پاییندست (downstream) آن مجبور میشود تاریخچه خود را بهصورت دستی اصلاح کند. این بخش توضیح میدهد که چگونه این اصلاح را از دیدگاه پاییندست انجام دهید. با این حال، راهحل واقعی این است که در وهله اول از ریبیس کردن شاخه بالادست (upstream) خودداری شود.
برای مثال، فرض کنید در موقعیتی هستید که شخصی یک شاخه subsystem را توسعه میدهد، و شما در حال کار بر روی شاخه topic هستید که به این subsystem وابسته است. ممکن است به تاریخچهای مانند زیر برسید:
o---o---o---o---o---o---o---o master
\
o---o---o---o---o subsystem
\
*---*---* topic
اگر subsystem نسبت به master ریبیس شود، اتفاق زیر رخ میدهد:
o---o---o---o---o---o---o---o master
\ \
o---o---o---o---o o'--o'--o'--o'--o' subsystem
\
*---*---* topic
حال اگر به توسعه مثل همیشه ادامه دهید و در نهایت topic را در subsystem ادغام (merge) کنید، کامیتهای شاخه subsystem برای همیشه تکراری باقی خواهند ماند:
o---o---o---o---o---o---o---o master
\ \
o---o---o---o---o o'--o'--o'--o'--o'--M subsystem
\ /
*---*---*-..........-*--* topic
چنین موارد تکراری معمولاً ناپسند شمرده میشوند چرا که تاریخچه را شلوغ و نامرتب کرده و دنبال کردن آن را سختتر میکنند. برای پاکسازی، لازم است کامیتهای روی topic را به نوک جدید subsystem پیوند بزنید، یعنی topic را ریبیس کنید. این موضوع اثری موجی (ripple effect) به همراه دارد: هر کسی در پاییندست topic نیز مجبور میشود ریبیس کند و همینطور الی آخر!
دو نوع راهحل اصلاحی وجود دارد که در زیربخشهای زیر بررسی میشوند:
حالت ساده: تغییرات دقیقاً همان هستند.
حالت پیچیده: تغییرات یکسان نیستند.
حالت ساده (The easy case)
تنها زمانی کار میکند که تغییرات (شناسههای وصله بر اساس محتویات diff) روی subsystem قبل و بعد از ریبیسی که subsystem انجام داده است، دقیقاً یکسان باشند.
در این حالت، اصلاح ساده است زیرا git rebase میداند که باید از تغییراتی که از قبل در بالادست جدید وجود دارند صرفنظر کند (مگر اینکه --reapply-cherry-picks داده شده باشد). بنابراین اگر دستور زیر را اجرا کنید (با این فرض که روی شاخه topic هستید)
$ git rebase subsystem
به تاریخچه اصلاحشده زیر خواهید رسید
o---o---o---o---o---o---o master
\
o'--o'--o'--o'--o' subsystem
\
*---*---* topic
حالت پیچیده (The hard case)
اگر تغییرات subsystem دقیقاً با تغییرات پیش از ریبیس مطابقت نداشته باشند، اوضاع پیچیدهتر میشود.
نکته
اگرچه «بازیابی در حالت ساده» گاهی حتی در حالت پیچیده نیز موفقیتآمیز به نظر میرسد، اما ممکن است پیامدهای ناخواستهای در پی داشته باشد. به عنوان مثال، کامیتی که از طریق git rebase --interactive حذف شده بود، دوباره زنده خواهد شد!
ایده اصلی این است که به صورت دستی به git rebase بگویید «subsystem قدیمی کجا تمام شد و topic شما از کجا آغاز گشت»، یعنی پایه ادغام (merge base) قدیمی میان آنها چه بوده است. باید راهی برای نام بردن از آخرین کامیت subsystem قدیمی پیدا کنید، برای مثال:
سپس میتوانید محدوده قدیمی subsystem..topic را با دستور زیر (برای حالت reflog و با فرض اینکه از قبل روی شاخه topic هستید) به نوک جدید پیوند بزنید:
$ git rebase --onto subsystem subsystem@{1}
اثر موجی بازیابی در «حالت پیچیده» به طور ویژهای بد است: همه افراد در پاییندست topic اکنون باید بازیابی «حالت پیچیده» را نیز انجام دهند!
ریبیس کردن ادغامها (REBASING MERGES)
دستور ریبیس تعاملی در ابتدا برای مدیریت مجموعههای وصله منفرد طراحی شده بود. به همین دلیل، منطقی است که کامیتهای ادغام از فهرست کارها (todo list) کنار گذاشته شوند، زیرا ممکن است توسعهدهنده در حین کار بر روی شاخه، شاخه master فعلی آن زمان را ادغام کرده باشد، فقط برای اینکه در نهایت تمام کامیتها را روی master ریبیس کند (با نادیده گرفتن کامیتهای ادغام).
با این حال، دلایل موجهی وجود دارد که چرا یک توسعهدهنده ممکن است بخواهد کامیتهای ادغام را دوباره ایجاد کند: برای حفظ ساختار شاخه (یا «توپولوژی کامیت») هنگام کار بر روی چندین شاخه مرتبط با یکدیگر.
در مثال زیر، توسعهدهنده روی یک شاخه موضوعی کار میکند که شیوه تعریف دکمهها را بازسازی میکند، و روی شاخه موضوعی دیگری که از آن بازسازی برای پیادهسازی دکمه «گزارش باگ» استفاده میکند. خروجی git log --graph --format=%s -5 ممکن است شبیه این باشد:
* Merge branch 'report-a-bug' |\ | * Add the feedback button * | Merge branch 'refactor-button' |\ \ | |/ | * Use the Button class for all buttons | * Extract a generic Button class from the DownloadButton one
توسعهدهنده ممکن است بخواهد در حین حفظ توپولوژی شاخه، آن کامیتها را روی یک شاخه جدیدتر master ریبیس کند، به عنوان مثال هنگامی که انتظار میرود شاخه موضوعی اول بسیار زودتر از شاخه دوم در master ادغام شود، مثلاً برای رفع تداخلهای ادغام با تغییرات اعمالشده در کلاس DownloadButton که وارد master شدهاند.
این ریبیس را میتوان با استفاده از گزینه --rebase-merges انجام داد. این گزینه یک فهرست کارها (todo list) مانند زیر تولید خواهد کرد:
label onto # Branch: refactor-button reset onto pick 123456 Extract a generic Button class from the DownloadButton one pick 654321 Use the Button class for all buttons label refactor-button # Branch: report-a-bug reset refactor-button # Use the Button class for all buttons pick abcdef Add the feedback button label report-a-bug reset onto merge -C a1b2c3 refactor-button # Merge 'refactor-button' merge -C 6f5e4d report-a-bug # Merge 'report-a-bug'
برخلاف یک ریبیس تعاملی معمولی، علاوه بر دستورهای pick، دستورهای label، reset و merge نیز وجود دارند.
دستور label هنگامی که آن دستور اجرا میشود، یک برچسب (label) را به HEAD فعلی مرتبط میکند. این برچسبها به عنوان ارجاعهای محلی درخت کاری (refs/rewritten/<label>) ایجاد میشوند که پس از پایان ریبیس حذف خواهند شد. به این ترتیب، عملیات ریبیس در چندین درخت کاری متصل به یک مخزن مشترک، با یکدیگر تداخل پیدا نمیکنند. اگر دستور label با شکست مواجه شود، بلافاصله همراه با پیامی مفید درباره نحوه ادامه کار، مجدداً زمانبندی میشود.
دستور reset، اشارهگر HEAD، نمایه (index) و درخت کاری (worktree) را به بازبینی مشخصشده بازنشانی میکند. این دستور شبیه به exec git reset --hard <label> عمل میکند، اما از بازنویسی فایلهای ردیابینشده خودداری میکند. اگر دستور reset ناموفق باشد، بلافاصله همراه با یک پیام راهنما درباره نحوه ویرایش فهرست کارها، مجدداً زمانبندی میشود (این اتفاق معمولاً زمانی رخ میدهد که دستور reset به صورت دستی در فهرست کارها درج شده باشد و حاوی غلط املایی باشد).
دستور merge بازبینی(های) مشخصشده را در هر آنچه در آن زمان HEAD است ادغام خواهد کرد. با گزینه -C <original-commit>، پیام کامیت مربوط به کامیت ادغام مشخصشده استفاده خواهد شد. هنگامی که -C به حرف کوچک -c تبدیل شود، پیام پس از یک ادغام موفق در ویرایشگری باز میشود تا کاربر بتواند آن پیام را ویرایش کند.
اگر یک دستور merge به هر دلیلی غیر از تداخلهای ادغام با شکست مواجه شود (یعنی زمانی که عملیات ادغام حتی شروع هم نشده است)، بلافاصله مجدداً زمانبندی میشود.
به طور پیشفرض، دستور merge از راهبرد ادغام ort برای ادغامهای عادی و از octopus برای ادغامهای اختاپوسی استفاده خواهد کرد. کاربر میتواند با استفاده از آرگومان --strategy هنگام فراخوانی rebase یک راهبرد پیشفرض برای تمامی ادغامها تعیین کند، یا با استفاده از یک دستور exec برای فراخوانی صریح git merge همراه با آرگومان --strategy، ادغامهای خاصی را در فهرست تعاملی دستورات بازنویسی و لغو کند. توجه داشته باشید که هنگام فراخوانی صریح git merge به این شکل، میتوانید از این واقعیت بهره ببرید که برچسبها ارجاعهای محلی درخت کاری هستند (برای مثال، ارجاع refs/rewritten/onto متناظر با برچسب onto خواهد بود) تا به شاخههایی که میخواهید ادغام کنید ارجاع دهید.
نکته: دستور اول (label onto) بازبینیای را برچسبگذاری میکند که کامیتها بر روی آن ریبیس میشوند؛ نام onto صرفاً یک قرارداد و اشارهای به گزینه --onto است.
همچنین میتوان کامیتهای ادغام کاملاً جدید را از ابتدا با افزودن دستوری به فرم merge <merge-head> معرفی کرد. این فرم یک پیام کامیت موقت ایجاد میکند و همیشه ویرایشگری را باز میکند تا به کاربر اجازه دهد آن را ویرایش نماید. این قابلیت میتواند مفید باشد، برای مثال هنگامی که معلوم میشود یک شاخه موضوعی به بیش از یک هدف یا دغدغه پرداخته است و باید به دو یا چند شاخه موضوعی تفکیک شود. این فهرست کارها (todo list) را در نظر بگیرید:
pick 192837 Switch from GNU Makefiles to CMake pick 5a6c7e Document the switch to CMake pick 918273 Fix detection of OpenSSL in CMake pick afbecd http: add support for TLS v1.3 pick fdbaec Fix detection of cURL in CMake on Windows
تنها کامیتی که در این فهرست ارتباطی با CMake ندارد، ممکن است بسیار محتمل باشد که انگیزهاش از کار روی رفع باگهای ناشی از تغییر به CMake نشأت گرفته باشد، اما به موضوع متفاوتی میپردازد. برای تقسیم این شاخه به دو شاخه موضوعی، میتوان فهرست کارها را به این شکل ویرایش کرد:
label onto pick afbecd http: add support for TLS v1.3 label tlsv1.3 reset onto pick 192837 Switch from GNU Makefiles to CMake pick 918273 Fix detection of OpenSSL in CMake pick fdbaec Fix detection of cURL in CMake on Windows pick 5a6c7e Document the switch to CMake label cmake reset onto merge tlsv1.3 merge cmake
پیکربندی (CONFIGURATION)
تمام موارد زیر در این بخش بهصورت گزینشی از مستندات git-config(1) آورده شدهاند. محتوا همان چیزی است که در آنجا یافت میشود:
rebase.backend
rebase.stat
rebase.autoSquash
rebase.autoStash
rebase.updateRefs
rebase.missingCommitsCheck
rebase.instructionFormat
rebase.abbreviateCommands
p deadbee The oneline of the commit p fa1afe1 The oneline of the next commit ...
به جای:
pick deadbee The oneline of the commit pick fa1afe1 The oneline of the next commit ...
پیشفرض نادرست (false) است.
rebase.rescheduleFailedExec
rebase.forkPoint
rebase.rebaseMerges
rebase.maxLabelLength
sequence.editor
همچنین ببینید (SEE ALSO)
گیت (GIT)
بخشی از مجموعه git(1)
نکات (NOTES)
- 1.
- راهنمای revert-a-faulty-merge How-To
- 2.
- filter-repo
| 2026-06-29 | Git 2.55.0 |