【问题标题】:Temporarily use commits from another feature branch临时使用来自另一个功能分支的提交
【发布时间】:2021-04-30 12:46:00
【问题描述】:

我的 git 流程如下所示:

                        x - x (feature/branch-a)
                      /
(master) x- x (develop) 
                      \
                        x - x (feature/branch-b)

目前有branch-adevelop 的提交和PR。在branch-a PR 被接受之前,我会稍等片刻,但branch-b 重用了我需要的branch-a 的大量逻辑。

在我开始将代码从branch-a 复制到branch-b 之前,有没有更好的方法来合并此代码而不创建功能branch-b 关闭branch-a

【问题讨论】:

  • 我真的没想到会这么简单,因为一旦 PR 被接受,远程分支最终会消失。是的,这似乎奏效了。只要branch-a PR 首先被接受/合并到develop,这不会产生任何冲突?
  • 使用 rebase 来移动 feature-b。您可以将其放在 feature-a 之上,然后在 feature-a 合并时将其重新定位在 develop 或 master 之上。我并不是说这是不费吹灰之力。您可能必须使用 rebase 来提供对 skip 的修订(例如 git rebase --onto master feature-b~3 feature-b 仅对 feature-b 的最后 3 个修订进行 rebase),但实现起来非常简单。
  • 经验法则:git 不关心你的分支,只关心你的提交。 “Merge branch-b to develop”只是意味着“在 branch-b 上找到尚未在开发中的提交,并应用这些更改”。
  • 不幸的是,这个问题的标题让人们认为您是在问 如何 进行合并,而不是 如果 你可以/应该。我已更改标题并投票重新开放。
  • @TTT 谢谢!

标签: git


【解决方案1】:

我强烈建议采用eftshift0's comment 中描述的fancy rebase 方法。这不是微不足道的,因为您首先需要学习并熟悉git rebase --onto。但是一旦你真的git了它,你就可以随意surgically move your commits围绕一个repo。

考虑到这一点,如果您现在将feature/branch-a 合并到feature/branch-b 中,或者像您说要避免的那样现在将B 重新设置为A,实际上并不重要。这两种方法都可以让你继续工作,一旦 A 的 PR 合并到 develop,你就可以fancy rebase你自己的提交到最新的开发中,为你的 PR 做准备。请注意,您不必必须在 PR 之前重新调整和清理您的分支,但如果您不这样做,您可能会从旧版本中提取重复的提交(仅通过提交 ID 不同) feature/branch-A,也可能与他们发生冲突。

旁注:当你第一次学习一个花哨的变基时的一个陷阱是,如果你用提交 ID 而不是分支名称来使用它,当你完成时你最终会分离。如果您发现自己处于这种情况,要将您的分支设置为您想要的提交,在 rebase 完成后您可以运行以下命令:

git checkout -B feature/branch-b

注意checkout -B 表示创建分支,如果它已经存在则覆盖。

【讨论】:

    【解决方案2】:

    Cherry-pick(请参阅 12)很简单,并且适用于一些更改。在分支 b 上,您可以在开始工作之前选择分支 a 的单个提交(如 1)并将其复制到当前的早午餐(1*):

    git cherry-pick <commit-hash>
    

    如果您只需要一些更改:

                            1 - 2 (feature/branch-a)
                          /
    (master) x- x (develop) 
                          \
                            1*- x - x (feature/branch-b)
    

    对于更大的修改,我不会使用它。对于这种情况,我问了一个类似的问题here,因为我在之后对 branch-b 进行 PR 时遇到了一些合并冲突。

    如果需要孔分支-a:

                                 3 - 4 (feature/branch-b1)
                               /
                     x - x (feature/branch-a) 
                   /
    (master) x - x  - - - - - - - - - - merged-a (develop)
                                              \
                                                3* - 4* - x (feature/branch-b2)
    

    您可以临时创建一个分支-b1 并继续工作。当开发分支成为功能 a 的 PR 的合并提交时,您可以使用正确的基础启动一个分支 b2。现在我们将 b1 的工作转移到 b2。使用 git cherry-pick &lt;commit3-hash&gt;^..&lt;commit4-hash&gt; 将一个命令中的所有提交从 branch-b1 复制到 b2 就可以了。

    如果有人知道使用git rebase 的更好解决方案,请告诉我。

    【讨论】:

      猜你喜欢
      • 2010-12-04
      • 1970-01-01
      • 2020-12-15
      • 1970-01-01
      • 2017-07-01
      • 2017-07-04
      • 2018-11-18
      • 1970-01-01
      • 2013-12-05
      相关资源
      最近更新 更多