合并分支与干净的历史

Pau*_*per 6 git git-merge git-workflow

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

A - B - C - F - G    (master)
         \
          D - E      (branch-a)
Run Code Online (Sandbox Code Playgroud)

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

A - B - C - F - G    (master)
         \       \
          D - E - H  (branch-a)
Run Code Online (Sandbox Code Playgroud)

最终,我们将要合并回来.

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

什么是我可以合并回主人最干净的方式?

  1. 我想保留个人提交(即没有壁球)
  2. 我将不再使用branch-a,因此提交哈希值可以改变.
  3. 如果可能的话H,我想不包括合并提交(例如L),没有冲突的合并.

理想情况下,它看起来像这样(假设没有冲突):

A - B - C - F - G - I - K - M - N  (master)
         \                     /
          D  -  E   -   J  -  O
Run Code Online (Sandbox Code Playgroud)

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

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


更新:

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

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

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

A - B - C - F - G - I - K - M - D - E - J - O  (master)
Run Code Online (Sandbox Code Playgroud)

从本质上讲,这是一个rebase,但省略了不必要的合并提交.

Fre*_*Foo 0

您可以手动完成此操作,方法是分支E并挑选其他提交到新分支,然后将其合并到master. 变基也是可能的,即做

git rebase C
Run Code Online (Sandbox Code Playgroud)

branch-a。但是,这将从您的功能分支中获取提交master并将它们放在您的功能分支上。

git rebase -i C
Run Code Online (Sandbox Code Playgroud)

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