設定和配置
獲取和建立專案
基本快照
分支與合併
共享和更新專案
檢查和比較
打補丁
除錯
電子郵件
外部系統
伺服器管理
指南
管理
底層命令
- 2.50.1 無更改
-
2.50.0
2025-06-16
- 2.49.1 無更改
-
2.49.0
2025-03-14
- 2.46.2 → 2.48.2 無更改
-
2.46.1
2024-09-13
- 2.45.1 → 2.46.0 無變化
-
2.45.0
2024-04-29
- 2.44.1 → 2.44.4 無更改
-
2.44.0
2024-02-23
- 2.43.3 → 2.43.7 無變更
-
2.43.2
2024-02-13
-
2.43.1
2024-02-09
-
2.43.0
2023-11-20
- 2.42.2 → 2.42.4 無更改
-
2.42.1
2023-11-02
- 2.41.1 → 2.42.0 無更改
-
2.41.0
2023-06-01
- 2.40.1 → 2.40.4 無更改
-
2.40.0
2023-03-12
- 2.39.4 → 2.39.5 無更改
-
2.39.3
2023-04-17
- 2.39.1 → 2.39.2 無更改
-
2.39.0
2022-12-12
- 2.38.1 → 2.38.5 無更改
-
2.38.0
2022-10-02
- 2.37.3 → 2.37.7 無更改
-
2.37.2
2022-08-11
- 2.36.3 → 2.37.1 無更改
-
2.36.2
2022-06-23
- 2.35.1 → 2.36.1 無更改
-
2.35.0
2022-01-24
- 2.34.1 → 2.34.8 無更改
-
2.34.0
2021-11-15
- 2.33.2 → 2.33.8 無更改
-
2.33.1
2021-10-12
- 2.32.1 → 2.33.0 無更改
-
2.32.0
2021-06-06
- 2.31.1 → 2.31.8 無更改
-
2.31.0
2021-03-15
- 2.30.1 → 2.30.9 無更改
-
2.30.0
2020-12-27
- 2.29.1 → 2.29.3 無更改
-
2.29.0
2020-10-19
- 2.28.1 無更改
-
2.28.0
2020-07-27
- 2.27.1 無更改
-
2.27.0
2020-06-01
- 2.26.1 → 2.26.3 無更改
-
2.26.0
2020-03-22
- 2.25.1 → 2.25.5 無更改
-
2.25.0
2020-01-13
- 2.24.1 → 2.24.4 無更改
-
2.24.0
2019-11-04
- 2.23.1 → 2.23.4 無更改
-
2.23.0
2019-08-16
- 2.22.1 → 2.22.5 無更改
-
2.22.0
2019-06-07
- 2.21.1 → 2.21.4 無更改
-
2.21.0
2019-02-24
- 2.20.1 → 2.20.5 無更改
-
2.20.0
2018-12-09
- 2.19.3 → 2.19.6 無更改
-
2.19.2
2018-11-21
- 2.19.1 無更改
-
2.19.0
2018-09-10
- 2.18.1 → 2.18.5 無更改
-
2.18.0
2018-06-21
- 2.17.1 → 2.17.6 無更改
-
2.17.0
2018-04-02
-
2.16.6
2019-12-06
-
2.15.4
2019-12-06
-
2.14.6
2019-12-06
-
2.13.7
2018-05-22
-
2.12.5
2017-09-22
- 2.10.5 → 2.11.4 無更改
-
2.9.5
2017-07-30
-
2.8.6
2017-07-30
- 2.7.6 無更改
-
2.6.7
2017-05-05
- 2.5.6 無更改
-
2.4.12
2017-05-05
-
2.3.10
2015-09-28
-
2.2.3
2015-09-04
-
2.1.4
2014-12-17
-
2.0.5
2014-12-17
概要
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)
描述
如果指定了 <branch>,則 git
rebase
會在執行任何其他操作之前自動執行 git
switch
<branch>。否則,它會停留在當前分支上。
如果未指定 <upstream>,則會使用 branch.
<name>.remote
和 branch.
<name>.merge
選項中配置的上游分支(詳見 git-config[1]),並假定使用 --fork-point
選項。如果您當前不在任何分支上,或者當前分支沒有配置上游分支,則變基操作將中止。
當前分支中由提交引入但不在 <upstream> 中的所有更改都會儲存到一個臨時區域。這與 git
log
<upstream>..HEAD
顯示的提交集相同;如果 --fork-point
處於活動狀態(詳見下方 --fork-point
的說明),則與 git
log
fork_point'..HEAD
顯示的提交集相同;如果指定了 --root
選項,則與 git
log
HEAD
顯示的提交集相同。
如果提供了 --onto
選項,則當前分支將重置為 <upstream> 或 <newbase>。這與 git
reset
--hard
<upstream>(或 <newbase>)具有完全相同的效果。ORIG_HEAD
將指向重置前分支的頂端。
注意
|
如果在變基過程中使用了其他寫入該偽引用(例如 git reset )的命令,則在變基結束時,ORIG_HEAD 不保證仍指向先前的分支頂端。但是,可以使用當前分支的 reflog(即 @{1} ,詳見 gitrevisions[7])訪問先前的分支頂端。 |
之前儲存到臨時區域的提交將逐個按順序重新應用到當前分支。請注意,HEAD
中引入與 HEAD..
<upstream> 中提交相同文字更改的任何提交都將被省略(即,一個上游已經接受但提交資訊或時間戳不同的補丁將被跳過)。
合併失敗可能會阻止此過程完全自動化。您將不得不解決任何此類合併失敗並執行 git
rebase
--continue
。另一個選項是使用 git
rebase
--skip
繞過導致合併失敗的提交。要檢出原始的 <branch> 並移除 .git/rebase-apply
工作檔案,請改用命令 git
rebase
--abort
。
假設存在以下歷史,並且當前分支是 "topic"
A---B---C topic / D---E---F---G master
從這一點開始,以下任一命令的結果將是
git rebase master git rebase master topic
會是
A'--B'--C' topic / D---E---F---G master
注意: 後者只是 git
checkout
topic
後面跟著 git
rebase
master
的簡寫。當變基操作退出時,topic
將保持為已檢出分支。
如果上游分支已包含您所做的更改(例如,因為您傳送的補丁已應用於上游),則該提交將被跳過併發出警告(如果使用 merge 後端)。例如,在以下歷史記錄上執行 git
rebase
master
(其中 A'
和 A
引入了相同的更改集,但具有不同的提交者資訊)
A---B---C topic / D---E---A'---F master
將導致
B'---C' topic / D---E---A'---F master
這是您如何將一個基於某個分支的主題分支移植到另一個分支,以假裝您是從後者分支派生該主題分支的方法,使用 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 的情況下很有用。
還可以透過 rebase 刪除一系列提交。如果出現以下情況
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。
如果發生衝突,git
rebase
將在第一個有問題的提交處停止,並在樹中留下衝突標記。您可以使用 git
diff
定位標記(<<<<<<)並進行編輯以解決衝突。對於您編輯的每個檔案,您需要告訴 Git 衝突已解決,這通常透過以下方式完成
git add <filename>
手動解決衝突並使用所需的解決方案更新索引後,您可以使用以下命令繼續變基過程
git rebase --continue
或者,您可以使用以下命令撤消 git rebase 操作
git rebase --abort
模式選項
本節中的選項不能與其他任何選項一起使用,包括彼此之間也不能一起使用
- --continue
-
解決合併衝突後重新開始變基過程。
- --skip
-
跳過當前補丁,重新開始變基過程。
- --abort
-
中止變基操作並將 HEAD 重置為原始分支。如果在開始變基操作時提供了 <branch>,則
HEAD
將重置為 <branch>。否則,HEAD
將重置為變基操作開始時的位置。 - --quit
-
中止變基操作,但
HEAD
不會重置回原始分支。索引和工作樹也因此保持不變。如果使用--autostash
建立了臨時暫存條目,它將被儲存到暫存列表中。 - --edit-todo
-
在互動式變基期間編輯待辦列表。
- --show-current-patch
-
在互動式變基或因衝突而停止變基時,顯示當前補丁。這等同於
git
show
REBASE_HEAD
。
選項
- --onto <newbase>
-
建立新提交的起始點。如果未指定
--onto
選項,則起始點是 <upstream>。可以是任何有效的提交,而不僅僅是現有的分支名稱。作為一種特殊情況,如果恰好只有一個合併基礎,您可以使用 "A...B" 作為 A 和 B 合併基礎的快捷方式。您最多可以省略 A 和 B 中的一個,在這種情況下,它預設為 HEAD。
- --keep-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
使用合併基礎來確定將要變基的提交集。另請參閱下方的 不相容選項。
- <upstream>
-
用於比較的上游分支。可以是任何有效的提交,而不僅僅是現有分支名稱。預設為當前分支配置的上游。
- <branch>
-
工作分支;預設為
HEAD
。 - --apply
-
使用應用策略進行變基(內部呼叫
git-am
)。一旦合併後端處理了應用後端的所有功能,此選項將來可能成為空操作。另請參閱下方的 不相容選項。
- --empty=(drop|keep|stop)
-
如何處理最初不為空且不是任何上游提交的乾淨揀選,但在變基後變為空的提交(因為它們包含上游已存在更改的子集)
請注意,最初為空的提交會被保留(除非指定了
--no-keep-empty
),而乾淨的揀選提交(由git
log
--cherry-mark
... 確定)會作為初步步驟被檢測並丟棄(除非傳遞了--reapply-cherry-picks
或--keep-base
)。另請參閱下方的 不相容選項。
- --no-keep-empty
- --keep-empty
-
在變基之前不保留結果中最初為空的提交(即,與其父提交相比沒有任何更改的提交)。預設是保留最初為空的提交,因為建立此類提交需要向
git
commit
傳遞--allow-empty
覆蓋標誌,表示使用者非常有意地建立此類提交併因此希望保留它。此標誌的使用可能很少見,因為您可以透過啟動互動式變基並刪除對應於您不想要的提交的行來擺脫最初為空的提交。此標誌作為一個方便的快捷方式而存在,例如在外部工具生成許多空提交而您希望全部刪除它們的情況下。
對於最初不為空但在變基後變為空的提交,請參閱
--empty
標誌。另請參閱下方的 不相容選項。
- --reapply-cherry-picks
- --no-reapply-cherry-picks
-
重新應用任何上游提交的所有乾淨揀選,而不是預先丟棄它們。(如果這些提交在變基後變為空,因為它們包含上游已存在更改的子集,則對它們的行為由
--empty
標誌控制。)在沒有
--keep-base
的情況下(或如果給定了--no-reapply-cherry-picks
),這些提交將自動被丟棄。由於這需要讀取所有上游提交,因此在具有大量需要讀取的上游提交的倉庫中,這可能會很耗時。當使用 merge 後端時,將為每個丟棄的提交發出警告(除非給出--quiet
)。除非advice.skippedCherryPicks
設定為 false(參閱 git-config[1]),否則也會發出建議。--reapply-cherry-picks
允許變基放棄讀取所有上游提交,從而可能提高效能。另請參閱下方的 不相容選項。
- --allow-empty-message
-
空操作。以前,變基空訊息的提交會失敗,此選項會覆蓋該行為,允許變基空訊息的提交。現在,空訊息的提交不會導致變基停止。
另請參閱下方的 不相容選項。
- -m
- --merge
-
使用合併策略進行變基(預設)。
請注意,變基合併透過將工作分支的每個提交重新應用到 <upstream> 分支之上來工作。因此,當發生合併衝突時,報告為 ours 的一方是迄今為止已變基的系列,從 <upstream> 開始,而 theirs 則是工作分支。換句話說,雙方是互換的。
另請參閱下方的 不相容選項。
- -s <strategy>
- --strategy=<strategy>
-
使用給定的合併策略,而不是預設的
ort
。這意味著隱含--merge
。因為
git
rebase
使用給定策略將工作分支的每個提交重新應用到 <upstream> 分支之上,所以使用ours
策略只會清空 <branch> 中的所有補丁,這意義不大。另請參閱下方的 不相容選項。
- -X <strategy-option>
- --strategy-option=<strategy-option>
-
將 <strategy-option> 傳遞給合併策略。這意味著隱含
--merge
,如果未指定策略,則隱含-s
ort
。請注意,如上文-m
選項所述,ours 和 theirs 是顛倒的。另請參閱下方的 不相容選項。
--rerere-autoupdate
--no-rerere-autoupdate
-
rerere 機制重用當前衝突上已記錄的解決方案以更新工作樹中的檔案後,允許它同時使用解決方案結果更新索引。
--no-rerere-autoupdate
是在透過單獨的git
add
將結果提交到索引之前,仔細檢查rerere
的作用並捕獲潛在的錯誤合併的好方法。 - -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> 行的周圍上下文匹配。如果周圍上下文的行數少於 <n>,則它們都必須匹配。預設情況下,不會忽略任何上下文。隱含
--apply
。另請參閱下方的 不相容選項。
- --no-ff
- --force-rebase
- -f
-
獨立地重放所有變基的提交,而不是快速前進跳過未更改的提交。這確保了變基分支的整個歷史都由新的提交組成。
您可能會發現,在撤銷主題分支合併後,這很有用,因為此選項會使用新的提交重新建立主題分支,這樣就可以成功重新合併,而無需“撤銷撤銷”(詳見 revert-a-faulty-merge 操作指南)。
- --fork-point
- --no-fork-point
-
在計算 <branch> 引入了哪些提交時,使用 reflog 在 <upstream> 和 <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
。另請參閱 git-config[1] 中的rebase.forkpoint
。如果您的分支基於 <upstream>,但 <upstream> 已被回溯且您的分支包含已丟棄的提交,則此選項可與
--keep-base
一起使用,以從您的分支中丟棄這些提交。另請參閱下方的 不相容選項。
- --ignore-whitespace
-
在嘗試協調差異時忽略空白差異。目前,每個後端都實現了這種行為的近似
- --whitespace=<option>
-
此標誌傳遞給應用補丁的
git
apply
程式(詳見 git-apply[1])。隱含--apply
。另請參閱下方的 不相容選項。
- --committer-date-is-author-date
-
不使用當前時間作為提交者日期,而是使用正在變基的提交的作者日期作為提交者日期。此選項隱含
--force-rebase
。 - --ignore-date
- --reset-author-date
-
不使用原始提交的作者日期,而是使用當前時間作為變基提交的作者日期。此選項隱含
--force-rebase
。另請參閱下方的 不相容選項。
- --signoff
-
為所有變基的提交新增一個
Signed-off-by
尾部資訊。請注意,如果給定了--interactive
,則只有標記為要揀選、編輯或重新措辭的提交才會新增尾部資訊。另請參閱下方的 不相容選項。
- -i
- --interactive
-
列出即將變基的提交。在變基之前,允許使用者編輯該列表。此模式也可用於拆分提交(詳見下方的 拆分提交)。
提交列表格式可以透過設定配置選項 rebase.instructionFormat 來更改。自定義的指令格式將自動在格式前加上提交雜湊。
另請參閱下方的 不相容選項。
- -r
- --rebase-merges[=(rebase-cousins|no-rebase-cousins)]
- --no-rebase-merges
-
預設情況下,變基會簡單地從待辦列表中刪除合併提交,並將變基後的提交放入單個線性分支中。使用
--rebase-merges
,變基將嘗試透過重新建立合併提交來保留要變基的提交中的分支結構。這些合併提交中任何已解決的合併衝突或手動修改都必須手動解決/重新應用。--no-rebase-merges
可用於撤銷rebase.rebaseMerges
配置選項和先前的--rebase-merges
。在變基合併時,有兩種模式:
rebase-cousins
和no-rebase-cousins
。如果未指定模式,則預設為no-rebase-cousins
。在no-rebase-cousins
模式下,沒有將 <upstream> 作為直接祖先的提交將保留其原始分支點,即,被 git-log[1] 的--ancestry-path
選項排除的提交將預設保留其原始祖先。在rebase-cousins
模式下,此類提交將被變基到 <upstream> 之上(如果指定了 <onto>)。目前只能使用
ort
合併策略重新建立合併提交;不同的合併策略只能透過顯式的exec
git
merge
-s
<strategy> [...] 命令使用。另請參閱下方的 合併變基 和 不相容選項。
- -x <cmd>
- --exec <cmd>
-
在最終歷史中建立提交的每一行之後附加 "exec <cmd>"。<cmd> 將被解釋為一個或多個 shell 命令。任何失敗的命令將中斷變基,並退出程式碼 1。
您可以透過使用一個
--exec
例項和多個命令來執行多個命令git rebase -i --exec "cmd1 && cmd2 && ..."
或者透過提供多個
--exec
git rebase -i --exec "cmd1" --exec "cmd2" --exec ...
如果使用
--autosquash
,則exec
行不會附加到中間提交,而只會出現在每個 squash/fixup 系列的末尾。這在內部使用
--interactive
機制,但可以在沒有顯式--interactive
的情況下執行。另請參閱下方的 不相容選項。
- --root
-
變基所有可從 <branch> 訪問的提交,而不是使用 <upstream> 限制它們。這允許您變基分支上的根提交。
另請參閱下方的 不相容選項。
- --autosquash
- --no-autosquash
-
自動將帶有特殊格式訊息的提交合併到正在變基的先前提交中。如果提交訊息以 "squash! "、"fixup! " 或 "amend! " 開頭,則標題的其餘部分被視為提交規範符,如果它與該提交的標題或雜湊匹配,則匹配先前的提交。如果沒有提交完全匹配,則考慮規範符與提交標題開頭的匹配。
在變基待辦列表中,squash、fixup 和 amend 提交的操作分別從
pick
更改為squash
、fixup
或fixup
-C
,並且它們被移動到它們修改的提交之後。--interactive
選項可用於在繼續之前檢視和編輯待辦列表。建立帶有 squash 標記的提交的推薦方法是使用 git-commit[1] 的
--squash
、--fixup
、--fixup=amend:
或--fixup=reword:
選項,這些選項將目標提交作為引數並自動從目標提交中填充新提交的標題。將配置變數
rebase.autoSquash
設定為 true 會在互動式變基中預設啟用自動合併。可以使用--no-autosquash
選項覆蓋該設定。另請參閱下方的 不相容選項。
- --autostash
- --no-autostash
-
在操作開始前自動建立一個臨時暫存條目,並在操作結束後應用它。這意味著您可以在髒工作樹上執行變基。但是,請謹慎使用:成功變基後的最終暫存應用可能會導致非平凡的衝突。
- --reschedule-failed-exec
- --no-reschedule-failed-exec
-
自動重新排程失敗的
exec
命令。這僅在互動模式下(或提供了--exec
選項時)有意義。此選項在變基開始後生效。它將根據提供給初始
git
rebase
的命令列選項、rebase.rescheduleFailedExec
配置(參閱 git-config[1] 或下方的“配置”),或預設為 false,並在整個變基過程中保留。在整個變基過程中記錄此選項是一個方便的功能。否則,如果呼叫
git
rebase
--continue
時存在rebase.rescheduleFailedExec=true
配置,則開始時的顯式--no-reschedule-failed-exec
將被覆蓋。目前,您無法將--
[no-
]reschedule-failed-exec
傳遞給git
rebase
--continue
。 - --update-refs
- --no-update-refs
-
自動強制更新指向正在變基的提交的任何分支。在工作樹中檢出的任何分支都不會以這種方式更新。
如果配置變數
rebase.updateRefs
已設定,則此選項可用於覆蓋並停用此設定。另請參閱下方的 不相容選項。
不相容選項
以下選項
-
--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 時
此外,以下選項對不相容
-
--keep-base 和 --onto
-
--keep-base 和 --root
-
--fork-point 和 --root
行為差異
git
rebase
有兩個主要後端:apply 和 merge。(apply 後端以前被稱為 am 後端,但該名稱導致混淆,因為它看起來像動詞而不是名詞。此外,merge 後端以前被稱為互動式後端,但現在也用於非互動式情況。兩者都根據支撐各自的底層功能進行了重新命名。)這兩個後端在行為上有一些細微的差異
空提交
apply 後端不幸地丟棄了有意為空的提交,即最初為空的提交,儘管這在實踐中很少見。它還會丟棄變為空的提交,並且沒有選項來控制此行為。
merge 後端預設保留有意為空的提交(儘管使用 -i
時,它們在待辦列表編輯器中被標記為空,或者可以使用 --no-keep-empty
自動丟棄它們)。
與 apply 後端類似,預設情況下,merge 後端會丟棄變為空的提交,除非指定了 -i
/--interactive
(在這種情況下,它會停止並詢問使用者如何操作)。merge 後端還具有 --empty=
(drop
|keep
|stop
) 選項,用於更改處理變為空提交的行為。
目錄重新命名檢測
由於缺乏準確的樹資訊(源於使用補丁中有限的資訊構造偽祖先),apply 後端停用了目錄重新命名檢測。停用的目錄重新命名檢測意味著,如果歷史的一側重新命名了一個目錄,而另一側向舊目錄添加了新檔案,那麼新檔案將留在舊目錄中,在變基時不會有任何警告提示您可能需要將這些檔案移動到新目錄中。
目錄重新命名檢測與 merge 後端協同工作,在這種情況下向您提供警告。
上下文
apply 後端透過建立一系列補丁(內部呼叫 format-patch
),然後按順序應用這些補丁(內部呼叫 am
)來工作。補丁由多個塊組成,每個塊都包含行號、上下文區域和實際更改。行號必須帶有一些偏移量,因為另一側可能已經在檔案的前面插入或刪除了行。上下文區域旨在幫助找到如何調整行號以便將更改應用到正確的行。但是,如果程式碼的多個區域具有相同的周圍上下文行,則可能會選中錯誤的區域。在實際案例中,這導致提交被錯誤地重新應用,但沒有報告任何衝突。將 diff.context
設定為更大的值可能會防止此類問題,但會增加偽衝突的可能性(因為它將需要更多匹配的上下文行才能應用)。
merge 後端處理每個相關檔案的完整副本,從而使其免受此類問題的影響。
衝突標記的標註
當存在內容衝突時,合併機制會嘗試使用內容來源的提交來標註每一方的衝突標記。由於 apply 後端丟棄了關於變基提交及其父提交的原始資訊(並根據生成的補丁中的有限資訊生成新的偽提交),因此無法識別這些提交;相反,它必須退回到提交摘要。此外,當 merge.conflictStyle
設定為 diff3
或 zdiff3
時,apply 後端將使用“構造的合併基礎”來標記來自合併基礎的內容,從而不提供有關合並基礎提交的任何資訊。
merge 後端處理歷史兩側的完整提交,因此沒有此類限制。
鉤子
apply 後端傳統上不呼叫 post-commit 鉤子,而 merge 後端呼叫。兩者都呼叫了 post-checkout 鉤子,儘管 merge 後端抑制了其輸出。此外,兩個後端都只使用變基的起始提交來呼叫 post-checkout 鉤子,而不使用中間提交或最終提交。在每種情況下,呼叫這些鉤子都是由於實現上的偶然性而非設計(兩個後端最初都實現為 shell 指令碼,並碰巧呼叫了其他會呼叫鉤子的命令,如 git
checkout
或 git
commit
會呼叫鉤子)。兩個後端應該具有相同的行為,儘管目前尚不完全清楚哪個(如果有的話)是正確的。我們未來可能會讓 rebase 停止呼叫其中任何一個鉤子。
可中斷性
apply 後端在中斷時機不當的情況下存在安全問題;如果使用者在錯誤的時間按下 Ctrl-C 試圖中止變基,變基可能會進入一種狀態,在這種狀態下無法通過後續的 git
rebase
--abort
來中止。merge 後端似乎沒有同樣的缺陷。(詳見 https://lore.kernel.org/git/20200207132152.GC2868@szeder.dev/)。
合併策略
合併機制(git
merge
和 git
pull
命令)允許使用 -s
選項選擇後端合併策略。某些策略也可以接受自己的選項,這些選項可以透過向 git
merge
和/或 git
pull
提供 -X
<option> 引數來傳遞。
ort
-
這是拉取或合併一個分支時的預設合併策略。此策略只能使用三方合併演算法解決兩個頭。當存在多個可用於三方合併的共同祖先時,它會建立共同祖先的合併樹並將其用作三方合併的參考樹。根據對從 Linux 2.6 核心開發歷史中獲取的實際合併提交進行的測試,據報道這會導致更少的合併衝突,而不會引起錯誤合併。此外,此策略可以檢測和處理涉及重新命名的合併。它不使用檢測到的複製。此演算法的名稱是一個首字母縮略詞("Ostensibly Recursive’s Twin"),來源於它被編寫為先前預設演算法
recursive
的替代品。在路徑為子模組的情況下,如果合併一側使用的子模組提交是合併另一側使用的子模組提交的後代,Git 會嘗試快進到該後代。否則,Git 會將這種情況視為衝突,並建議使用衝突提交的後代子模組提交作為解決方案(如果存在)。
ort
策略可以接受以下選項:ours
-
此選項強制衝突塊透過偏向 our 版本來乾淨地自動解決。來自另一個樹的、與我們側不衝突的更改會反映在合併結果中。對於二進位制檔案,所有內容都取自我們側。
這不應與
ours
合併策略混淆,後者根本不檢視其他樹包含什麼。它丟棄其他樹所做的所有更改,宣告 our 歷史包含其中發生的所有內容。 theirs
-
這與
ours
相反;請注意,與ours
不同,沒有theirs
合併策略來混淆此合併選項。 ignore-space-change
ignore-all-space
ignore-space-at-eol
ignore-cr-at-eol
-
為了三方合併,將帶有指示型別空白更改的行視為未更改。與其他更改混合的行中的空白更改不會被忽略。另請參閱 git-diff[1]
-b
、-w
、--ignore-space-at-eol
和--ignore-cr-at-eol
。-
如果*他們的*版本只引入了行的空白符更改,則使用*我們的*版本;
-
如果*我們的*版本引入了空白符更改但*他們的*版本包含了實質性更改,則使用*他們的*版本;
-
否則,合併按常規方式進行。
-
renormalize
-
這會對任何需要三方合併的檔案進行所有三個階段的虛擬檢出和檢入。此選項旨在用於合併具有不同清理過濾器或行尾規範化規則的分支時。詳見 gitattributes[5] 中“合併具有不同檢入/檢出屬性的分支”。
no-renormalize
-
停用
renormalize
選項。這會覆蓋merge.renormalize
配置變數。 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 目前預設使用diff.algorithm
配置設定。 subtree
[=
<path>]-
此選項是 subtree 策略的一種更高階形式,該策略在合併時猜測兩個樹必須如何移動才能相互匹配。相反,指定的路徑被字首(或從開頭剝離)以使兩個樹的形狀匹配。
recursive
-
這現在是
ort
的同義詞。它在 v2.49.0 之前是一種替代實現,但在 v2.50.0 中被重定向為ort
。先前的 recursive 策略是 Git v0.99.9k 到 v2.33.0 之間解決兩個頭的預設策略。 resolve
-
這隻能使用三向合併演算法解決兩個頭部(即當前分支和你拉取的另一個分支)。它嘗試仔細檢測交叉合併歧義。它不處理重新命名。
octopus
-
這解決了具有兩個以上頭部的情況,但拒絕進行需要手動解決的複雜合併。它主要用於捆綁主題分支頭部。這是拉取或合併多個分支時的預設合併策略。
ours
-
這解決了任意數量的頭部,但合併結果樹始終是當前分支頭部的樹,有效忽略所有其他分支的所有更改。它旨在用於取代側分支的舊開發歷史。請注意,這與
ort
合併策略的-Xours
選項不同。 subtree
-
這是一個修改過的
ort
策略。當合並樹 A 和樹 B 時,如果 B 對應於 A 的子樹,則首先調整 B 以匹配 A 的樹結構,而不是讀取相同級別的樹。此調整也適用於共同祖先樹。
對於使用三方合併的策略(包括預設的 ort
),如果在兩個分支上都進行了更改,但後來在一個分支上被恢復,則該更改將存在於合併結果中;有些人覺得這種行為令人困惑。發生這種情況是因為在執行合併時只考慮頭部和合並基礎,而不是單個提交。因此,合併演算法將恢復的更改視為完全沒有更改,並用更改的版本代替。
注意事項
您應該瞭解在共享儲存庫上使用 git
rebase
的含義。另請參閱下方的 從上游變基中恢復。
執行變基時,如果存在 pre-rebase
鉤子,它將首先執行該鉤子。您可以使用此鉤子進行健全性檢查,並在不合適時拒絕變基。有關示例,請參閱模板 pre-rebase
鉤子指令碼。
完成後,<branch> 將是當前分支。
互動模式
互動式變基意味著您有機會編輯被變基的提交。您可以重新排序提交,也可以刪除它們(清除錯誤或其他不需要的補丁)。
互動模式適用於以下型別的工作流
-
有一個絕妙的想法
-
編寫程式碼
-
準備提交系列
-
提交
其中第 2 點包含以下幾個例項
a) 常規使用
-
完成一些值得提交的東西
-
commit
b) 獨立修正
-
意識到有些東西不起作用
-
修正它
-
提交它
有時,b.2 中修復的內容無法修正到它修復的那個不太完美的提交,因為該提交深埋在補丁系列中。這正是互動式變基的用途:在執行了大量的“a”和“b”之後,透過重新排列和編輯提交,以及將多個提交合併為一個,來使用它。
從您希望原樣保留的最後一個提交開始
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
在應用該提交後停止,以便您可以編輯檔案和/或提交訊息,修改提交,然後繼續變基。
要中斷變基(就像 "edit" 命令一樣,但無需先揀選任何提交),請使用 "break" 命令。
如果您只想編輯提交的提交訊息,請將命令 "pick" 替換為命令 "reword"。
要丟棄一個提交,請將命令 "pick" 替換為 "drop",或者直接刪除匹配的行。
如果您想將兩個或多個提交合併為一個,請將第二個及後續提交的 "pick" 命令替換為 "squash" 或 "fixup"。如果這些提交有不同的作者,合併後的提交將歸屬於第一個提交的作者。合併提交的建議提交訊息是將第一個提交的訊息與 "squash" 命令標識的那些訊息連線起來,省略 "fixup" 命令標識的提交訊息,除非使用 "fixup -c"。在這種情況下,建議的提交訊息僅為 "fixup -c" 提交的訊息,並會開啟一個編輯器允許您編輯訊息。"fixup -c" 提交的內容(補丁)仍將合併到摺疊提交中。如果存在多個 "fixup -c" 提交,則使用最後一個提交的訊息。您也可以使用 "fixup -C" 獲得與 "fixup -c" 相同的行為,只是不開啟編輯器。
當 "pick" 被替換為 "edit" 或命令因合併錯誤而失敗時,git
rebase
將停止。當您完成編輯和/或解決衝突後,可以使用 git
rebase
--continue
繼續。
例如,如果您想重新排序最後 5 個提交,使 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")在歷史記錄的中間點重新編譯。您可以透過建立如下待辦列表來實現
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 ...
當命令失敗(即以非 0 狀態退出)時,互動式變基將停止,以便您有機會解決問題。您可以使用 git
rebase
--continue
繼續。
"exec" 命令在 shell(預設通常是 /bin/sh)中啟動命令,因此您可以使用 shell 功能(如 "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
期望此編輯的結果恰好是一個提交。實際上,您可以撤消提交,或者新增其他提交。這可用於將一個提交拆分為兩個
-
使用
git
rebase
-i
<commit>^
開始互動式變基,其中 <commit> 是您要拆分的提交。實際上,任何包含該提交的提交範圍都可以。 -
用“edit”動作標記您要拆分的提交。
-
當編輯該提交時,執行
git
reset
HEAD^
。其效果是HEAD
回溯一個,索引也隨之回溯。但是,工作樹保持不變。 -
現在將您希望包含在第一個提交中的更改新增到索引中。您可以使用
git
add
(可能以互動方式)或git
gui
(或兩者)來完成此操作。 -
現在使用適當的提交訊息提交當前索引。
-
重複最後兩個步驟,直到您的工作樹幹淨。
-
使用
git
rebase
--continue
繼續變基。
如果您不完全確定中間修訂版是一致的(它們可以編譯、透過測試套件等),則您應該在每次提交後使用 git
stash
暫存未提交的更改,進行測試,並在必要時修改提交。
從上游變基中恢復
變基(或任何其他形式的重寫)其他人的工作所基於的分支是一個糟糕的主意:任何下游使用者都將被迫手動修復其歷史。本節從下游使用者的角度解釋如何進行修復。然而,真正的解決方案是首先避免變基上游。
為了說明,假設您處於這樣一種情況:某人開發了一個 subsystem 分支,而您正在處理一個依賴於此 subsystem 的 topic。您最終可能會得到如下歷史記錄
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,則來自 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。這會產生連鎖反應:topic 的任何下游使用者都將被迫進行變基,依此類推!
有兩種修復方法,將在以下小節中討論
- 簡單情況:更改完全相同。
-
如果 subsystem 變基是一個簡單的變基且沒有衝突,就會發生這種情況。
- 困難情況:更改不同。
-
如果 subsystem 變基存在衝突,或者使用了
--interactive
來省略、編輯、合併或修正提交;或者如果上游使用了commit
--amend
、reset
或像filter-repo
這樣的完整歷史重寫命令,就會發生這種情況。
簡單情況
僅當 subsystem 上(基於 diff 內容的補丁 ID)的更改在 subsystem 執行變基前後完全相同時才有效。
在這種情況下,修復很簡單,因為 git rebase 知道跳過新上游中已存在的更改(除非給出 --reapply-cherry-picks
)。所以如果您說(假設您在 topic 分支上)
$ git rebase subsystem
您將得到修復後的歷史記錄
o---o---o---o---o---o---o---o master \ o'--o'--o'--o'--o' subsystem \ *---*---* topic
困難情況
如果 subsystem 的更改與變基之前的更改不完全一致,情況就會變得更加複雜。
注意
|
儘管“簡單情況恢復”有時在困難情況下也看似成功,但它可能導致意想不到的後果。例如,透過 git rebase --interactive 刪除的提交將**復活**! |
想法是手動告訴 git
rebase
“舊的 subsystem 在哪裡結束,您的 topic 在哪裡開始”,即它們之間的舊合併基礎是什麼。您將不得不找到一種方法來命名舊 subsystem 的最後一個提交,例如
-
使用 subsystem 的 reflog:在
git
fetch
之後,subsystem 的舊尖端在subsystem@{1}
。後續的 fetch 操作將增加這個數字。(參見 git-reflog[1]。) -
相對於 topic 的尖端:如果你知道你的 topic 有三次提交,那麼 subsystem 的舊尖端必須是
topic~3
。
然後你可以透過以下方式將舊的 subsystem..topic
移植到新的尖端(對於 reflog 情況,並假設你已在 topic 分支上)
$ git rebase --onto subsystem subsystem@{1}
“硬性恢復”的連鎖反應特別糟糕:topic 下游的所有人現在都必須執行“硬性恢復”!
變基合併
互動式變基命令最初設計用於處理單個補丁系列。因此,從待辦列表中排除合併提交是有意義的,因為開發者可能在分支上工作時合併了當時的 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
選項執行。它將生成一個如下所示的待辦列表:
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
命令在執行時將一個標籤與當前的 HEAD 關聯起來。這些標籤被建立為工作區本地引用 (refs/rewritten/
<label>),它們將在變基完成後被刪除。這樣,連結到同一倉庫的多個工作區中的變基操作不會相互干擾。如果 label
命令失敗,它會立即重新排程,並顯示一條有用的訊息,指導如何繼續。
reset
命令將 HEAD、索引和工作區重置到指定的版本。它類似於執行 exec
git
reset
--hard
<label>,但拒絕覆蓋未跟蹤的檔案。如果 reset
命令失敗,它會立即重新排程,並顯示一條有用的訊息,指導如何編輯待辦列表(這通常發生在手動將 reset
命令插入待辦列表幷包含拼寫錯誤時)。
merge
命令會將指定的版本合併到當時的 HEAD 中。使用 -C
<original-commit> 時,將使用指定的合併提交的提交訊息。當 -C
更改為小寫的 -c
時,成功合併後將在編輯器中開啟訊息,以便使用者可以編輯該訊息。
如果 merge
命令因合併衝突以外的任何原因失敗(即合併操作甚至沒有開始),它會立即重新排程。
預設情況下,merge
命令將對常規合併使用 ort
合併策略,對章魚式合併使用 octopus
策略。可以透過在呼叫變基時使用 --strategy
引數為所有合併指定預設策略,或者透過使用 exec
命令顯式呼叫帶 --strategy
引數的 git
merge
來覆蓋互動式命令列表中的特定合併。請注意,當像這樣顯式呼叫 git
merge
時,你可以利用標籤是工作區本地引用(例如,引用 refs/rewritten/onto
將對應於標籤 onto
)這一事實,以便引用你想要合併的分支。
注意:第一個命令 (label
onto
) 標記了提交變基到的版本;名稱 onto
只是一個約定,是為了向 --onto
選項致敬。
還可以透過新增形式為 merge
<merge-head> 的命令來從頭引入全新的合併提交。這種形式將生成一個臨時提交訊息,並始終開啟編輯器供使用者編輯。這在例如一個主題分支解決了不止一個問題並希望拆分為兩個或更多主題分支時會很有用。考慮這個待辦列表:
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
-
用於變基的預設後端。可能的選擇是 apply 或 merge。將來,如果合併後端獲得應用後端的所有剩餘功能,此設定可能會變得未使用。
- rebase.stat
-
是否顯示自上次變基以來上游更改的差異統計。預設為 false。
- rebase.autoSquash
-
如果設定為 true,則在互動模式下預設啟用 git-rebase[1] 的
--autosquash
選項。這可以透過--no-autosquash
選項覆蓋。 - rebase.autoStash
-
當設定為 true 時,在操作開始前自動建立一個臨時暫存條目,並在操作結束後應用它。這意味著你可以在一個有未提交更改的工作區上執行變基。但是,請謹慎使用:成功變基後的最終暫存應用可能會導致非平凡的衝突。此選項可以透過 git-rebase[1] 的
--no-autostash
和--autostash
選項覆蓋。預設為 false。 - rebase.updateRefs
-
如果設定為 true,預設啟用
--update-refs
選項。 - rebase.missingCommitsCheck
-
如果設定為“warn”,
git rebase -i
會在某些提交被移除(例如,一行被刪除)時列印警告,但變基仍將繼續。如果設定為“error”,它將列印上述警告並停止變基,此時可以使用 git rebase --edit-todo 來糾正錯誤。如果設定為“ignore”,則不進行任何檢查。要不帶警告或錯誤地刪除提交,請在待辦列表中使用drop
命令。預設為“ignore”。 - rebase.instructionFormat
-
一個格式字串,如 git-log[1] 中所指定,用於在互動式變基期間的待辦列表。該格式將自動在前面加上提交雜湊。
- rebase.abbreviateCommands
-
如果設定為 true,
git
rebase
將在待辦列表中使用縮寫的命令名稱,結果如下所示: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
用於編輯變基指令檔案的文字編輯器。該值旨在在使用時由 shell 解釋。它可以透過GIT_SEQUENCE_EDITOR
環境變數覆蓋。如果未配置,則使用預設的提交訊息編輯器。