32

我正在尝试将 git merge --squash 与 --no-ff 参数一起使用,但 git 不允许。有人有什么建议可以帮助我吗?

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

谢谢!

4

4 回答 4

34

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

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

--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  
于 2013-01-14T16:02:09.447 回答
10

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

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

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

我认为这个问题源于对fast-forward. 这不是合并;它只是将一个分支直接从合并的分支转发到另一个提交,因为提交是直接在前一个分支的提交上进行的。没有快进会阻止这种行为并强制在顶部进行合并提交。当你在挤压时,如果你要求它不要快进也没关系。无论哪种方式都是一样的。

于 2013-01-14T16:16:48.910 回答
6

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

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

因为已经正确回答了。

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

于 2019-05-22T07:10:26.987 回答
1

使用以下命令查看您的 GIT 配置:

git config --global -l
git config --local -l

如果它包含merge.ff=false,将在您的git squash命令中假定 --no-ff 选项,从而导致上述问题。您可以使用以下命令从配置中删除此选项:

git config --global -unset merge.ff
git config --local -unset merge.ff

或直接编辑您的 .gitconfig 文件。

于 2020-05-07T07:19:37.820 回答