为什么 git 分多个步骤进行变基?

Why is git doing a rebase in multiple steps?

我不得不在开发分支上对功能分支进行变基。

所以我刚刚做了一个 rebase,它让我分 5 个步骤完成这个 rebase 操作。

我可以看到这些标记:

REBASE 1/5
REBASE 2/5
REBASE 3/5
REBASE 4/5

第一个 git rebase <branch> 命令给我带来了一些冲突。 所以我编辑了文件,添加了它们,最后执行了 git rebase --continue 命令。 但它问我:No changes - did you forget to use 'git add'? 然后我不得不发出 git rebase --skip 命令,它显示了第一步未显示的其他冲突文件。 而且我不得不多次重复该操作,在这种情况下,大约 5 次,最终显示 Applying: 显示不再有冲突并且 rebase 已完成。

假设您的本地和远程分支在变基之前看起来像这样:

remote:  A -- B
          \
local:     C -- D -- E -- F -- G

localremote 的变基将导致以下分支图:

remote:  A -- B
               \
local:          C' -- D' -- E' -- F' -- G'

也就是说,rebase 开始为您的分支使用 A -- B 的新 base。然后它 重新应用 5 在这个新基础上提交 C 到 G。如您所见,rebase 的每个“步骤”都涉及在新基础之上应用这些提交之一。

关于多次修复同一事物,如果在新基础的 HEAD 提交和正在应用的提交中更改了给定的一行或多行,则会触发合并冲突。如果这种情况持续发生,同一代码区域将不断被标记为冲突。

一个确切的例子是您解析一行代码以与初始新基础的 HEAD 合并(上图中的提交 B)。对于每个连续的应用提交,您重新引入旧逻辑,然后需要再次解决。您可能会认为 rebase 就像慢动作合并,其中更改一点一点地分层,就像烤蛋糕一样。

rebase 的工作方式是将分支的基础(分支从其他分支转移的点)修改为另一个提交。这就是操作的名称。因此,该操作更改了提交(包括新的时间戳),因此它具有新的哈希值。简单来说,就是一个全新的正在创建的commit。

由于所有后续提交都依赖于先前的提交,因此它们也需要更改,否则您的历史记录将被完全破坏。因此,涉及多个步骤(每次提交一个)。

除此之外,rebase 为您提供了更多选项,例如将提交压缩在一起、编辑提交消息或 picking/skipping 特定提交。显然你不能一步完成,所以它正在逐步完成。