为什么我不能使用git merge --squash with --no-ff?

时间:2013-01-14 15:48:02

标签: git git-merge squash

我正在尝试使用git merge --squash和--no-ff参数,但是git不允许。 有人有任何消化帮助我吗?

我无法使用快进合并,我需要使用--squash参数对在另一个分支中进行的大量提交进行分组。

谢谢!

3 个答案:

答案 0 :(得分:20)

它可能不会让你,因为这样的命令没有意义。

--squash的文档说(强调我的):

  

- 壁球
  生成工作树和索引状态,好像发生了真正的合并(合并信息除外),但实际上没有提交或移动HEAD ,也没有记录GIT_DIR / MERGE_HEAD使下一个git commit命令创建合并提交。这允许您在当前分支之上创建单个提交,其效果与合并另一个分支相同(或者在章鱼的情况下更多)。

--no-ff标志确实:

  即使合并解析为快进,

创建合并提交

你实际上是在要求git进行提交而不是同时进行提交。

如果要保留分支的所有历史记录,则应使用--no-ff标记。 提交d是一个包含两个父项的合并提交,a和c。

a ------ d -- ....
 \      /
  b -- c  

如果您希望将该分支上的所有提交视为单个工作单元,请使用--squash提交d是一个常规提交,包含提交b和c的所有更改,但只有一个父级,a。

a ---- d -- ....
 \      
  b -- c  

答案 1 :(得分:5)

--squash做什么? - 它将所有提交压缩在一起,创建索引状态,以便您可以将分支中的所有更改作为单个提交提交。您的代码更改将像您合并分支一样,但您的历史记录将像您做出一个巨大的提交。

--no-ff做什么? - 它说,即使分支可以快进,也可以将其视为合并并创建合并提交。

因此,--squash是关于获取没有合并痕迹的历史记录。 --no-ff是关于强制合并历史记录,即使它正在被转发。因此,它们是互斥的,不能一起使用。

我认为问题源于对fast-forward的误解。它不是合并;它只是将分支直接转发到合并分支的另一个提交,因为提交是直接在前一个分支的提交中进行的。没有快进会停止此行为并强制在顶部进行合并提交。当你在挤压时,如果你要求它不要快进,那就无所谓了。这两种方式都是一样的。

答案 2 :(得分:0)

此答案与您的实际问题无关:

  

为什么不能将git merge --squash与--no-ff一起使用?

因为已经正确回答了。

但是要弄清楚您所追求的确实可以通过稍微不同的方法来实现:您首先rebase interactive进行功能分支(例如,压缩所有提交),然后{{1} }主机上的分支。