【问题标题】:How to take changes from one git branch to another branch如何从一个 git 分支更改到另一个分支
【发布时间】:2018-07-26 10:36:12
【问题描述】:

我有以下分支。

A 分支:主分支或主分支。

B 分支:从 A 创建。

C 分支:从 B 创建。

D 分支:从 A 创建

现在我对分支 C 做了一些更改,现在我可以将它们合并到分支 B。但是此时从分支 A 创建了一个新分支 D,现在我应该将我的更改合并到分支 D。如何获取所有我对分支 D 的更改?由于我有很多提交,我无法一一挑选它们。我试图在分支 C 上重新设置分支 D,但我遇到了很多无法手动解决的冲突。那么将分支 C 合并到分支 D 的最佳方法是什么?

编辑 1:

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

我的解决办法是:

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

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

【问题讨论】:

  • 直接从branchC创建合并请求到branchD有什么问题?
  • 如果 branchB 是一个完整的发布分支,它是否会被合并到 master 中?
  • 我想直接从branchC到branchD创建MR,但是branchC是从branchB创建的,所以如何首先将branchD的更改变为branchC,如果我将brachD重新设置为branchC它会提供很多冲突。那就是问题所在。 branchB 永远不会合并到 master,而是 branchB 中的每个提交都被挑选到 master 中。也就是说,我们将我们的主题分支合并到发布分支,并且单个提交被挑选出来掌握。
  • MR是什么意思?
  • "如果我将 brachD 重新设置为 branchC 会产生很多冲突。"这可能是因为branchCbranchD 都修改了相同的文件。当你变基时,你必须适当地编辑文件来解决这些冲突。

标签: git github merge version-control


【解决方案1】:

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

...---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

那么提交历史将是:

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

选项 2:将 branchC 重新定位到 branchA,然后合并到 branchD

或者您可以首先通过以下方式将branchC 重新定位到branchA

git rebase --onto branchA branchB branchC

提交历史将是:

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

然后将重新定位的branchC合并成branchD

git checkout branchD
git merge branchC

提交历史将是:

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

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

是的,有可能。 首先,请检查branchCbranchD 中是否有文件被更改:

git diff branchC branchD --name-only
  • 如果两边都没有文件变化,则创建合并请求,将branchC直接合并到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 'overwrite the filename by using the version from branchD' 这不会让我成为更改文件的所有者吗?我不想要这个。我可能在这里错了。
  • @saurav 如果是这样,您可以通过在branchC 上执行git checkout branchD -- . 来检出从branchDbranchC 的所有文件版本,然后根据需要更改并提交部分文件branchC.
猜你喜欢
  • 2020-06-03
  • 2019-03-17
  • 2018-06-21
  • 2015-01-01
  • 2016-06-15
  • 2014-04-17
  • 1970-01-01
  • 2011-03-08
  • 2011-07-15
相关资源
最近更新 更多