git rebase分公司与祖父母
我正在阅读关于git rebase的git rebase分公司与祖父母,git,rebase,git-rebase,Git,Rebase,Git Rebase,我正在阅读关于git rebase的 我特别怀疑是否使用git rebase的on功能将分支重新设置为其祖辈的分支(就像上面链接中的情况一样)。 假设我们有一个如下所示的分支/提交结构: C1 <- C2 <- C5 <- C6 [master] <- C3 <- C4 <- C10 [server] <- C8 <- C9 [client] 我的疑问是,如果我在客户端分支中的更改取决于服务器分支中
我特别怀疑是否使用git rebase的on
功能将分支重新设置为其祖辈的分支(就像上面链接中的情况一样)。
假设我们有一个如下所示的分支/提交结构:
C1 <- C2 <- C5 <- C6 [master]
<- C3 <- C4 <- C10 [server]
<- C8 <- C9 [client]
我的疑问是,如果我在客户端
分支中的更改取决于服务器
分支中的C3提交,该怎么办。master
分支中的结果代码在rebase这样的场景中肯定会失败。就我所知,实际结果(合并并将主机快速转发到客户端后)不应该是这样的吗
C1如果从
C1---C2---C5---C6 master
\
C3---C4---C10 server
\
C8---C9 client
你希望结果是
C1---C2---C5---C6---C3'---C8'---C9' master, client
\
C4---C10 server
那么误解是:C3'不能是C4的祖先。这在这里是不可能发生的
当你这样做的时候
git rebase --onto master server client
而且,正如您所说,客户机中的更改“取决于”来自C3的更改,您可以解决合并,您将得到
C1---C2---C5---C6 master
\ \
\ C8'---C9' client
\
C3---C4---C10 server
C1---C2---C5---C6---C8'---C9' master, client
\
C4'---C10' server
C1---C2---C5---C6---C8'---C9' master, client
\
C3'---C4'---C10' server
现在,在合并主服务器和客户端并准备重新设置服务器的基础后,可能会出现两种情况:
1.如果在上一次冲突中保留了C8中“依赖”C3的更改,那么在解决当前冲突后git会说
没有更改-您是否忘记使用“git add”?如果一无所有
在舞台上,很可能已经有其他东西引入了相同的功能
变化;您可能希望跳过此修补程序
解决此问题后,运行“git-rebase--continue”。如果
如果希望跳过此修补程序,请运行“git-rebase--skip”。到
检查原始分支并停止重定基址,运行“git-rebase”
--中止”
然后你就可以做了
git rebase --skip
你会得到
C1---C2---C5---C6 master
\ \
\ C8'---C9' client
\
C3---C4---C10 server
C1---C2---C5---C6---C8'---C9' master, client
\
C4'---C10' server
C1---C2---C5---C6---C8'---C9' master, client
\
C3'---C4'---C10' server
请注意,没有C3',因为这些更改与C8'一起应用
2.如果您没有保留C8中在上一个冲突中“依赖”C3的更改,请在解决当前冲突并执行以下操作后执行
你会得到
C1---C2---C5---C6 master
\ \
\ C8'---C9' client
\
C3---C4---C10 server
C1---C2---C5---C6---C8'---C9' master, client
\
C4'---C10' server
C1---C2---C5---C6---C8'---C9' master, client
\
C3'---C4'---C10' server
这意味着,当
上的更改“取决于”重定基址时与
冲突的
时,git为您提供了合并解决机制,作为选择是现在还是以后进行这些更改的一种方式
我的疑问是,如果客户端分支中的更改取决于服务器分支中的C3提交,该怎么办。主分支中的结果代码在rebase这样的场景中肯定会失败
对。您已明确地将提交C3从重定基础的历史记录中删除。为什么这样做?只需git rebase主客户端
。当您合并server
git不会再次尝试应用C3更改,因为它们不会显示在差异中(或者,对这些行的进一步更改将发生冲突)
编辑:科莫分支不在“开”分支上。历史很重要。分支名称只是轻量级的(“throwaway”在这里不是一个坏词)引用,用于帮助识别您感兴趣的提交。关注社区本身及其祖先。1。您错误地标记了第二个图表<代码>主程序
应为客户端
。2.在第三个图中(也被错误标记),您为什么希望server
发生变化?毕竟,您只是在重新设置客户机的基址。@jcm对于第二个图表,我假设主机的快进。对于第三个图,是的,甚至我自己也对更改服务器
分支感到困惑,但是如果不是通过更改服务器
,如何才能做到这一点(将C3通信到主服务器)。主服务器没有快进功能,除非您在rebase操作后执行了git checkout master
git merge client
。您最初的问题的答案是“重新基础不会通过,它将以混乱的合并冲突停止,除非您也抓取C3”@AndrewC是的,我只是跳过/假设了这些步骤以保持问题简短。关于rebase没有通过,我恐怕不是这样,rebase只是从客户
分支接受提交并继续。实际的问题是,正如jthill的回答所指出的那样,我提到了错误的上游。跳过/假设步骤是一个很好的方法,可以得到混乱的答案,并且你的问题被否决。只有在不存在依赖项的情况下,才应该进行重新基础设置。假设我还没有准备好将服务器重新基础设置到我的主分支。我需要将客户机代码与主分支合并(我对线性历史使用rebase)。但这将失败,因为提交C3
不存在,而我对客户端
分支(C8和C9)的提交依赖于此。仅为了在上面的注释中澄清,合并将成功,但生成的代码将失败。C3的提交对象不存在,但是,您可以解决冲突,以便包含C3中所需的更改,从而使生成的代码正常工作。如果您还没有准备好集成来自C3的所有更改,并且只需要客户端分支所需的更改,则存在此功能。否则,您只需执行git rebase主客户端
。谢谢您的帮助!所以,历史记录的服务器端保持不变,当我在服务器上运行rebase(当然是在快进主机之后)时,它将自动对齐,并将跳过已经提交到上游的更改。令人惊叹的!