我正在尝试使用git merge --squash和--no-ff参数,但是git不允许。 有人有任何消化帮助我吗?
我无法使用快进合并,我需要使用--squash参数对在另一个分支中进行的大量提交进行分组。
谢谢!
答案 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} }主机上的分支。