如何将更改从一个git分支转移到另一个分支

如何将更改从一个git分支转移到另一个分支,git,github,merge,version-control,Git,Github,Merge,Version Control,我有下面的树枝 分支A:主分支或主分支 分支B:从A创建 分支C:从B创建 分支D:从 现在我对分支C做了一些更改,现在我可以将它们合并到分支B。但是现在从分支a创建了一个新的分支D,现在我应该将我的更改合并到分支D。如何将我所有的更改合并到分支D?因为我有很多承诺,我不能一个接一个地挑选。我试图在分支C上重新设置分支D的基础,但我遇到了很多无法手动解决的冲突。那么,将分支C合并到分支D的最佳方法是什么 编辑1: 让我再澄清一下我的问题。这里的分支A是主分支。分支B是一个发布分支(刚刚结束,因此

我有下面的树枝

分支A:主分支或主分支

分支B:从A创建

分支C:从B创建

分支D:从

现在我对分支C做了一些更改,现在我可以将它们合并到分支B。但是现在从分支a创建了一个新的分支D,现在我应该将我的更改合并到分支D。如何将我所有的更改合并到分支D?因为我有很多承诺,我不能一个接一个地挑选。我试图在分支C上重新设置分支D的基础,但我遇到了很多无法手动解决的冲突。那么,将分支C合并到分支D的最佳方法是什么

编辑1:

让我再澄清一下我的问题。这里的分支A是主分支。分支B是一个发布分支(刚刚结束,因此该分支现在处于活动状态)。分支C是我的主题分支,分支D是新的发布分支,分支A是我的主题分支。理想情况下,我们应该只将我们的主题分支合并到发布分支,并将这些更改挑选到主分支(A)。因此,我们从当前发布分支创建一个主题分支,然后进行更改并提出合并请求。我们不应该向非活动发布分支添加任何内容。现在,我正在处理一个分支C,它是从一个已不活动的发布分支B上剪下来的。现在,我应该从D创建一个分支,并将所有更改添加到该分支,然后提出一个合并请求。我不想那样做。我想使用我的分支C在分支D上提出合并请求,这不会有任何冲突。可能吗

我的解决办法是:

我会从分支B创建一个临时分支B_temp。挤压将我的主题分支C合并到分支B_temp。然后从D中创建一个新的分支E,选择从B_temp到分支E的提交,解决任何合并冲突(我可以解决这些冲突,因为它们只是我的更改)。将F的合并请求提交到分支D。我想知道是否有更好的解决方案,而不是创建新的分支和樱桃采摘,如果我可以简单地使用旧的分支C


注意:未经适当的合并请求和批准,我们不允许合并主分支和发布分支中的任何内容。

假设所有分支的提交历史记录如下:

...---A---...---G   branchA, branchD
       \
        B---C---D---M   branchB
             \     /
              E---F branchC
通常有两种方法可以合并从
branchC
branchD
的更改

选项1:将branchB合并到branchD 由于您已将
branchC
合并到
branchB
,因此您可以将
branchB
合并到
branchD
,然后
branchC
的更改将应用到
branchD

git checkout branchD
git merge branchB
git checkout branchD
git merge branchC
然后提交历史记录将为:

             branchA
                |
...---A---...---G-----H   branchD
       \             /
        B---C---D---M   branchB
             \     /
              E---F branchC
                  E'---F' branchC
                 /
...---A---...---G    branchA, branchD
       \
        B---C---D---M   branchB
             \     /
              E---F 
              branchA
                |
...---A---...---G---E'---F'    branchC, branchD
       \
        B---C---D---M   branchB
             \     /
              E---F 
选项2:将branchC重基到branchA,然后合并到branchD 或者,您可以首先通过以下方式将
branchC
重设为
branchA

git rebase --onto branchA branchB branchC
提交历史记录将是:

             branchA
                |
...---A---...---G-----H   branchD
       \             /
        B---C---D---M   branchB
             \     /
              E---F branchC
                  E'---F' branchC
                 /
...---A---...---G    branchA, branchD
       \
        B---C---D---M   branchB
             \     /
              E---F 
              branchA
                |
...---A---...---G---E'---F'    branchC, branchD
       \
        B---C---D---M   branchB
             \     /
              E---F 
然后将重新设置基础的
branchC
合并到
branchD

git checkout branchD
git merge branchB
git checkout branchD
git merge branchC
提交历史记录将是:

             branchA
                |
...---A---...---G-----H   branchD
       \             /
        B---C---D---M   branchB
             \     /
              E---F branchC
                  E'---F' branchC
                 /
...---A---...---G    branchA, branchD
       \
        B---C---D---M   branchB
             \     /
              E---F 
              branchA
                |
...---A---...---G---E'---F'    branchC, branchD
       \
        B---C---D---M   branchB
             \     /
              E---F 

我想用我的分支C在分支D上提出一个合并请求 不会有任何冲突。可能吗

是的,有可能。 首先,请检查在
branchC
branchD
中是否存在通过以下方式更改的文件:

git diff branchC branchD --name-only
  • 如果两边都没有更改文件,则创建一个合并请求,直接将
    branch
    合并到
    branchD
  • 否则,使用branchD的文件版本覆盖branchC中的冲突文件版本:

    git checkout branchC
    git checkout branchD -- filename
    git commit -m 'overwrite the filename by using the version from branchD'
    git push origin branchC
    
    然后创建一个合并请求,将
    branchC
    合并到
    branchD
    ,这样就不会有合并确认


您好,谢谢您的回答。我在问题中补充了一些关于我的问题的细节。你能告诉我如何解决这个问题吗?@saurav我在回答的最后添加了将
branchC
合并到
branchD
而不合并冲突的方法。你可以试试。谢谢,我明白你的意思了。我也在做同样的事情,但当有大量文件发生更改时,问题就出现了。无法从分支D单独签出它们。因此我想知道是否存在其他快捷方式。git commit-m“使用来自branchD的版本覆盖文件名”这不会使我成为更改文件的所有者吗?我不要这个。我可能错了。@saurav如果是这样,您可以通过在
branch
上执行
git checkout branchD--.
来签出所有文件的版本,从
branchD
branchC
,然后在
branchC
上更改并提交部分文件。直接从branchC创建合并请求到branchD有什么不对?如果branchB是一个已完成的发布分支,它是否会合并到master中?我想直接从branchC创建MR到branchD,但branchC是从branchB创建的,因此,如何首先将branchD的更改转换为branchC,如果我将brachD的基础重新设置为branchC,就会产生很多冲突。这就是问题所在。branchB从不合并到master,而是branchB中的每个提交都被挑选到master。也就是说,我们将我们的主题分支压缩合并到发布分支,然后单一的提交被挑选到master。MR是什么意思?“如果我将brachD的基础重新设置为branchC,它会产生很多冲突。”这可能是因为
branchC
branchD
都修改了相同的文件。重新设置基础时,必须根据需要编辑文件以解决这些冲突。