git rebase实现细节

时间:2016-06-28 13:12:32

标签: git git-rebase

我试图找出git-rebase的工作机制。 Documentation提供了有关git-rebase做什么的信息,但没有评论它是如何做的?

我查看了source code,制定了一些测试用例,并且到目前为止理解了以下内容:
 1. Git维护.git/rebase-apply中的rebase状态(包括patch,final-commit,head-name等文件)  2. Git使用git-format-patch创建所有必需的补丁文件(在rebase-apply中)  3. Git使用git-am逐个应用这些补丁

我想我错过了很多细节。我在哪里可以找到实施细节?是简单地倾销补丁并天真地应用它吗?

1 个答案:

答案 0 :(得分:3)

您的摘要基本完成。 Rebase实际上相对简单。

  1. 首先,计算要做的工作。这基本上是git rev-list <upstream>..<branch>来标识需要移动的所有提交。
    1. 如果您正在执行普通(基于补丁的)rebase,那么将生成每个提交的补丁并将其保存在rebase状态文件夹(.git/rebase-apply)中。
    2. 如果使用git rebase --merge调用rebase,则提交将存储在不同的状态文件夹(.git/rebase-merge)中。
  2. 接下来,HEAD被分离并设置为onto提交(新的基本分支,您将应用这些更改)。
  3. 应用程序发生,直到无法应用提交。
    1. 如果您正在进行基于补丁的rebase,则会按顺序应用补丁。如果补丁无法应用,那么Git将尝试改为cherry-pick有问题的提交。这是因为cherry-pick能够将合并冲突写入索引和工作目录。
    2. 如果您正在进行基于合并的rebase,则提交为cherry-pick ed。
  4. 如果cherry-pick因冲突而失败,则rebase停止,您(用户)必须解决任何冲突并将git add它们解析为索引。解决所有冲突后,您可以git rebase --continue
  5. 一旦应用了所有冲突,原始分支将更新为指向最终的,重新定位的提交。