【问题标题】:Child Branch - Child Branch - Master - Git子分支 - 子分支 - 主分支 - Git
【发布时间】:2017-05-10 15:38:09
【问题描述】:

嗨,我有一个 master 分支,我用它做了一个分支(我们称之为分支 A)。我需要在该分支之外实现一个不同的功能,并且我在分支 A 之外创建了一个分支(假设是分支 B)。现在分支 A 合并到 master。如何将分支 B 合并到 master?

                         ------------------
                        /  BRANCH B
               ---------------------------
              /     BRANCH A
-----------------------------------------
       MASTER

现在看起来像这样:

                         ------------------
                        /  BRANCH B
               ---------------------------
              /     BRANCH A
-----------------------------------------
       MASTER + BRANCH A CHANGES

【问题讨论】:

    标签: git github version-control merge


    【解决方案1】:

    您只需要像合并 A 一样合并 B。Git 现在将如何处理来自 A 的已合并提交。

    git checkout master
    git merge B
    

    【讨论】:

      【解决方案2】:

      也许您可以像任何其他合并一样执行此操作。

      我认为人们对分支身份有点过于依赖了——或者,更重要的是,人们将“分支”(一个可移动的 ref;即指向某个提交的名称)与一组提交混为一谈。以你为例

      x --- O --- x --- x <--(master)
             \
              A1 --- A2 --- A3 <--(branchA)
                       \
                        B1 --- B2 <--(branchB)
      

      现在branchA 是一个恰好当前指向A3 的指针。许多人认为branchA 提交集合(A1A2A3),因此他们错误地推断删除分支或合并它的含义,或变基,或以任何方式对其进行操作。

      当你将branchA 合并到master 时,git 并不关心这样的事情。它刚刚看到O 是从branchAmaster 可以达到的最接近的提交; A1A2A3 可以从 branchA 访问,但不能从 O 访问;也许从master 可以访问各种x 提交,但不能从O 访问。它使用该信息来计算合并(如果在这样做时遇到任何困难,它会向您寻求帮助),然后留给您

      x --- O --- x --- x ----- M <--(master)
             \                 /
              A1 --- A2 --- A3 <--(branchA)
                       \
                        B1 --- B2 <--(branchB)
      

      所以现在如果你合并branchB git 可能会将A2 识别为可从branchBmaster 访问的最新提交; B1B2 作为可从 branchB 访问但不能从 A2 访问的提交;也许MA3 和各种x 提交可以从master 访问,但不能从A2 提交。并且它可能会很好地计算结果合并。

      也就是说,如果进展不顺利,您可以通过查看branchA(或A3,这可能很棘手,但如果您已经删除branchA),合并branchB,然后签出master并再次合并branchA。这会将合并计算分成两个更小/更简单的部分,并导致合并拓扑(取决于您的偏好)要么更对称,因此更整洁,或者更混乱,因此更丑。

      【讨论】:

      • 请注意,我对错字进行了一系列编辑,其中至少有一个更正了我最初提出的非常荒谬的声明。所以你可能想再读一遍。对此感到抱歉。
      【解决方案3】:

      有两种方法可以将B 合并到master 中(假设A 在提交K 时合并到master):

      A---B---C---D--------K  master
           \              /
             E---F---G---H    Branch A
                  \
                   I---G      Branch B
      

      选项1:将B重新定位到A上,然后将B合并到master中

      git rebase --onto A A B,那么分支结构如下:

      A---B---C---D--------K        master
           \              /
             E---F---G---H          Branch A
                          \
                           I'---G'  Branch B
      

      然后将B合并到master(git merge B):

      A---B---C---D-------K---------L  master
           \             /         /
            E---F---G---H         /    Branch A
                         \       /
                          I'---G'      Branch B
      

      方案2:直接将B合并到master中(这样会导致更多的冲突)

      git merge B

      A---B---C---D--------K---L   master
           \              /   /
            E---F---G---H    /     Branch A
                 \          /
                  I--------G       Branch B
      

      【讨论】:

      • 这是众多方法中的两种;不是唯一(或必然是最好的)两种方式。另请注意,rebase --onto A A Brebase A B 的长手,因为列出的上游是执行 rebase 的默认目标。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-14
      • 1970-01-01
      • 2014-09-19
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多