你表达你的理解的方式让我有点困惑。我认为您可能是对的,但以防万一,这就是我通常认为的方式。当你变基时,git 会接受这两个提交并尝试将它们应用于新的基数。e57cf 是应用 169a6 差异的结果——也就是说,在简单的理想情况下,git diff a46c3 169a6
应该git diff da985 e57cf
产生相同的输出。同样,f7e63 应该包含与 2c33a 相同的更改。如果有帮助,您可以将“rebase”视为“移植”的同义词。
现在,不一定能干净地应用这些更改。当rebase
遇到补丁不适用的提交时,您会像合并一样遇到冲突,它会要求您解决它们然后运行git rebase --continue
以移动它们。
希望这确实是一个合并操作是有道理的。这里有一些实现细节,但结果是 git 尽可能利用它的合并工具。虽然最终结果是移植 169a6 使其变为 e57cf,但提交 e57cf 的内容可以通过将 169a6 与 da985 合并来创建 - 知道它们具有共同的祖先 a47c3,因此可以进行三向合并。这允许 rebase 避免在您可能期望它们发生的某些时候发生冲突。
实现细节,如果您有兴趣:默认情况下,rebase 用于git-format-patch
创建差异,然后使用git-am
,--3way
选项将其应用到“如果补丁记录了它应该记录的 blob 的身份,则返回到 3 路合并申请,我们在当地有这些 blob。” 也可以告诉 rebase 在内部使用合并策略,在这种情况下它直接调用合并策略(默认情况下是递归的)。无论哪种方式,它都比简单地转储补丁并天真地应用它更复杂。
(最后一段一半来自记忆,一半来自浏览 git-rebase 的来源,而且是深夜 - 如果有更多知识渊博的人发生,请随时纠正任何不准确或遗漏。)