2013-03-29 37 views
2

我想请教一下Git的合并在以下情形:的Git:维护分支拓扑结构上的合并提交

branchA -*-*-*-*-* 
        \ 
      branchB *-*-*-* 

这是可以做到一个git在这种情况下的合并取得以下结果?

branchA -*-*-*-*-*---------* 
        \  /
      branchB *-*-*-* 

我想获得的是在branchA上有一个合并提交,它包含了branchB的所有更改。 我知道在git merge命令中有--squash选项,但我不确定这是否与标准合并100%相同。

因此,让我来阻止我的分支拓扑和不是只是一个快速发展。

非常感谢您的帮助!

+0

你为什么想这么做?你想达到什么目的? –

+0

我的动机如下:假设branchA是一种主线分支,而branchB是一个开发分支。 branchB上的某些提交可能不会编译/传递测试套件,但最终branchB已准备好进入主线。我想主线上有一个提交,因为它代表完成的工作,同时我可以看到branchB上的历史记录(以防需要时)。 – Tomek

回答

3

尝试git merge branchb --no-ff(来自brancha)。从git-merge(1)

--no-FF

创建一个合并提交即使合并解决的快进。

它可以防止快进,即使混帐认识到当前HEAD(分支A,因为这是在那里你会被合并的形式),也不过是犯分支B的祖先,而没有采取任何改变在分支A上并行放置。

+1

这正是我正在寻找的 - 非常感谢您的帮助! – Tomek

1

不,您不能生成一个真正的合并提交,其中合并了来自分支的所有更改。 git merge --squash会生成一个提交的更改,但它不会是合并提交。

Git在给定时间提交记录仓库的完整状态,而不是来自先前提交的更改。因此,当您稍后在创建提交时检查历史记录时,会生成差异。

但是,如果使用git commit --no-ff branchB创建合并,将确保创建提交,即使可以在不创建新提交的情况下执行快进合并。然后,如果使用git log -m --first-parent,它将忽略在branchB上进行的提交,看起来所有这些更改都是由该合并提交引入的,并且-m选项会导致为合并提交显示完全差异(如果差异为否则会被显示)。

+0

谢谢你的回复!我试过git合并branchB --no-ff,那正是我在找的东西。再次感谢。 – Tomek