3

我是新手git,我正在尝试了解变基。对我来说,合并过程更容易理解,因为我的经验是Clearcase.
所以首先我不明白 rebase 是否与合并完全相同。如果是,为什么同一件事有两个程序?
我也在阅读这部分git-branching
它在这里:
在此处输入图像描述

然后它说:

$ git rebase --onto master server client
这基本上是说,“检查客户端分支,找出
客户端和服务器分支的共同祖先的补丁,然后将它们重播到主服务器上。” 这有点复杂;但是结果,如图 3-32 所示,非常酷。

所以我假设这个命令意味着在服务器和客户端分支的共同祖先之后进行所有提交,不包括共同祖先。所以我们最终得到了下一张照片。

在此处输入图像描述

然后它说:

现在你可以快进你的 master 分支(见图 3-33):
$ git checkout master
$ git merge client

在此处输入图像描述

这个例子对我来说似乎是错误的。
在第二张图片中,我们“移动”C8并且C9作为rebase. 然后我们合并。
但是C8出来C3并且C3代码不存在于master分支中。
之后,rebase虽然新的C8ieC8'在前面master并且实际上master在链中具有之前的 ie。
但这怎么能行呢?IfC8依赖于C3失败rebase,因为C3它不是branch.
例如,如果客户端使用了某些功能,则它在分支C3中不存在。main所以在 之后rebaseC8'在定义的函数中有依赖C3中不存在的main。所以代码不会编译。
任何人都可以帮助解释rebase工作流程,如果我在本教程的这一部分中所说的git-scm(它是错误的)是正确的?

4

1 回答 1

1

不,这不是一回事。rebase 会将 rebase 的分支提交放在你 rebase 的分支之后。

基本合并将创建一个新的合并提交结果。

我们可以说,当合并很明显时,rebase 避免了过多的并行分支。但是如果合并很复杂(处理相同的文件等),合并会更好。 这是因为在重新合并时,git 会重新计算差异,例如

a = b + 差异 a c= b + 差异 c

合并是 d = a + c rebase 是 cbis = a + diff cbis

diff c 可能很容易阅读, diff cplus 可能很复杂

还有一个快进选项,如果差异很简单,它会尝试在行中合并(如变基),如果不是,则创建一个合并。这可能是初学者的最佳选择

于 2013-05-23T22:26:45.757 回答