rebase 提供了提高历史可读性的优势,这可能让其他开发者感到满意。然而,这种方式隐藏了一些潜在问题。当依赖在 master 上被移除而在 feature 上仍存在的情况下,rebase 可能会导致构建失败。尽管冲突未中断 rebase 过程,但错误会沿链式传播,直到 rebase 完成后才被发现。这需要在之后增加修复提交。
在 rebase 过程中遇到冲突时,Git 会暂停处理冲突,允许开发者解决后再继续。但在这个过程中,错误提交可能被引入,这将影响 Git bisect 的调试能力。bisect 是 Git 工具箱中强大的调试工具,它通过二分查找历史记录来识别引入错误的提交。
错误的 rebase 过程不仅可能导致额外的错误,还会使追踪问题的复杂性增加。这使得使用 Git bisect 来定位问题变得更加困难。例如,在一个 feature 分支的末尾引入错误,需要追踪多个提交来找到问题的根源。
作者强调了 Git 的核心价值在于追踪代码中的错误来源。尽管 rebase 能够提供线性历史,但这可能导致较少的优先权。在频繁使用 rebase 并引入错误提交链后,作者不得不花费大量时间来追踪问题,这揭示了 rebase 带来的实际成本。
为了避免在 rebase 过程中引入错误,作者提出了一些建议。一种方法是在 rebase 结束后进行代码测试,然后返回错误源头进行修复。另一种方法是在 rebase 每个步骤中暂停,测试和修复错误后再继续。这些方法虽然可能显得笨重且容易出错,但确实能避免线性历史中的问题。