GIT-REBASE(1) Git Manual GIT-REBASE(1)

git-rebase - بازاعمال کامیت‌ها بر روی سرشاخه جدید

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)

پیوند زدن مجموعه‌ای از کامیت‌ها بر روی یک نقطه شروع متفاوت. همچنین می‌توانید از 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 در اولین کامیت دارای مشکل متوقف شده و نشانگرهای تعارض را باقی می‌گذارد. در این حالت می‌توانید یکی از این کارها را انجام دهید:

1.حل کردن تعارض. می‌توانید از git diff برای یافتن نشانگرها (<<<<<<) و اعمال تغییرات جهت رفع تعارض استفاده کنید. برای هر فایلی که ویرایش می‌کنید، باید به گیت اعلام کنید که تعارض رفع شده است. می‌توانید تعارض را با git add <filename> به عنوان حل‌شده علامت‌گذاری کنید. پس از حل تمام تعارض‌ها، می‌توانید فرآیند بازاعمال را با دستور زیر ادامه دهید
git rebase --continue
2.متوقف کردن git rebase و بازگرداندن شاخه خود به وضعیت اولیه‌اش با
git rebase --abort
3.صرف‌نظر کردن از کامیتی که باعث ایجاد تعارض ادغام شد با
git rebase --skip

اگر شاخه بالادستی <upstream> را برای بازاعمال بر روی آن تعیین نکنید، بالادست پیکربندی‌شده در گزینه‌های branch.<name>.remote و branch.<name>.merge استفاده خواهد شد (برای جزئیات به git-config(1) رجوع کنید) و گزینه --fork-point فرض می‌شود. اگر هم‌اکنون روی هیچ شاخه‌ای قرار ندارید یا اگر شاخه فعلی بالادست پیکربندی‌شده‌ای ندارد، عملیات بازاعمال لغو خواهد شد.

در اینجا شرح ساده‌شده‌ای از عملکرد git rebase <upstream> آورده شده است:

1.تهیه فهرستی از تمام کامیت‌های شاخه فعلی شما از زمان انشعاب آن از <upstream> که کامیت معادلی در <upstream> ندارند.
2.استخراج (checkout) <upstream> با معادل git checkout --detach <upstream>.
3.اعمال مجدد کامیت‌ها، یک به یک، به ترتیب. این شبیه به اجرای git cherry-pick <commit> برای هر کامیت است. برای نحوه رسیدگی به ادغام‌ها به REBASING MERGES مراجعه کنید.
4.به‌روزرسانی شاخه شما تا با معادل git checkout -B <branch> به کامیت نهایی اشاره کند.

نکته

هنگام آغاز بازاعمال، ORIG_HEAD طوری تنظیم می‌شود که به کامیت رأس شاخه‌ای که قرار است بازاعمال شود اشاره کند. با این وجود، تضمینی نیست که در پایان بازاعمال نیز ORIG_HEAD همچنان به آن کامیت اشاره داشته باشد، در صورتی که دستورات دیگری که ORIG_HEAD را تغییر می‌دهند (مانند git reset) در طول بازاعمال استفاده شوند. با این حال، رأس قبلی شاخه با استفاده از reflog شاخه فعلی (یعنی @{1}، به gitrevisions(7) مراجعه کنید) در دسترس است.

در اینجا نحوه انتقال یک شاخه موضوعی مبتنی بر یک شاخه به شاخه‌ای دیگر با استفاده از 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) معتبری باشند.

گزینه‌های این بخش نمی‌توانند همراه با هیچ گزینه دیگری استفاده شوند، از جمله نه با یکدیگر:

--continue

فرآیند بازاعمال را پس از رفع تعارض ادغام از سر می‌گیرد.

--skip

فرآیند بازاعمال را با رد کردن وصله فعلی از سر می‌گیرد.

--abort

عملیات بازاعمال را لغو کرده و HEAD را به شاخه اصلی بازنشانی می‌کند. اگر <branch> مشخص شده باشد زمانی که عملیات بازاعمال آغاز شد، آنگاه HEAD به <branch> بازنشانی خواهد شد. در غیر این صورت HEAD به جایی که در زمان آغاز عملیات بازاعمال قرار داشت بازنشانی می‌شود.

--quit

عملیات بازاعمال را لغو می‌کند، اما HEAD به شاخه اصلی بازگردانده نمی‌شود. در نتیجه، نمایه و درخت کاری نیز بدون تغییر باقی می‌مانند. اگر یک مدخل اندوخته (stash) موقت با استفاده از --autostash ایجاد شده باشد، در فهرست اندوخته ذخیره خواهد شد.

--edit-todo

ویرایش فهرست کارهای انجام‌دادنی (todo) در طول یک بازاعمال تعاملی.

--show-current-patch

نمایش وصله فعلی در یک بازاعمال تعاملی یا زمانی که بازاعمال به دلیل تعارض‌ها متوقف شده است. این معادل git show REBASE_HEAD است.

--onto <newbase>

نقطه شروعی که کامیت‌های جدید در آنجا ایجاد می‌شوند. اگر گزینه --onto مشخص نشده باشد، نقطه شروع <upstream> خواهد بود. می‌تواند هر کامیت معتبری باشد، و نه فقط نام یک شاخه موجود.

در یک حالت خاص، در صورتی که دقیقاً یک پایه ادغام (merge base) وجود داشته باشد، می‌توانید از "A...B" به عنوان میان‌بری برای پایه ادغام A و B استفاده کنید. می‌توانید حداکثر یکی از A یا B را حذف کنید، که در این حالت مقدار پیش‌فرض آن HEAD خواهد بود.

برای مثال‌ها، بخش TRANSPLANTING A TOPIC BRANCH WITH --ONTO در بالا را ببینید.

--keep-base

نقطه شروع برای ایجاد کامیت‌های جدید را روی پایه ادغام (merge base) <upstream> و <branch> تنظیم می‌کند. اجرای git rebase --keep-base <upstream> <branch> معادل اجرای git rebase --reapply-cherry-picks --no-fork-point --onto <upstream>...<branch> <upstream> <branch> است.

این گزینه در مواردی مفید است که در حال توسعه یک قابلیت بر روی یک شاخه بالادست هستید. در حالی که روی این قابلیت کار می‌شود، شاخه بالادست ممکن است جلو برود و بازپایه‌ریزی مداوم روی سرشاخه بالادست ایده چندان مناسبی نباشد، بلکه حفظ کامیت پایه همان‌طور که هست ترجیح داده شود. از آنجا که کامیت پایه بدون تغییر باقی می‌ماند، این گزینه برای جلوگیری از گم شدن کامیت‌ها به طور ضمنی --reapply-cherry-picks را فعال می‌کند.

اگرچه هم این گزینه و هم --fork-point پایه ادغام میان <upstream> و <branch> را پیدا می‌کنند، اما این گزینه از پایه ادغام به عنوان نقطه شروع که کامیت‌های جدید روی آن ایجاد خواهند شد استفاده می‌کند، در حالی که --fork-point از پایه ادغام برای تعیین مجموعه کامیت‌هایی که بازپایه‌ریزی خواهند شد بهره می‌گیرد.

همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.

<upstream>

شاخه بالادست برای مقایسه با آن. می‌تواند هر کامیت معتبری باشد، و نه فقط نام یک شاخه موجود. پیش‌فرض، شاخه بالادستِ پیکربندی‌شده برای شاخه فعلی است.

<branch>

شاخه کاری؛ پیش‌فرض HEAD است.

--apply

استفاده از راهبردهای اعمال (apply) برای بازپایه‌ریزی (با فراخوانی درونی git-am). این گزینه ممکن است در آینده، زمانی که بک‌اند merge بتواند همه کارهای بک‌اند apply را انجام دهد، به یک دستور بی‌اثر (no-op) تبدیل شود.

همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.

--empty=(drop|keep|stop)

نحوه برخورد با کامیت‌هایی که در ابتدا خالی نیستند و گلچین‌های تمیز (clean cherry-picks) هیچ کامیت بالادستی نیز محسوب نمی‌شوند، اما پس از بازپایه‌ریزی خالی می‌شوند (زیرا شامل زیرمجموعه‌ای از تغییرات از پیش موجود در بالادست هستند):

drop

کامیت کنار گذاشته می‌شود. این رفتار پیش‌فرض است.

keep

کامیت نگه داشته می‌شود. این گزینه در صورت تعیین --exec به طور ضمنی فعال است، مگر آنکه -i/--interactive نیز مشخص شده باشد.

stop, ask

عملیات بازپایه‌ریزی با اعمال شدن کامیت متوقف می‌شود و به شما امکان می‌دهد انتخاب کنید که آیا آن را کنار بگذارید، فایل‌های بیشتری را ویرایش کنید، یا صرفاً تغییرات خالی را کامیت نمایید. این گزینه در صورت تعیین -i/--interactive به طور ضمنی فعال است. ask یک نام مترادف قدیمی و منسوخ‌شده برای stop است.

توجه داشته باشید کامیت‌هایی که از ابتدا خالی هستند حفظ می‌شوند (مگر اینکه --no-keep-empty مشخص شده باشد)، و کامیت‌هایی که گلچین‌های تمیز هستند (همان‌طور که توسط git log --cherry-mark ... تعیین می‌شود) در یک مرحله اولیه شناسایی شده و کنار گذاشته می‌شوند (مگر اینکه --reapply-cherry-picks یا --keep-base ارسال شده باشد).

همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.

--no-keep-empty, --keep-empty

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

استفاده از این فلگ احتمالاً به ندرت پیش خواهد آمد، زیرا می‌توانید صرفاً با شروع یک بازپایه‌ریزی تعاملی و حذف خطوط مربوط به کامیت‌هایی که نمی‌خواهید، از شر کامیت‌هایی که خالی شروع می‌شوند خلاص شوید. این فلگ به عنوان یک میان‌بر آسان وجود دارد، مثلاً برای مواردی که ابزارهای خارجی کامیت‌های خالی متعددی تولید کرده‌اند و شما می‌خواهید همه آن‌ها حذف شوند.

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

همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.

--reapply-cherry-picks, --no-reapply-cherry-picks

تمام گلچین‌های تمیز (clean cherry-picks) هر کامیت بالادست را به جای کنار گذاشتن پیش‌دستانه آن‌ها، مجدداً اعمال کن. (اگر این کامیت‌ها پس از بازپایه‌ریزی خالی شوند، به این دلیل که شامل زیرمجموعه‌ای از تغییرات از پیش موجود در بالادست هستند، رفتار نسبت به آن‌ها توسط فلگ --empty کنترل می‌شود.)

در نبود --keep-base (یا در صورتی که --no-reapply-cherry-picks داده شده باشد)، این کامیت‌ها به طور خودکار کنار گذاشته می‌شوند. از آنجا که این امر مستلزم خواندن تمام کامیت‌های بالادست است، در مخازنی با تعداد بسیار زیادی کامیت بالادست که نیاز به خوانده شدن دارند می‌تواند فرآیندی پرهزینه باشد. هنگام استفاده از بک‌اند merge، برای هر کامیت کنار گذاشته‌شده هشدارهایی صادر می‌شود (مگر اینکه --quiet داده شده باشد). همچنین راهنمایی‌هایی ارائه خواهد شد مگر اینکه advice.skippedCherryPicks روی false تنظیم شده باشد (به git-config(1) مراجعه کنید).

گزینه --reapply-cherry-picks به rebase امکان می‌دهد از خواندن تمام کامیت‌های بالادست صرف‌نظر کند، که به طور بالقوه موجب بهبود کارایی و عملکرد می‌شود.

همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.

--allow-empty-message

بی‌اثر (No-op). پیش‌تر بازپایه‌ریزی کامیت‌های دارای پیام خالی با خطا مواجه می‌شد و این گزینه آن رفتار را لغو می‌کرد و اجازه می‌داد کامیت‌های دارای پیام خالی بازپایه‌ریزی شوند. اکنون کامیت‌های دارای پیام خالی مانع ادامه کار بازپایه‌ریزی نمی‌شوند.

همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.

-m, --merge

استفاده از راهبردهای ادغام برای بازپایه‌ریزی (پیش‌فرض).

توجه داشته باشید که بازپایه‌ریزی ادغامی با بازپخش هر کامیت از شاخه کاری بر روی شاخه <upstream> عمل می‌کند. به همین دلیل، هنگام بروز تداخل در ادغام، سمتی که به عنوان ours گزارش می‌شود همان سری کامیت‌های بازپایه‌ریزی‌شده تا این لحظه است که با <upstream> شروع می‌شود، و سمت theirs شاخه کاری است. به عبارت دیگر، سمت‌ها جابه‌جا شده‌اند.

همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.

-s <strategy>, --strategy=<strategy>

استفاده از راهبرد ادغام داده‌شده، به جای مقدار پیش‌فرض ort. این گزینه به طور ضمنی --merge را فعال می‌کند.

از آنجا که git rebase هر کامیت از شاخه کاری را بر روی شاخه <upstream> با استفاده از راهبرد داده‌شده بازپخش می‌کند، استفاده از راهبرد ours صرفاً تمام وصله‌ها را از <branch> خالی می‌کند، که این کار چندان منطقی نیست.

همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.

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

ارسال <strategy-option> به راهبرد ادغام. این گزینه به طور ضمنی --merge و در صورتی که هیچ راهبردی مشخص نشده باشد، -s ort را فعال می‌کند. به جابه‌جا شدن ours و theirs همان‌طور که در بالا برای گزینه -m ذکر شد توجه کنید.

همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.

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

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

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

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

-q, --quiet

حالت بی‌صدا. به طور ضمنی --no-stat را فعال می‌کند.

-v, --verbose

نمایش با جزئیات کامل. به طور ضمنی --stat را فعال می‌کند.

--stat

نمایش گزارش آماری تغییرات (diffstat) از آنچه در بالادست پس از آخرین بازپایه‌ریزی تغییر کرده است. این diffstat همچنین توسط گزینه پیکربندی rebase.stat کنترل می‌شود.

-n, --no-stat

گزارش آماری تغییرات (diffstat) را به عنوان بخشی از فرآیند بازپایه‌ریزی نشان نده.

--no-verify

این گزینه قلاب pre-rebase را دور می‌زند. همچنین به githooks(5) مراجعه کنید.

--verify

اجازه اجرای قلاب pre-rebase را می‌دهد، که رفتار پیش‌فرض است. این گزینه می‌تواند برای باطل کردن --no-verify استفاده شود. همچنین به githooks(5) مراجعه کنید.

-C<n>

اطمینان از اینکه حداقل <n> خط از زمینه (context) پیرامونی قبل و بعد از هر تغییر مطابقت داشته باشد. وقتی خطوط کمتری از زمینه پیرامونی وجود دارد، همگی آن‌ها باید مطابقت داشته باشند. به طور پیش‌فرض هیچ زمینه‌ای نادیده گرفته نمی‌شود. به طور ضمنی --apply را فعال می‌کند.

همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.

--no-ff, --force-rebase, -f

اجرای مجدد تک‌تک تمام کامیت‌های بازپایه‌ریزی‌شده به جای فست‌فوروارد (fast-forward) روی موارد بدون تغییر. این کار تضمین می‌کند که کل تاریخچه شاخه بازپایه‌ریزی‌شده از کامیت‌های جدید تشکیل شود.

ممکن است پس از بازگردانی ادغام یک شاخه موضوعی (topic branch)، این گزینه برایتان مفید باشد؛ زیرا این گزینه شاخه موضوعی را با کامیت‌های تازه بازسازی می‌کند تا بتوان آن را بدون نیاز به «بازگردانیِ بازگردانی» (revert the reversion) مجدداً با موفقیت ادغام کرد (برای جزئیات به revert-a-faulty-merge How-To[1] مراجعه کنید).

--fork-point, --no-fork-point

استفاده از reflog برای یافتن یک نیای مشترک بهتر میان <upstream> و <branch> هنگام محاسبه این‌که کدام کامیت‌ها توسط <branch> معرفی شده‌اند.

هنگامی که --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

نادیده گرفتن تفاوت‌های فواصل خالی (whitespace) هنگام تلاش برای تطبیق اختلافات. در حال حاضر، هر بک‌اند تقریبی از این رفتار را پیاده‌سازی می‌کند:

بک‌اند apply

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

بک‌اند merge

هنگام ادغام، خطوطی را که فقط تغییرات فواصل خالی دارند به عنوان بدون تغییر در نظر می‌گیرد. متأسفانه این بدان معناست که هر تکه از وصله (patch hunk) که قصد آن تغییر فواصل خالی و نه هیچ چیز دیگری بوده است کنار گذاشته خواهد شد، حتی اگر طرف دیگر هیچ تغییری که تداخل داشته باشد نداشته باشد.

--whitespace=<option>

این فلگ به برنامه git apply (به git-apply(1) مراجعه کنید) که وصله را اعمال می‌کند ارسال می‌شود. به طور ضمنی --apply را فعال می‌کند.

همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.

--committer-date-is-author-date

به جای استفاده از زمان فعلی به عنوان تاریخ کامیت‌کننده، از تاریخ نویسنده کامیتِ در حال بازپایه‌ریزی به عنوان تاریخ کامیت‌کننده استفاده می‌کند. این گزینه به طور ضمنی --force-rebase را فعال می‌کند.

هشدار
سازوکار پیمایش تاریخچه فرض می‌کند که کامیت‌ها دارای برچسب‌های زمانی نامتناقص برای کامیت هستند. باید بررسی کنید که آیا واقعاً نیاز به استفاده از این گزینه دارید یا خیر. در این صورت فقط باید زمانی از این گزینه برای بازنویسی تاریخ کامیت‌کننده استفاده کنید که در حال بازپایه‌ریزی کامیت‌ها بر روی پایه‌ای هستید که کامیت آن (از نظر تاریخ کامیت) قدیمی‌تر از قدیمی‌ترین کامیتی است که در حال اعمال آن هستید (از نظر تاریخ نویسنده).

--ignore-date, --reset-author-date

به جای استفاده از تاریخ نویسنده کامیت اصلی، از زمان فعلی به عنوان تاریخ نویسنده کامیت بازپایه‌ریزی‌شده استفاده می‌کند. این گزینه به طور ضمنی --force-rebase را فعال می‌کند.

همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.

--signoff

یک تریلر (trailer) Signed-off-by به تمام کامیت‌های بازپایه‌ریزی‌شده اضافه می‌کند. توجه داشته باشید که اگر --interactive مشخص شده باشد، تریلر فقط به کامیت‌هایی اضافه می‌شود که برای pick، edit یا reword علامت‌گذاری شده باشند.

همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.

--trailer=<trailer>

افزودن تریلر داده‌شده به انتهای پیام هر کامیت بازپایه‌ریزی‌شده، که از طریق git-interpret-trailers(1) پردازش می‌شود. این گزینه به طور ضمنی --force-rebase را فعال می‌کند.

همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.

-i, --interactive

تهیه فهرستی از کامیت‌هایی که قرار است بازپایه‌ریزی شوند. به کاربر اجازه می‌دهد پیش از بازپایه‌ریزی آن فهرست را ویرایش کند. این حالت همچنین می‌تواند برای تقسیم کامیت‌ها استفاده شود (بخش SPLITTING COMMITS در ادامه را ببینید).

قالب فهرست کامیت‌ها را می‌توان با تنظیم گزینه پیکربندی rebase.instructionFormat تغییر داد. یک قالب دستورالعمل سفارشی به طور خودکار هش کامیت را در ابتدای قالب قرار می‌دهد.

همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.

-r, --rebase-merges[=(rebase-cousins|no-rebase-cousins)], --no-rebase-merges

به طور پیش‌فرض، یک بازپایه‌ریزی به سادگی کامیت‌های ادغام را از فهرست کارها (todo list) کنار می‌گذارد و کامیت‌های بازپایه‌ریزی‌شده را در یک شاخه واحد و خطی قرار می‌دهد. با --rebase-merges، فرآیند بازپایه‌ریزی در عوض تلاش می‌کند ساختار شاخه‌بندی را در میان کامیت‌هایی که قرار است بازپایه‌ریزی شوند با بازسازی کامیت‌های ادغام حفظ کند. هرگونه تداخل ادغامِ حل‌شده یا اصلاحات دستی در این کامیت‌های ادغام باید به طور دستی دوباره حل یا اعمال شوند. --no-rebase-merges می‌تواند برای باطل کردن هر دو گزینه پیکربندی rebase.rebaseMerges و یک --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 <cmd>" پس از هر خطی که یک کامیت در تاریخچه نهایی ایجاد می‌کند. <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

بازپایه‌ریزی تمام کامیت‌های در دسترس از <branch>، به جای محدود کردن آن‌ها با یک <upstream>. این کار به شما امکان می‌دهد تا کامیت(های) ریشه را روی یک شاخه بازپایه‌ریزی کنید.

همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.

--autosquash, --no-autosquash

فشرده‌سازی خودکار (squash) کامیت‌هایی با پیام‌های با قالب‌بندی ویژه در کامیت‌های قبلی که در حال بازپایه‌ریزی هستند. اگر پیام یک کامیت با "squash! "، "fixup! " یا "amend! " شروع شود، باقی‌مانده عنوان به عنوان مشخص‌کننده کامیت در نظر گرفته می‌شود، که در صورت مطابقت با عنوان یا هش آن کامیت، با یک کامیت قبلی تطبیق می‌یابد. اگر هیچ کامیتی به‌طور کامل مطابقت نداشته باشد، تطابق‌های مشخص‌کننده با ابتدای عناوین کامیت‌ها در نظر گرفته می‌شود.

در فهرست کارهای بازپایه‌ریزی، عملیات مربوط به کامیت‌های 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

ایجاد خودکار یک مدخل موقت استش (stash) قبل از شروع عملیات، و اعمال آن پس از پایان عملیات. این بدان معناست که می‌توانید بازپایه‌ریزی را روی یک درخت کاری دست‌خورده (dirty worktree) اجرا کنید. با این حال با احتیاط استفاده کنید: اعمال نهایی استش پس از یک بازپایه‌ریزی موفق ممکن است به تداخل‌های پیچیده منجر شود.

--reschedule-failed-exec, --no-reschedule-failed-exec

زمان‌بندی مجدد خودکار دستورات exec که شکست خورده‌اند. این قابلیت فقط در حالت تعاملی (یا زمانی که یک گزینه --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

به‌روزرسانی اجباری (force-update) خودکار هر شاخه‌ای که به کامیت‌های در حال بازپایه‌ریزی اشاره دارد. هر شاخه‌ای که در یک درخت کاری چک‌اوت شده باشد، از این طریق به‌روزرسانی نمی‌شود.

اگر متغیر پیکربندی rebase.updateRefs تنظیم شده باشد، این گزینه می‌تواند برای باطل کردن و غیرفعال‌سازی این تنظیم استفاده شود.

همچنین بخش INCOMPATIBLE OPTIONS در ادامه را ببینید.

گزینه‌های زیر:

•--apply
•--whitespace
•-C

با گزینه‌های زیر ناسازگار هستند:

•--merge
•--strategy
•--strategy-option
•--autosquash
•--rebase-merges
•--interactive
•--exec
•--no-keep-empty
•--empty=
•--[no-]reapply-cherry-picks در صورت استفاده بدون --keep-base
•--update-refs
•--root در صورت استفاده بدون --onto
•--trailer

علاوه بر این، جفت‌گزینه‌های زیر ناسازگار هستند:

•--keep-base و --onto
•--keep-base و --root
•--fork-point و --root

git rebase دارای دو بک‌اند اصلی است: apply و merge. (بک‌اند apply پیش‌تر به عنوان بک‌اند am شناخته می‌شد، اما این نام باعث سردرگمی بود زیرا به جای یک اسم شبیه به یک فعل به نظر می‌رسید. همچنین بک‌اند merge پیش‌تر به عنوان بک‌اند تعاملی (interactive) شناخته می‌شد، اما اکنون برای موارد غیرتعاملی نیز استفاده می‌شود. هر دو بر اساس عملکردهای سطح پایین‌تری که زیربنای هر یک بود تغییر نام یافتند.) تفاوت‌های ظریفی در نحوه رفتار این دو بک‌اند وجود دارد:

متأسفانه بک‌اند apply کامیت‌های تعمداً خالی را، یعنی کامیت‌هایی که از ابتدا خالی بوده‌اند، نادیده گرفته و حذف می‌کند، گرچه این موارد در عمل نادر هستند. این بک‌اند همچنین کامیت‌هایی را که خالی می‌شوند نیز حذف می‌کند و هیچ گزینه‌ای برای کنترل این رفتار ندارد.

بک‌اند merge به‌طور پیش‌فرض کامیت‌های تعمداً خالی را نگه می‌دارد (اگرچه با گزینه -i در ویرایشگر فهرست وظایف به عنوان خالی علامت‌گذاری می‌شوند، یا می‌توان آن‌ها را به‌طور خودکار با --no-keep-empty حذف کرد).

مشابه بک‌اند apply، بک‌اند merge نیز به‌طور پیش‌فرض کامیت‌هایی را که خالی می‌شوند حذف می‌کند، مگر اینکه -i/--interactive مشخص شده باشد (که در این صورت متوقف شده و از کاربر می‌پرسد چه کاری انجام دهد). بک‌اند merge همچنین دارای گزینه --empty=(drop|keep|stop) برای تغییر رفتار مدیریت کامیت‌هایی است که خالی می‌شوند.

به دلیل فقدان اطلاعات دقیق درباره درخت (ناشی از ایجاد نیاکان ساختگی بر اساس اطلاعات محدود موجود در وصله‌ها)، قابلیت تشخیص تغییر نام دایرکتوری در بک‌اند apply غیرفعال است. غیرفعال بودن تشخیص تغییر نام دایرکتوری به این معنی است که اگر یک طرف تاریخچه دایرکتوری را تغییر نام دهد و طرف دیگر فایل‌های جدیدی به دایرکتوری قدیمی اضافه کند، آن‌گاه فایل‌های جدید بدون هیچ هشداری در زمان ریبیس مبنی بر اینکه شاید بخواهید این فایل‌ها را به دایرکتوری جدید منتقل کنید، در دایرکتوری قدیمی باقی می‌مانند.

تشخیص تغییر نام دایرکتوری با بک‌اند merge کار می‌کند تا در چنین مواردی به شما هشدار دهد.

بک‌اند apply با ایجاد توالی‌ای از وصله‌ها (از طریق فراخوانی داخلی format-patch) و سپس اعمال وصله‌ها به ترتیب (از طریق فراخوانی داخلی am) عمل می‌کند. وصله‌ها از چندین تکه (hunk) تشکیل شده‌اند که هر یک شامل شماره خطوط، ناحیه زمینه (context region) و تغییرات واقعی است. شماره خطوط باید با مقداری افست (انحراف) در نظر گرفته شوند، زیرا طرف دیگر احتمالاً خطوطی را پیش‌تر در فایل اضافه یا حذف کرده است. ناحیه زمینه به این منظور در نظر گرفته شده که چگونگی تنظیم شماره خطوط را مشخص کند تا تغییرات روی خطوط صحیح اعمال شوند. با این حال، اگر چندین بخش از کد دارای خطوط زمینه مشابه در اطراف خود باشند، ممکن است بخش اشتباهی انتخاب شود. موارد واقعی وجود داشته است که در آن‌ها این امر موجب اعمال نادرست کامیت‌ها بدون گزارش هیچ تعارضی شده است. تنظیم diff.context روی یک مقدار بزرگ‌تر ممکن است از چنین مشکلاتی جلوگیری کند، اما احتمال تعارض‌های کاذب را افزایش می‌دهد (زیرا برای اعمال شدن به خطوط زمینه منطبق بیشتری نیاز خواهد داشت).

بک‌اند merge با یک رونوشت کامل از هر فایل مربوطه کار می‌کند، که آن را در برابر این گونه مشکلات مصون می‌دارد.

هنگامی که تعارض محتوایی وجود دارد، سازوکار ادغام تلاش می‌کند نشانگرهای تعارض هر طرف را با کامیت‌هایی که محتوا از آن‌ها آمده است برچسب‌گذاری کند. از آنجا که بک‌اند apply اطلاعات اصلی درباره کامیت‌های ریبیس‌شده و والدین آن‌ها را دور می‌اندازد (و در عوض بر اساس اطلاعات محدود موجود در وصله‌های تولیدشده، کامیت‌های جعلی جدیدی می‌سازد)، آن کامیت‌ها قابل شناسایی نیستند؛ در عوض مجبور است به خلاصه‌ای از کامیت بازگردد. همچنین، هنگامی که merge.conflictStyle روی diff3 یا zdiff3 تنظیم شده باشد، بک‌اند apply از "constructed merge base" (پایه ادغام ساخته‌شده) برای برچسب‌گذاری محتوای حاصل از پایه ادغام استفاده می‌کند و بدین ترتیب هیچ‌گونه اطلاعاتی درباره کامیت پایه ادغام ارائه نمی‌دهد.

بک‌اند merge با کامیت‌های کامل در هر دو سوی تاریخچه کار می‌کند و بنابراین چنین محدودیت‌هایی ندارد.

بک‌اند apply به‌طور سنتی قلاب post-commit را فراخوانی نکرده است، در حالی که بک‌اند merge آن را فراخوانی کرده است. هر دو بک‌اند قلاب post-checkout را فراخوانی کرده‌اند، هرچند بک‌اند merge خروجی آن را بی‌صدا (squelch) کرده است. علاوه بر این، هر دو بک‌اند قلاب post-checkout را فقط با کامیت نقطه شروع ریبیس فراخوانی می‌کنند، نه با کامیت‌های میانی و نه کامیت نهایی. در هر مورد، فراخوانی این قلاب‌ها بر حسب تصادف در پیاده‌سازی بوده تا از روی طراحی (هر دو بک‌اند در اصل به صورت اسکریپت شل پیاده‌سازی شده بودند و تصادفاً دستورات دیگری مانند git checkout یا git commit را اجرا می‌کردند که آن قلاب‌ها را فراخوانی می‌کردند). هر دو بک‌اند باید رفتار یکسانی داشته باشند، گرچه کاملاً مشخص نیست کدام‌یک (در صورت صحت هر کدام) درست است. ما احتمالاً در آینده کاری خواهیم کرد که rebase فراخوانی هر دوی این قلاب‌ها را متوقف کند.

بک‌اند apply در مواجهه با وقفه‌های بدموقع دچار مشکلات ایمنی است؛ اگر کاربر در زمان نامناسبی برای لغو ریبیس کلیدهای Ctrl-C را فشار دهد، ریبیس ممکن است وارد وضعیتی شود که نتوان آن را با یک دستور بعدی git rebase --abort لغو کرد. به نظر نمی‌رسد بک‌اند merge از همین کاستی رنج ببرد. (برای جزئیات بیشتر به https://lore.kernel.org/git/20200207132152.GC2868@szeder.dev مراجعه کنید.)

هنگامی که در حین ریبیس تعارضی رخ می‌دهد، عملیات rebase متوقف شده و از کاربر می‌خواهد آن را حل کند. از آنجا که ممکن است کاربر در حین حل تعارض نیاز به اعمال تغییرات چشمگیری داشته باشد، پس از حل تعارض‌ها و اجرای git rebase --continue توسط کاربر، عملیات ریبیس باید یک ویرایشگر را باز کرده و از کاربر بخواهد پیام کامیت را به‌روز کند. بک‌اند merge این کار را انجام می‌دهد، در حالی که بک‌اند apply کورکورانه پیام کامیت اولیه را اعمال می‌کند.

چند تفاوت رفتاری دیگر نیز وجود دارد که بیشتر افراد احتمالاً آن‌ها را کم‌اهمیت تلقی می‌کنند، اما برای کامل بودن به آن‌ها اشاره می‌شود:

•رف‌لاگ (Reflog): دو بک‌اند هنگام توصیف تغییرات ایجادشده در reflog از نگارش‌های متفاوتی استفاده خواهند کرد، گرچه هر دو از واژه "rebase" استفاده خواهند کرد.
•پیام‌های پیشرفت، اطلاعاتی و خطا: دو بک‌اند پیام‌های پیشرفت و اطلاعاتی اندکی متفاوت ارائه می‌دهند. همچنین بک‌اند apply پیام‌های خطا (مانند "...Your files would be overwritten") را در stdout می‌نویسد، در حالی که بک‌اند merge آن‌ها را در stderr می‌نویسد.
•دایرکتوری‌های وضعیت: این دو بک‌اند وضعیت خود را در دایرکتوری‌های متفاوتی در زیر .git/ نگه‌داری می‌کنند.

سازوکار ادغام (دستورهای git merge و git pull) امکان انتخاب راهبردهای ادغام پس‌زمینه را با گزینه -s فراهم می‌کند. برخی راهبردها نیز می‌توانند گزینه‌های ویژه خود را دریافت کنند که می‌توان آن‌ها را با دادن آرگومان‌های -X<option> به git merge یا git pull ارسال کرد.

ort

این راهبرد پیش‌فرض ادغام هنگام دریافت (pull) یا ادغام یک شاخه است. این راهبرد فقط می‌تواند دو سرشاخه را با استفاده از الگوریتم ادغام ۳-طرفه حل کند. هنگامی که بیش از یک والد مشترک وجود داشته باشد که بتوان برای ادغام ۳-طرفه از آن استفاده کرد، درختی ادغام‌شده از والدین مشترک ایجاد می‌کند و از آن به‌عنوان درخت مرجع برای ادغام ۳-طرفه بهره می‌برد. بر اساس آزمایش‌های انجام‌شده روی کامیت‌های ادغام واقعی برگرفته از تاریخچه توسعه هسته لینوکس ۲.۶، گزارش شده است که این روش منجر به تعارض‌های ادغام کمتر بدون ایجاد ادغام‌های نادرست می‌شود. علاوه بر این، این راهبرد می‌تواند ادغام‌های شامل تغییر نام را شناسایی و مدیریت کند. این راهبرد از نسخه‌برداری‌های شناسایی‌شده استفاده نمی‌کند. نام این الگوریتم یک کوته‌نوشت ("Ostensibly Recursive’s Twin") است و از این واقعیت ناشی می‌شود که به‌عنوان جایگزینی برای الگوریتم پیش‌فرض قبلی نوشته شده است: recursive.

در حالتی که مسیر مورد نظر یک زیرماژول است، اگر کامیت زیرماژول استفاده‌شده در یک طرف ادغام، نواده (descendant) کامیت زیرماژول استفاده‌شده در طرف دیگر ادغام باشد، گیت تلاش می‌کند تا به آن نواده فست‌فوروارد کند. در غیر این صورت، گیت این حالت را به‌عنوان یک تعارض در نظر می‌گیرد و کامیت زیرماژولی را که نواده کامیت‌های دارای تعارض است (در صورت وجود) به‌عنوان راه‌حل پیشنهاد می‌کند.

راهبرد ort می‌تواند گزینه‌های زیر را بپذیرد:

ours

این گزینه تکه‌های دارای تعارض (conflicting hunks) را مجبور می‌کند تا با اولویت دادن به نسخه ما (our) به‌طور خودکار و تمیز حل شوند. تغییرات درخت دیگر که با طرف ما تعارضی ندارند، در نتیجه ادغام منعکس می‌شوند. برای یک فایل باینری، کل محتوا از طرف ما گرفته می‌شود.

این گزینه نباید با راهبرد ادغام ours اشتباه گرفته شود؛ آن راهبرد اصلاً به آنچه درخت دیگر شامل می‌شود نگاه نمی‌کند و هر کاری را که درخت دیگر انجام داده دور می‌اندازد و اعلام می‌کند که تاریخچه ما شامل تمام رویدادهایی است که در آن رخ داده است.

theirs

این گزینه برعکس ours است؛ توجه داشته باشید که برخلاف ours، هیچ راهبرد ادغامی به نام theirs وجود ندارد که بتوان این گزینه ادغام را با آن اشتباه گرفت.

ignore-space-change, ignore-all-space, ignore-space-at-eol, ignore-cr-at-eol

خطوطی را که دارای نوع مشخص‌شده تغییرات در فاصله‌های خالی (whitespace) هستند، به منظور ادغام سه‌طرفه به‌عنوان خطوط بدون تغییر در نظر می‌گیرد. تغییرات فاصله‌های خالی که با تغییرات دیگر در یک خط ترکیب شده باشند، نادیده گرفته نمی‌شوند. همچنین به git-diff(1) -b، -w، --ignore-space-at-eol و --ignore-cr-at-eol مراجعه کنید.
•اگر نسخه آن‌ها (their) فقط تغییرات فاصله خالی را در یک خط ایجاد کرده باشد، از نسخه ما (our) استفاده می‌شود؛
•اگر نسخه ما تغییرات فاصله خالی ایجاد کرده باشد اما نسخه آن‌ها شامل یک تغییر اساسی باشد، از نسخه آن‌ها استفاده می‌شود؛
•در غیر این صورت، ادغام به روش معمول پیش می‌رود.

renormalize

این گزینه یک دریافت (check-out) و ثبت (check-in) مجازی از تمام سه مرحله هر فایلی که نیاز به ادغام سه‌طرفه دارد انجام می‌دهد. این گزینه برای استفاده هنگام ادغام شاخه‌هایی با فیلترهای پاکسازی متفاوت یا قوانین نرمال‌سازی انتهای خط متفاوت در نظر گرفته شده است. برای جزئیات به بخش "Merging branches with differing checkin/checkout attributes" در gitattributes(5) مراجعه کنید.

no-renormalize

گزینه renormalize را غیرفعال می‌کند. این گزینه متغیر پیکربندی merge.renormalize را بازنویسی (override) می‌کند.

find-renames[=<n>]

تشخیص تغییر نام را روشن می‌کند و به‌صورت اختیاری آستانه شباهت را تنظیم می‌نماید. این حالت پیش‌فرض است. این گزینه متغیر پیکربندی merge.renames را بازنویسی می‌کند. همچنین به git-diff(1) --find-renames مراجعه کنید.

rename-threshold=<n>

یک مترادف منسوخ‌شده برای find-renames=<n>.

no-renames

تشخیص تغییر نام را خاموش می‌کند. این گزینه متغیر پیکربندی merge.renames را بازنویسی می‌کند. همچنین به git-diff(1) --no-renames مراجعه کنید.

histogram

یک مترادف منسوخ‌شده برای diff-algorithm=histogram.

patience

یک مترادف منسوخ‌شده برای diff-algorithm=patience.

diff-algorithm=(histogram|minimal|myers|patience)

از یک الگوریتم تفاضل (diff) متفاوت هنگام ادغام استفاده می‌کند، که می‌تواند به جلوگیری از ادغام‌های نادرست که ناشی از خطوط منطبق کم‌اهمیت هستند (مانند براکت‌های توابع مجزا) کمک کند. همچنین به git-diff(1) --diff-algorithm مراجعه کنید. توجه داشته باشید که ort به‌طور پیش‌فرض از diff-algorithm=histogram استفاده می‌کند، در حالی که تفاضل‌های معمولی در حال حاضر به‌طور پیش‌فرض از تنظیمات پیکربندی diff.algorithm استفاده می‌نمایند.

subtree[=<path>]

این گزینه شکل پیشرفته‌تری از راهبرد subtree است که در آن راهبرد حدس می‌زند دو درخت چگونه باید نسبت به یکدیگر جابجا شوند تا هنگام ادغام با هم تطبیق یابند. در عوض، مسیر مشخص‌شده به ابتدای مسیرها اضافه می‌شود (یا از ابتدا حذف می‌شود) تا شکل دو درخت مطابقت پیدا کند.

recursive

این گزینه اکنون مترادفی برای ort است. تا نسخه 2.49.0 یک پیاده‌سازی جایگزین بود، اما در نسخه 2.50.0 تغییر مسیر یافت تا به معنای ort باشد. راهبرد بازگشتی قبلی، راهبرد پیش‌فرض برای حل دو سرشاخه از نسخه v0.99.9k گیت تا نسخه v2.33.0 بود.

resolve

این راهبرد فقط می‌تواند دو سرشاخه (یعنی شاخه جاری و شاخه دیگری که از آن دریافت کرده‌اید) را با استفاده از یک الگوریتم ادغام ۳-طرفه حل کند. این روش تلاش می‌کند تا ابهامات ادغام ضربدری (criss-cross) را با دقت شناسایی کند. این راهبرد تغییر نام‌ها را مدیریت نمی‌کند.

octopus

این راهبرد موارد با بیش از دو سرشاخه را حل می‌کند، اما از انجام یک ادغام پیچیده که نیاز به حل دستی داشته باشد خودداری می‌ورزد. این راهبرد عمدتاً برای دسته‌بندی سرشاخه‌های موضوعی (topic branches) در کنار هم استفاده می‌شود. این حالت، راهبرد ادغام پیش‌فرض هنگام دریافت (pull) یا ادغام بیش از یک شاخه است.

ours

این راهبرد هر تعداد سرشاخه را حل می‌کند، اما درخت حاصل از ادغام همیشه همان سرشاخه جاری است و در عمل تمام تغییرات از سایر شاخه‌ها را نادیده می‌گیرد. این روش برای جایگزین کردن تاریخچه توسعه قدیمی شاخه‌های فرعی در نظر گرفته شده است. توجه داشته باشید که این راهبرد با گزینه -Xours در راهبرد ادغام ort متفاوت است.

subtree

این یک راهبرد اصلاح‌شده از ort است. هنگام ادغام درخت‌های A و B، اگر B متناظر با یک زیردرخت از A باشد، B ابتدا طوری تنظیم می‌شود که با ساختار درختی A مطابقت داشته باشد، به‌جای اینکه درخت‌ها در همان سطح خوانده شوند. این تنظیم برای درخت والد مشترک نیز انجام می‌شود.

در راهبردهایی که از ادغام ۳-طرفه استفاده می‌کنند (از جمله راهبرد پیش‌فرض، ort)، اگر تغییری در هر دو شاخه ایجاد شود اما بعداً در یکی از شاخه‌ها بازگردانی (revert) شود، آن تغییر در نتیجه ادغام وجود خواهد داشت؛ برخی این رفتار را گیج‌کننده می‌دانند. این حالت رخ می‌دهد زیرا هنگام انجام ادغام، فقط سرشاخه‌ها و پایه ادغام (merge base) در نظر گرفته می‌شوند، نه تک‌تک کامیت‌ها. بنابراین الگوریتم ادغام، تغییر بازگردانده‌شده را اصلاً به‌عنوان هیچ تغییری در نظر نمی‌گیرد و در عوض نسخه تغییریافته را جایگزین می‌کند.

شما باید پیامدهای استفاده از git rebase را بر روی مخزنی که به اشتراک می‌گذارید درک کنید. همچنین به بخش RECOVERING FROM UPSTREAM REBASE در ادامه مراجعه فرمایید.

هنگامی که rebase اجرا می‌شود، در صورت وجود ابتدا یک قلاب pre-rebase را اجرا می‌کند. می‌توانید از این قلاب برای بررسی‌های صحت‌سنجی استفاده کنید و در صورت نامناسب بودن، rebase را رد نمایید. لطفاً برای مشاهده یک مثال به اسکریپت الگوی قلاب pre-rebase مراجعه کنید.

پس از تکمیل، <branch> شاخه جاری خواهد بود.

بازپایه‌ریزی تعاملی به این معنی است که شما فرصت ویرایش کامیت‌هایی را که بازپایه‌ریزی می‌شوند خواهید داشت. می‌توانید ترتیب کامیت‌ها را تغییر دهید و آن‌ها را حذف کنید (زدودن وصله‌های نامناسب یا ناخواسته).

حالت تعاملی برای این نوع جریان کاری در نظر گرفته شده است:

1.داشتن یک ایده فوق‌العاده
2.کدنویسی و توسعه کد
3.آماده‌سازی یک سری وصله برای ارسال
4.ارسال و ارائه

که در آن مورد ۲ شامل چندین نمونه از این موارد است:

الف) استفاده معمول

1.تکمیل کاری که ارزش یک کامیت را دارد
2.کامیت کردن

ب) اصلاح مستقل (fixup)

1.متوجه شدن اینکه چیزی کار نمی‌کند
2.رفع آن مشکل
3.کامیت کردن آن

گاهی موردی که در ب.۲. رفع شده است را نمی‌توان به کامیت نه‌چندان کاملی که آن را اصلاح می‌کند الحاق (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

در حالت تعاملی، می‌توانید کامیت‌ها را با عملیات "edit" علامت‌گذاری کنید. با این حال، این لزوماً به این معنی نیست که git rebase انتظار دارد نتیجه این ویرایش دقیقاً یک کامیت باشد. در واقع، می‌توانید کامیت را لغو (undo) کنید یا کامیت‌های دیگری اضافه نمایید. از این قابلیت می‌توان برای تقسیم یک کامیت به دو کامیت استفاده کرد:

•یک بازپایه‌ریزی تعاملی را با git rebase -i <commit>^ آغاز کنید، که در آن <commit> کامیتی است که می‌خواهید تقسیم کنید. در حقیقت، هر بازه‌ای از کامیت‌ها تا زمانی که شامل آن کامیت باشد کفایت می‌کند.
•کامیتی را که می‌خواهید تقسیم کنید با عملیات "edit" علامت‌گذاری کنید.
•هنگامی که نوبت به ویرایش آن کامیت رسید، دستور git reset HEAD^ را اجرا کنید. اثر این کار این است که HEAD یک گام به عقب برگردانده می‌شود و ایندکس (index) نیز همین روند را دنبال می‌کند. با این حال، درخت کاری دست‌نخورده باقی می‌ماند.
•اکنون تغییراتی را که می‌خواهید در کامیت اول قرار گیرند به ایندکس اضافه کنید. برای این کار می‌توانید از git add (احتمالاً به‌صورت تعاملی) یا git gui (یا هر دو) استفاده نمایید.
•ایندکس اکنون جاری را با هر پیام کامیتی که در حال حاضر مناسب است کامیت کنید.
•دو مرحله پیشین را تکرار کنید تا درخت کاری شما تمیز (clean) شود.
•بازپایه‌ریزی را با دستور git rebase --continue ادامه دهید.

اگر کاملاً مطمئن نیستید که بازبینی‌های میانی سازگار و پایدار هستند (کامپایل می‌شوند، مجموعه آزمایش‌ها را با موفقیت می‌گذرانند، و غیره)، باید پس از هر کامیت از git stash برای ذخیره موقت تغییرات کامیت‌نشده استفاده کنید، آزمایش را انجام دهید، و در صورت نیاز به اصلاحات، کامیت را اصلاح (amend) نمایید.

ریبیس کردن (یا هر شکل دیگری از بازنویسی) شاخه‌ای که دیگران کار خود را بر پایه آن بنا نهاده‌اند، ایده بدی است: هر کسی در پایین‌دست (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 نیز مجبور می‌شود ریبیس کند و همین‌طور الی آخر!

دو نوع راه‌حل اصلاحی وجود دارد که در زیربخش‌های زیر بررسی می‌شوند:

حالت ساده: تغییرات دقیقاً همان هستند.

این حالت زمانی رخ می‌دهد که ریبیس subsystem یک ریبیس ساده بوده و هیچ تداخلی نداشته باشد.

حالت پیچیده: تغییرات یکسان نیستند.

این حالت زمانی رخ می‌دهد که ریبیس subsystem دارای تداخل بوده باشد، یا از --interactive برای حذف، ویرایش، فشرده‌سازی (squash) یا اصلاح (fixup) کامیت‌ها استفاده کرده باشد؛ یا اگر بالادست از یکی از دستورهای commit --amend، reset یا یک دستور کامل بازنویسی تاریخچه مانند filter-repo[2] استفاده کرده باشد.

تنها زمانی کار می‌کند که تغییرات (شناسه‌های وصله بر اساس محتویات 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

اگر تغییرات subsystem دقیقاً با تغییرات پیش از ریبیس مطابقت نداشته باشند، اوضاع پیچیده‌تر می‌شود.


نکته

اگرچه «بازیابی در حالت ساده» گاهی حتی در حالت پیچیده نیز موفقیت‌آمیز به نظر می‌رسد، اما ممکن است پیامدهای ناخواسته‌ای در پی داشته باشد. به عنوان مثال، کامیتی که از طریق git rebase --interactive حذف شده بود، دوباره زنده خواهد شد!

ایده اصلی این است که به صورت دستی به git rebase بگویید «subsystem قدیمی کجا تمام شد و topic شما از کجا آغاز گشت»، یعنی پایه ادغام (merge base) قدیمی میان آن‌ها چه بوده است. باید راهی برای نام بردن از آخرین کامیت subsystem قدیمی پیدا کنید، برای مثال:

•با استفاده از reflog شاخه subsystem: پس از اجرای git fetch، نوک قدیمی subsystem در subsystem@{1} قرار دارد. فچ‌های بعدی این شماره را افزایش می‌دهند. (به git-reflog(1) مراجعه کنید.)
•نسبت به نوک شاخه topic: با دانستن اینکه شاخه topic شما سه کامیت دارد، نوک قدیمی subsystem باید topic~3 باشد.

سپس می‌توانید محدوده قدیمی subsystem..topic را با دستور زیر (برای حالت reflog و با فرض اینکه از قبل روی شاخه topic هستید) به نوک جدید پیوند بزنید:

$ git rebase --onto subsystem subsystem@{1}

اثر موجی بازیابی در «حالت پیچیده» به طور ویژه‌ای بد است: همه افراد در پایین‌دست topic اکنون باید بازیابی «حالت پیچیده» را نیز انجام دهند!

دستور ریبیس تعاملی در ابتدا برای مدیریت مجموعه‌های وصله منفرد طراحی شده بود. به همین دلیل، منطقی است که کامیت‌های ادغام از فهرست کارها (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

تمام موارد زیر در این بخش به‌صورت گزینشی از مستندات git-config(1) آورده شده‌اند. محتوا همان چیزی است که در آنجا یافت می‌شود:

rebase.backend

موتور پیش‌فرض مورد استفاده برای بازاعمال (rebase). گزینه‌های ممکن عبارتند از apply یا merge. در آینده، اگر موتور merge تمام قابلیت‌های باقی‌مانده موتور apply را به دست آورد، ممکن است این تنظیم بی‌استفاده شود.

rebase.stat

آیا آمار تغییرات (diffstat) آنچه از آخرین بازاعمال در بالادست تغییر کرده است نشان داده شود یا خیر. به‌طور پیش‌فرض نادرست (false) است.

rebase.autoSquash

اگر روی درست (true) تنظیم شود، گزینه --autosquash در git-rebase(1) به‌طور پیش‌فرض برای حالت تعاملی فعال می‌شود. این را می‌توان با گزینه --no-autosquash لغو کرد.

rebase.autoStash

هنگامی که روی درست (true) تنظیم شود، به‌طور خودکار یک مدخل stash موقت قبل از شروع عملیات ایجاد کرده و پس از پایان عملیات آن را اعمال می‌کند. این بدان معنی است که می‌توانید بازاعمال را روی یک درخت کاری دارای تغییرات ثبت‌نشده (dirty) اجرا کنید. با این حال با احتیاط استفاده کنید: اعمال نهایی stash پس از یک بازاعمال موفق ممکن است به تعارض‌های پیچیده منجر شود. این گزینه را می‌توان با گزینه‌های --no-autostash و --autostash در git-rebase(1) نادیده گرفت. به‌طور پیش‌فرض نادرست (false) است.

rebase.updateRefs

اگر روی درست (true) تنظیم شود، گزینه --update-refs را به‌طور پیش‌فرض فعال می‌کند.

rebase.missingCommitsCheck

اگر روی "warn" تنظیم شود، دستور git rebase -i در صورتی که برخی از کامیت‌ها حذف شوند (مثلاً یک خط حذف شود) یک هشدار چاپ می‌کند، اما بازاعمال همچنان ادامه می‌یابد. اگر روی "error" تنظیم شود، هشدار قبلی را چاپ کرده و بازاعمال را متوقف می‌کند؛ سپس می‌توان از git rebase --edit-todo برای اصلاح خطا استفاده کرد. اگر روی "ignore" تنظیم شود، هیچ بررسی انجام نمی‌شود. برای حذف یک کامیت بدون هشدار یا خطا، از دستور drop در فهرست todo استفاده کنید. پیش‌فرض "ignore" است.

rebase.instructionFormat

یک رشته قالب، همان‌طور که در git-log(1) مشخص شده است، برای استفاده در فهرست todo در طول یک بازاعمال تعاملی. هش کامیت به‌طور خودکار در ابتدای این قالب قرار می‌گیرد.

rebase.abbreviateCommands

اگر روی درست (true) تنظیم شود، git rebase از نام‌های اختصاری دستورات در فهرست todo استفاده خواهد کرد که به چیزی شبیه به این منجر می‌شود:
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

زمان‌بندی مجدد خودکار دستورات exec که با شکست مواجه شده‌اند. این فقط در حالت تعاملی (یا زمانی که گزینه --exec ارائه شده باشد) معنی دارد. این معادل تعیین گزینه --reschedule-failed-exec است.

rebase.forkPoint

اگر روی نادرست (false) تنظیم شود، گزینه --no-fork-point را به‌طور پیش‌فرض تنظیم می‌کند.

rebase.rebaseMerges

آیا و چگونه گزینه --rebase-merges به‌طور پیش‌فرض تنظیم شود. می‌تواند rebase-cousins، no-rebase-cousins یا یک مقدار بولی باشد. تنظیم روی true یا روی no-rebase-cousins معادل --rebase-merges=no-rebase-cousins است؛ تنظیم روی rebase-cousins معادل --rebase-merges=rebase-cousins است، و تنظیم روی false معادل --no-rebase-merges است. ارسال --rebase-merges در خط فرمان، با یا بدون آرگومان، هرگونه پیکربندی rebase.rebaseMerges را بازنویسی و لغو می‌کند.

rebase.maxLabelLength

هنگام تولید نام‌های برچسب از موضوعات کامیت، نام‌ها را تا این طول کوتاه می‌کند. به‌طور پیش‌فرض، نام‌ها به کمی کمتر از NAME_MAX کوتاه می‌شوند (به‌عنوان مثال برای اینکه پرونده‌های .lock بتوانند برای ارجاعات آزاد مربوطه نوشته شوند).

sequence.editor

ویرایشگر متن مورد استفاده توسط git rebase -i برای ویرایش پرونده دستورالعمل‌های بازاعمال. مقدار این متغیر هنگام استفاده توسط پوسته تفسیر می‌شود. این مقدار می‌تواند توسط متغیر محیطی GIT_SEQUENCE_EDITOR بازنویسی شود. در صورت عدم پیکربندی، از ویرایشگر پیش‌فرض پیام کامیت استفاده می‌شود.

git-am(1)، git-merge(1)، git-cherry-pick(1)

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

1.
راهنمای revert-a-faulty-merge How-To
file:///usr/share/doc/git-doc/howto/revert-a-faulty-merge.html
2.
filter-repo
2026-06-29 Git 2.55.0