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

Gui*_*ara 19 git git-merge squash

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

我不能使用快进合并,我需要使用--squash参数来分组在另一个分支中进行的大量提交.

谢谢!

R0M*_*RMY 21

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

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

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

--no-ff标志的作用:

即使合并解析为快进,也要创建合并提交.

你本质上是要求git进行提交而不是同时进行提交.

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

a ------ d -- ....
 \      /
  b -- c  
Run Code Online (Sandbox Code Playgroud)

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

a ---- d -- ....
 \      
  b -- c  
Run Code Online (Sandbox Code Playgroud)


Ger*_*obi 6

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

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

因为已经正确回答了。

而是要明确您所追求的确实可以通过稍微不同的方法实现:您将首先重新设置交互式功能分支(例如压缩所有提交),然后您可以git merge --no-ff在 master 上创建分支。


man*_*lds 5

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

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

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

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

  • “我认为这个问题源于对快进的误解。” 更有可能的是,它来自于收到错误“fatal: Not possible to fast-forward, aborting.”,因为在 .gitconfig 中将“merge.ff”设置为“only”,然后收到“fatal: You can不能将 --squash 与--no-ff.` 当尝试使用 `--no-ff` 标志时。 (3认同)
  • @ jpmc26我同意:-) [这里]解决了这个问题(http://stackoverflow.com/questions/36486966/how-can-i-squash-merge-when-merge-ff-only)。简短答案:做git -c merge.ff merge --squash <args> (2认同)