设置和配置
获取和创建项目
基本快照
分支和合并
共享和更新项目
检查和比较
补丁
调试
电子邮件
外部系统
服务器管理
指南
管理
底层命令
-
2.49.0
2025-03-14
- 2.46.2 → 2.48.1 无更改
-
2.46.1
2024-09-13
- 2.45.1 → 2.46.0 无更改
-
2.45.0
2024-04-29
- 2.44.1 → 2.44.3 无更改
-
2.44.0
2024-02-23
- 2.43.3 → 2.43.6 无更改
-
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
选项。 如果你当前不在任何分支上,或者当前分支没有配置上游,则 rebase 将中止。
当前分支中的所有更改,但不在 <upstream>
中的更改,都将保存到临时区域。 这是与 git log <upstream>..HEAD
相同的提交集合; 或者,如果 --fork-point
处于活动状态,则由 git log 'fork_point'..HEAD
显示(请参阅下面关于 --fork-point
的描述); 或者,如果指定了 --root
选项,则由 git log HEAD
显示。
如果提供了 --onto
选项,则当前分支将重置为 <upstream>
或 <newbase>
。 这与 git reset --hard <upstream>
(或 <newbase>
) 具有完全相同的效果。 ORIG_HEAD
设置为指向重置之前分支的顶端。
注意
|
如果在 rebase 期间使用了写入该伪引用 (例如 git reset ) 的其他命令,则不能保证 ORIG_HEAD 在 rebase 结束时仍然指向先前的分支顶端。 但是,可以使用当前分支的 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
的简写形式。 当 rebase 退出时,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 选项的另一个示例是 rebase 分支的一部分。 如果我们有以下情况
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>
在手动解决冲突并使用所需的解决方案更新索引后,你可以使用以下命令继续 rebasing 过程
git rebase --continue
或者,你可以使用以下命令撤消 *git rebase*
git rebase --abort
模式选项
本节中的选项不能与任何其他选项一起使用,包括彼此之间
- --continue
-
在解决合并冲突后,重新启动 rebasing 过程。
- --skip
-
通过跳过当前补丁重新启动 rebasing 过程。
- --abort
-
中止 rebase 操作并将 HEAD 重置为原始分支。 如果在启动 rebase 操作时提供了
<branch>
,则HEAD
将重置为<branch>
。 否则,HEAD
将重置为启动 rebase 操作时的位置。 - --quit
-
中止 rebase 操作,但
HEAD
不会重置回原始分支。 索引和工作树也保持不变。 如果使用--autostash
创建了临时隐藏条目,它将被保存到隐藏列表中。 - --edit-todo
-
在交互式 rebase 期间编辑 todo 列表。
- --show-current-patch
-
在交互式 rebase 中或因冲突而停止 rebase 时,显示当前补丁。 这等效于
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)
-
如何处理那些一开始不是空的提交,也不是任何上游提交的干净的 cherry-pick,但在变基后变为空(因为它们包含已经是上游更改的子集)
请注意,一开始为空的提交会被保留(除非指定了
--no-keep-empty
),并且作为初步步骤,会检测到干净的 cherry-pick(由git log --cherry-mark ...
确定)并删除(除非传递了--reapply-cherry-picks
或--keep-base
)。另请参见下面的“不兼容选项”。
- --no-keep-empty
- --keep-empty
-
不要在结果中保留变基之前开始为空的提交(即,从其父级未更改任何内容的提交)。 默认是保留一开始为空的提交,因为创建此类提交需要将
--allow-empty
覆盖标志传递给git commit
,表明用户非常有意地创建此类提交,因此希望保留它。此标志的使用可能很少,因为您可以启动交互式变基并删除与您不想要的提交相对应的行来摆脱一开始为空的提交。 此标志的存在是为了方便的快捷方式,例如在外部工具生成许多空提交并且您希望全部删除的情况下。
对于那些一开始不为空但在变基后变为空的提交,请参阅
--empty
标志。另请参见下面的“不兼容选项”。
- --reapply-cherry-picks
- --no-reapply-cherry-picks
-
重新应用任何上游提交的所有干净的 cherry-pick,而不是抢先删除它们。(如果这些提交在变基后变为空,因为它们包含已经是上游更改的子集,那么对它们的行为由
--empty
标志控制。)在没有
--keep-base
的情况下(或者如果给出了--no-reapply-cherry-picks
),这些提交将被自动删除。 因为这需要读取所有上游提交,所以在具有大量需要读取的上游提交的存储库中,这可能会很昂贵。 当使用合并后端时,将为每个删除的提交发出警告(除非给出了--quiet
)。 除非advice.skippedCherryPicks
设置为 false,否则也将发出建议(请参见 git-config[1])。--reapply-cherry-picks
允许变基放弃读取所有上游提交,从而可能提高性能。另请参见下面的“不兼容选项”。
- --allow-empty-message
-
空操作。 带有空消息的变基提交以前会失败,此选项会覆盖该行为,允许变基带有空消息的提交。 现在,带有空消息的提交不会导致变基停止。
另请参见下面的“不兼容选项”。
- -m
- --merge
-
使用合并策略进行变基(默认)。
请注意,变基合并的工作方式是在
<upstream>
分支之上重放工作分支中的每个提交。 因此,当发生合并冲突时,报告为我们的一方是到目前为止已变基的系列,从<upstream>
开始,而他们的一方是工作分支。 换句话说,这些方是交换的。另请参见下面的“不兼容选项”。
- -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
是一种很好的方式来仔细检查rerere
所做的事情,并在将结果提交到索引之前通过单独的git add
捕获潜在的错误合并。 - -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 hook。 另请参见 githooks[5]。
- --verify
-
允许运行 pre-rebase hook,这是默认值。 此选项可用于覆盖
--no-verify
。 另请参见 githooks[5]。 - -C<n>
-
确保在每次更改前后至少匹配
<n>
行周围上下文。 当存在的周围上下文行数较少时,必须全部匹配。 默认情况下,永远不会忽略任何上下文。 意味着--apply
。另请参见下面的“不兼容选项”。
- --no-ff
- --force-rebase
- -f
-
单独重放所有已变基的提交,而不是在未更改的提交上进行快进。 这确保了已变基分支的整个历史记录由新的提交组成。
在恢复主题分支合并后,您可能会发现这很有用,因为此选项会使用新的提交重新创建主题分支,因此可以成功地重新合并它,而无需“恢复还原”(请参见 revert-a-faulty-merge How-To 了解详细信息)。
- --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=<选项>
-
此标志传递给
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
,则只有标记为 pick、edit 或 reword 的提交才会添加该尾部。另请参见下面的“不兼容选项”。
- -i
- --interactive
-
创建一个即将变基的提交列表。允许用户在变基之前编辑该列表。此模式也可用于拆分提交(请参阅下面的拆分提交)。
可以通过设置配置选项 rebase.instructionFormat 来更改提交列表格式。自定义的指令格式将自动将提交哈希值添加到格式的前面。
另请参见下面的“不兼容选项”。
- -r
- --rebase-merges[=(rebase-cousins|no-rebase-cousins)]
- --no-rebase-merges
-
默认情况下,变基将简单地从 todo 列表中删除合并提交,并将变基的提交放入单个线性分支中。 使用
--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! " 开头,则标题的其余部分将作为提交说明符,如果它与该提交的标题或哈希值匹配,则它与先前的提交匹配。 如果没有提交完全匹配,则会考虑说明符与提交标题开头的匹配。
在变基 todo 列表中,squash、fixup 和 amend 提交的操作分别从
pick
更改为squash
、fixup
或fixup -C
,并且它们会移动到它们修改的提交之后。--interactive
选项可用于在继续之前查看和编辑 todo 列表。创建带有 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
时,显式的--no-reschedule-failed-exec
在开始时会被rebase.rescheduleFailedExec=true
配置的存在所覆盖。 目前,您无法将--[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=
-
在不使用 --keep-base 时,--[no-]reapply-cherry-picks
-
--update-refs
-
在不使用 --onto 时,--root
此外,以下选项对不兼容
-
--keep-base 和 --onto
-
--keep-base 和 --root
-
--fork-point 和 --root
行为差异
git rebase
有两个主要后端:apply 和 merge。 (apply 后端过去被称为 am 后端,但该名称容易混淆,因为它看起来像一个动词而不是名词。此外,merge 后端过去被称为交互式后端,但它现在也用于非交互式的情况。两者都根据支持每个后端较低级别的功能进行了重命名。)这两个后端在行为上存在一些细微的差异
空提交
不幸的是,apply 后端会删除有意为空的提交,即一开始为空的提交,尽管这些在实践中很少见。 它还会删除变为空的提交,并且没有用于控制此行为的选项。
默认情况下,merge 后端保留有意为空的提交(尽管使用 -i
时,它们在 todo 列表编辑器中被标记为空,或者可以使用 --no-keep-empty
自动删除它们)。
与 apply 后端类似,默认情况下,merge 后端会删除变为空的提交,除非指定 -i
/--interactive
(在这种情况下,它会停止并询问用户该怎么做)。 merge 后端还有一个 --empty=(drop|keep|stop)
选项,用于更改处理变为空的提交的行为。
目录重命名检测
由于缺少准确的树信息(源于使用补丁中提供的有限信息构建伪造的祖先),因此在 apply 后端中禁用了目录重命名检测。 禁用目录重命名检测意味着如果历史记录的一侧重命名一个目录,而另一侧将新文件添加到旧目录,则新文件将留在旧目录中,并且在变基时不会发出任何警告,提示您可能希望将这些文件移动到新目录中。
目录重命名检测与 merge 后端一起使用,以便在这种情况下为您提供警告。
上下文
apply 后端的工作方式是创建一系列补丁(通过在内部调用 format-patch
),然后按顺序应用补丁(在内部调用 am
)。 补丁由多个 hunk 组成,每个 hunk 都有行号、上下文区域和实际更改。 行号必须带有一些偏移量,因为另一侧可能已经在文件的前面插入或删除了行。 上下文区域旨在帮助找到如何调整行号,以便将更改应用于正确的行。 但是,如果代码的多个区域具有相同的周围上下文行,则可能会选择错误的区域。 在实际情况下,这会导致提交被错误地重新应用,而没有报告任何冲突。 将 diff.context
设置为更大的值可能会防止此类问题,但会增加虚假冲突的几率(因为它需要更多匹配的上下文行才能应用)。
merge 后端使用每个相关文件的完整副本,使其免受此类问题的影响。
冲突标记的标记
当存在内容冲突时,合并机制会尝试使用内容来源的提交来注释每一侧的冲突标记。 由于 apply 后端丢弃了关于变基的提交及其父项的原始信息(而是基于生成的补丁中的有限信息生成新的伪造提交),因此无法识别这些提交; 相反,它必须回退到提交摘要。 此外,当 merge.conflictStyle
设置为 diff3
或 zdiff3
时,apply 后端将使用“构造的合并基础”来标记来自合并基础的内容,因此不提供关于合并基础提交的任何信息。
merge 后端处理的是历史两端的完整提交,因此没有这些限制。
钩子 (Hooks)
传统上,apply 后端不会调用 post-commit 钩子,而 merge 后端会调用。两者都会调用 post-checkout 钩子,但 merge 后端会抑制其输出。此外,两个后端都只使用 rebase 的起始点提交来调用 post-checkout 钩子,而不是中间提交或最终提交。在每种情况下,调用这些钩子都是实现上的偶然,而不是设计上的(两个后端最初都实现为 shell 脚本,并且碰巧调用了其他命令,如 git checkout
或 git commit
,而这些命令会调用钩子)。两个后端应该具有相同的行为,但哪个是正确的还不完全清楚。将来我们可能会让 rebase 停止调用这些钩子中的任何一个。
可中断性
apply 后端在不恰当的时间中断时存在安全问题;如果用户在错误的时间按下 Ctrl-C 尝试中止 rebase,则 rebase 可能会进入无法使用后续 git rebase --abort
中止的状态。merge 后端似乎没有同样的缺点。(详情请参见 https://lore.kernel.org/git/20200207132152.GC2868@szeder.dev/。)
合并策略 (MERGE STRATEGIES)
合并机制(git merge
和 git pull
命令)允许使用 -s
选项选择后端合并策略。某些策略还可以采用自己的选项,这些选项可以通过将 -X<option>
参数传递给 git merge
和/或 git pull
来传递。
- ort
-
这是拉取或合并一个分支时的默认合并策略。此策略只能使用 3 向合并算法解析两个头。当存在多个可用于 3 向合并的公共祖先时,它会创建公共祖先的合并树,并将其用作 3 向合并的参考树。据报道,通过对从 Linux 2.6 内核开发历史记录中获取的实际合并提交进行的测试,这可以减少合并冲突,而不会导致错误合并。此外,此策略可以检测和处理涉及重命名的合并。它不使用检测到的副本。此算法的名称是一个首字母缩写词 ("Ostensibly Recursive’s Twin"),来源于它是作为先前默认算法
recursive
的替代品编写的事实。如果路径是子模块,并且在合并的一侧使用的子模块提交是合并另一侧使用的子模块提交的后代,则 Git 会尝试快速前进来达到后代。否则,Git 会将此情况视为冲突,建议使用作为冲突后代的子模块提交(如果存在)作为解决方案。
ort 策略可以采用以下选项
- ours
-
此选项强制通过支持我们的版本来干净地自动解决冲突的代码块。来自另一棵树的不与我们这边冲突的更改会反映在合并结果中。对于二进制文件,整个内容都取自我们这边。
这不应与 ours 合并策略混淆,该策略甚至不查看另一棵树包含的内容。它会丢弃另一棵树所做的一切,声明我们的历史记录包含其中发生的所有内容。
- 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>
同义词。 - subtree[=<path>]
-
此选项是 subtree 策略的更高级形式,其中该策略猜测在合并时必须如何移动两棵树才能相互匹配。相反,指定的路径会添加前缀(或从开头剥离)以使两棵树的形状匹配。
- recursive
-
这只能使用 3 向合并算法解析两个头。当存在多个可用于 3 向合并的公共祖先时,它会创建公共祖先的合并树,并将其用作 3 向合并的参考树。据报道,通过对从 Linux 2.6 内核开发历史记录中获取的实际合并提交进行的测试,这可以减少合并冲突,而不会导致错误合并。此外,这可以检测和处理涉及重命名的合并。它不使用检测到的副本。这是从 Git v0.99.9k 到 v2.33.0 解析两个头的默认策略。
对于作为子模块的路径,ort 的相同注意事项适用于此策略。
recursive 策略采用与 ort 相同的选项。但是,ort 忽略的三个附加选项(上面未记录)可能对 recursive 策略有用
- patience
-
已弃用的
diff-algorithm=patience
同义词。 - diff-algorithm=[patience|minimal|histogram|myers]
-
在合并时使用不同的 diff 算法,这有助于避免由于不重要的匹配行(例如来自不同函数的大括号)而导致的错误合并。另请参阅 git-diff[1]
--diff-algorithm
。请注意,ort
专门使用diff-algorithm=histogram
,而recursive
默认为diff.algorithm
配置设置。 - no-renames
-
关闭重命名检测。这将覆盖
merge.renames
配置变量。另请参阅 git-diff[1]--no-renames
。
- resolve
-
这只能使用 3 向合并算法解析两个头(即当前分支和你从中拉取的另一个分支)。它试图仔细检测纵横交错的合并歧义。它不处理重命名。
- octopus
-
这解决了超过两个头的情况,但拒绝进行需要手动解决的复杂合并。它主要用于将主题分支头捆绑在一起。这是拉取或合并多个分支时的默认合并策略。
- ours
-
这解决了任意数量的头,但合并的结果树始终是当前分支头的树,有效地忽略了来自所有其他分支的所有更改。它旨在用于取代侧分支的旧开发历史记录。请注意,这与 recursive 合并策略的 -Xours 选项不同。
- subtree
-
这是一个修改后的
ort
策略。合并树 A 和 B 时,如果 B 对应于 A 的子树,则首先调整 B 以匹配 A 的树结构,而不是在同一级别读取树。此调整也适用于公共祖先树。
对于使用 3 向合并的策略(包括默认的 ort),如果在两个分支上都进行了更改,但后来在一个分支上还原了该更改,则该更改将存在于合并结果中;有些人发现这种行为令人困惑。发生这种情况是因为在执行合并时仅考虑头和合并基础,而不考虑各个提交。因此,合并算法将还原的更改视为根本没有更改,而是替换为已更改的版本。
注释 (NOTES)
您应该了解在您共享的存储库上使用 git rebase
的影响。另请参见下面的从上游变基恢复。
运行 rebase 时,它将首先执行 pre-rebase
钩子(如果存在)。您可以使用此钩子进行健全性检查,并在不合适时拒绝 rebase。有关示例,请参见模板 pre-rebase
钩子脚本。
完成后,<branch>
将成为当前分支。
交互模式 (INTERACTIVE MODE)
以交互方式变基意味着您有机会编辑要变基的提交。您可以对提交进行重新排序,并且可以删除它们(剔除错误的或不需要的补丁)。
交互模式适用于以下类型的工作流程
-
有一个好主意
-
hack 代码
-
准备提交的系列
-
提交
其中第 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" 命令一样,但不会首先 cherry-pick 任何提交),请使用 "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 中启动命令(默认 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 上的更改(基于差异内容的补丁 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}
。 后续的提取将增加该数字。 (请参阅 git-reflog[1]。) -
相对于 topic 的顶端:如果您知道您的 topic 有三个提交,则旧 subsystem 的顶端必须是
topic~3
。
然后,您可以通过说出(对于 reflog 情况,并假设您已经在 topic 上)将旧的 subsystem..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
策略。 可以通过在调用 rebase 时使用 --strategy
参数为所有合并指定默认策略,或者可以通过使用 exec
命令显式调用带有 --strategy
参数的 git merge
来覆盖交互式命令列表中的特定合并。 请注意,像这样显式调用 git merge
时,你可以利用标签是工作区本地引用这一事实(例如,引用 refs/rewritten/onto
对应于标签 onto
),以便引用要合并的分支。
注意:第一个命令 (label onto
) 标记提交被 rebase 到的修订版本;名称 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
-
用于 rebase 的默认后端。 可能的选择是 *apply* 或 *merge*。 将来,如果 merge 后端获得 apply 后端的所有剩余功能,则此设置可能不再使用。
- rebase.stat
-
是否显示自上次 rebase 以来上游更改的 diffstat。 默认为 false。
- rebase.autoSquash
-
如果设置为 true,则默认情况下为交互模式启用 git-rebase[1] 的
--autosquash
选项。 可以使用--no-autosquash
选项覆盖此设置。 - rebase.autoStash
-
设置为 true 时,在操作开始前自动创建一个临时储藏条目,并在操作结束后应用它。 这意味着你可以在一个不干净的工作区上运行 rebase。 但是,请谨慎使用:成功 rebase 后的最终储藏应用可能会导致非平凡的冲突。 可以通过 git-rebase[1] 的
--no-autostash
和--autostash
选项覆盖此选项。 默认为 false。 - rebase.updateRefs
-
如果设置为 true,则默认启用
--update-refs
选项。 - rebase.missingCommitsCheck
-
如果设置为 "warn",则 git rebase -i 将在删除某些提交(例如,删除了某一行)时打印警告,但 rebase 仍将继续。 如果设置为 "error",它将打印之前的警告并停止 rebase,然后可以使用 *git rebase --edit-todo* 来纠正错误。 如果设置为 "ignore",则不进行检查。 要在没有警告或错误的情况下删除提交,请在待办事项列表中使用
drop
命令。 默认为 "ignore"。 - rebase.instructionFormat
-
一个格式字符串,如 git-log[1] 中所指定的,用于交互式 rebase 期间的待办事项列表。 格式将自动将提交哈希值添加到格式中。
- 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
使用的文本编辑器,用于编辑 rebase 指令文件。 该值旨在在使用时由 shell 解释。 可以通过GIT_SEQUENCE_EDITOR
环境变量覆盖它。 未配置时,将使用默认的提交消息编辑器。
GIT
属于 git[1] 套件的一部分