合并分支与干净的历史

时间:2014-03-10 15:42:44

标签: git git-merge git-workflow

我正在与主人一起工作(和其他人一起)。

A - B - C - F - G    (master)
         \
          D - E      (branch-a)

我们会定期将master合并到分支中,以便以后最大限度地减少冲突。

A - B - C - F - G    (master)
         \       \
          D - E - H  (branch-a)

最终,我们希望合并回来。

A - B - C - F - G - I - K - M - N  (master)
         \       \       \     /
          D - E - H - J - L - O    (branch-a)

我可以合并回主人的最简洁方法是什么?

  1. 我想保留个人提交(即没有壁球)
  2. 我将不再使用branch-a,因此提交哈希值可能会发生变化。
  3. 我希望不包含合并提交(例如HL),以便在没有冲突的情况下进行合并。
  4. 理想情况下,它看起来像这样(假设没有冲突):

    A - B - C - F - G - I - K - M - N  (master)
             \                     /
              D  -  E   -   J  -  O
    

    关于如何做到这一点的任何想法?

    (仅供参考,这是关于我的工作流程的问题。如果我之前应该做其他事情,这也是一个合理的答案。)


    更新

    在考虑了这个之后,我意识到这通常是不可能的。

    例如,如果J更改了G更改的行,则无法获取该历史记录。

    下一个最好的选择是拥有这段历史:

    A - B - C - F - G - I - K - M - D - E - J - O  (master)
    

    基本上,这是一个rebase,但省略了不必要的合并提交。

2 个答案:

答案 0 :(得分:0)

您可以手动执行此操作,方法是将E分开并将其他提交挑选到新分支中,然后将其合并到master中。重新定位也是可能的,即做

git rebase C
<{1>} branch-a。但是,这将从master提交并将它们放在您的功能分支上。

git rebase -i C

具有相同的效果,但允许您跳过不属于master的提交,branch-a不需要提交。 Git通常无法知道提交是否以任何方式进行交互(例如,对一个文件的更改可能需要更改master上执行的不同文件),因此没有故障安全,全自动解决此问题的方法

答案 1 :(得分:0)

将master合并到工作分支时可以执行此操作

 git pull --rebase

在您的工作分支上完成提交并且您希望将代码从master提取到您的分支中。您还可以通过执行

将此行为配置为某些分支上的默认行为
git config branch.master.rebase true

这将确保您的提交始终重新应用,因此您的历史记录显示为线性。也就是说,当你最终提出拉取请求时,你的提交将位于顶部,并且历史记录将是干净的,没有不必要的合并提交污染它。另一个优点是,如果您想要保持两个或多个分支同步,则更容易挑选。