Git合并扁平化

44
如果我在多个分支上开发同一个功能,我会使用 git pull branch1 branch2 branch3 将所有更改拉取到我的主分支。但是,每个分支的所有提交记录也会被复制。如何将提交记录平铺为单一消息?
3个回答

73

"git merge --squash"(在"git fetch"之后;"git pull"只是fetch+merge,也许它也允许--squash选项)可能是你想要的。

git-merge(1)

--squash

产生工作树和索引状态,就像真正合并发生的那样,但实际上不会进行提交或移动HEAD,也不记录$GIT_DIR/MERGE_HEAD以导致下一个git commit命令创建一个合并提交。这使您可以在当前分支的顶部创建一个单一的提交,其效果与合并另一个分支(或在八爪鱼的情况下更多)相同。


28

您可以使用交互式rebase并“压缩”提交 - 另请参阅通过rebase压缩的Git Ready教程。抱歉只是给您提供链接,但那是一个非常全面的教程。哦,这也可以很好地压缩您的合并。


12
交互式变基并不是唯一的方法。更简单的方法是像另一个答案中提到的那样,只需使用merge --squash命令即可。效果(即将分支的所有更改作为单个差异转储到当前分支)相同,但工作量减少了一半。 - Yuval Adam
5
使用 git merge --squash branch && git commit -m "message" 命令合并分支的问题在于它实际上没有将分支标记为已合并。使用 git branch -d 命令无法移除该分支(需要使用 -D 命令),而图形化查看工具会显示该分支仍旧存在,而不是已经被合并了。 - Brian White

12

正如Brian White所评论的那样,git merge --squash存在的问题在于它没有提供任何可见的链接,因此无法追溯到你合并的分支(或个别更改)。当以图形方式查看(使用 git log --graph)时,已合并回来的重要分支看起来与你随意处理并可以轻松丢弃的实验性分支没有什么区别。两者都悬挂在那里,没有连接到任何东西。我个人想知道某个分支是否已经合并回来,这样我就知道工作已经完成了。

对我有效的解决方案是使用不快进选项进行合并。

git merge --no-ff somebranch -m "my commit message"

这将强制Git创建一个提交,包括所有分支更改,您可以自己设置提交消息(如果需要),但最重要的是,它将新提交链接回刚合并进来的分支。这清楚地显示了该分支上的工作已完成,但也允许您追溯到合并的分支的各个提交的详细信息。

这是一个示例,其中非常简单的分支分别具有一个和两个提交,并已合并回主分支。随后我删除了合并的分支标签,但是分支名称仍然可以在合并提交消息中看到。分支名称应总结更改,如果您想知道包含的确切更改,可以将其追溯到单个提交。这种方法似乎非常适用于简单的项目。

注意:由于它是如此深的蓝色,因此我不得不手动绘制其中一个连接器,因为几乎看不清。

git log output


不确定我的情况是否与你的不同,但这对我没有起作用。它只是执行了一个普通的合并,将要合并的分支中的所有提交都合并在一起,而没有压缩。 - Patrick Goley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接