Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git rebase分公司与祖父母_Git_Rebase_Git Rebase - Fatal编程技术网

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的

我特别怀疑是否使用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(当然是在快进主机之后)时,它将自动对齐,并将跳过已经提交到上游的更改。令人惊叹的!