git如何合并旧的featurebranch?

时间:2018-04-03 22:44:59

标签: git

我正在考虑将旧的featurebranch合并回master。在提交给master时,该功能基本上落后了,因此在合并时会有很多潜在的冲突。我可以打开2个编辑器并手动选择更改为master。不熟悉git足以知道git中是否有方法来管理它。因此,为了澄清样本,当我分支出这个特征时,主人看起来像这样:

A-B-C

现在我的功能如下:

A-B-C-F-G-H-K

和主人:

A-B-C-D-E-L-M-N

所以看起来主人已经改变了很多(我应该更频繁地合并)。 有没有办法使用git所以我可以很容易地合并/应用F,G,H,K在N之后提交回master?

3 个答案:

答案 0 :(得分:0)

合并冲突并不一定正确。您将在何时向master创建拉取请求时知道。根据您所做的工作类型,可能没有明显的问题风险。

有几种方法可以将新提交从master提交到您的分支。

  1. 您可以将master合并到您的功能分支中。它很简单,而且大多数人这样做,但它不是首选的选项,除非你总是将合并压缩成主,因为它会使历史不必要地变得混乱。
  2. 您可以从功能分支git rebase --onto master C。这将起作用,但是你可以进入一个极其令人沮丧的情况,即每个提交都有自己的个体冲突,即使净变化很小。你得到的提交越多,这就越糟糕。
  3. 您可以先使用git rebase -i C然后git rebase --onto master C压缩您的更改。这提供了变基的优势,但只有一个提交来重新定义流程要快得多。
  4. 您可以执行压缩合并到主控,然后将您的功能分支设置为。

    git checkout origin/master // checks out master as detached head
    git merge --squash mybranch // merge mybranch as one squashed commit
    git checkout -B mybranch // sets feature to the detached head and checkout
    

    这种方法的优点是避免了使用rebase压缩提交的相当手动的过程。如果没有冲突,它只需要几秒钟,并且它会在一个独立的头上安全地进行,因此在您满意之前不要更改分支。

  5. 如果您只提交了一些提交,则选项2是理想选择。随着越来越多的提交和更多冲突的处理,选项3和后续4更直接。此外,选项1和4是唯一能够在历史记录中进行合并提交时轻松工作的选项。

答案 1 :(得分:0)

就个人而言,我更喜欢重新分支而不是合并分支,因为提交历史看起来更清晰而没有过多的合并提交。

假设您的功能分支是私有分支(重新分配共享分支通常不是一个好主意),那么我想要的是重新分支分支。在您的示例中,这将产生提交历史记录A-B-C-D-E-L-M-N-F'-G'-H'-K'

git checkout feature
git rebase master

但是,之前你可以启用" git rerere"功能(重新成员重新有线重新解决方案)。

git config --global rerere.enabled true

此功能可以使git识别重复的类似合并冲突场景,并自动应用以前的合并冲突解决方案。 即您必须解决一次合并冲突,但第二次发现类似的合并冲突时,您的先前解决方案将自动应用。您仍然应该检查自动解决方案是否正常,并在rebase完成时运行一系列自动化测试(如果可用)。

在开始使用git rerere之前,我建议您仔细阅读git rerere documentation

答案 2 :(得分:0)

这里有四个选项:

  1. 你刚刚合并。你真的尝试过吗?如果你没有,那么,如果你认为你没有解决冲突,你仍然可以中止这个过程。

    那就是说,我更喜欢设置

    git config --global merge.conflictstyle diff3
    

    这样我总能看到基本版本以及git生成的冲突标记中的两个相互冲突的更改。在整理合并冲突时,这是一个巨大的帮助。

  2. 您可以逐步合并。如果1.由于基本上所有内容都与所有内容冲突而无效,则可能需要将合并分成几个阶段。查看master的历史记录,找到一个合适的开发块(在分支点和当前master之间的一些旧提交),并将其合并到您的功能分支中。除非您尝试一次合并太多,否则合并应该相对容易。冲洗并重复,直到您成功将当前master提交合并到功能分支中。之后,您可以简单地将主人快进到合并。

  3. 您可以重新设置功能分支。 2.替代2.是将功能分支重新绑定到当前主分支。这将强制您将每个单独的功能提交与整个master开发合并,但至少,您只需要一次担心单个功能分支提交。作为一个额外的好处,这允许您提供“干净”的历史记录,其中所有功能提交一个接一个地出现而没有任何合并。

    请注意,这将创建 new 提交来代替原始提交。确保测试所有这些,因为使用rebase创建无意义的提交相对容易。

  4. 您逐步修改功能分支。如果您的合并冲突仍然过于方法3,则可以将其与方法2结合使用:反复将功能分支重新绑定到更新的master历史上较新的提交。这很乏味,但它可能是完成这项工作所需的经典。请务必先尝试不那么繁琐的方法。