Git合并扁平化

时间:2009-04-23 22:08:24

标签: git git-pull git-push git-merge

如果我在一个功能的多个分支上工作,我使用git pull branch1 branch2 branch3将所有更改提取到我的主分支中。但是,也会复制每个分支的所有提交日志。如何将提交日志压缩为单个消息?

3 个答案:

答案 0 :(得分:71)

“git merge --squash”(在“git fetch”之后;“git pull”只是fetch + merge,pehaps它也允许--squash选项)可能是你想要的。< / p>

来自git-merge(1)

  

- 壁球

     
    

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

  

答案 1 :(得分:25)

您可以使用交互式rebase和“压缩”提交内容 - 另请参阅Git Ready Tutorial on squashing via rebase。很抱歉只是转发链接,但这是一个非常全面的教程。哦,这也会压缩你的合并。

答案 2 :(得分:8)

正如Brian White评论git merge --squash的问题是它没有给你任何可见的链接,因此没有可追溯到你合并的分支(或个别更改)。

可见(当被视为图git log --graph)时,一个重新合并的重要分支看起来与你搞砸的实验分支没有什么不同,并且很乐意丢弃。两者都挂在那里没有任何东西。我个人想知道某个分支已经合并,所以我知道工作已经完成。

对我有用的解决方案是使用带有no-fastforward选项的合并。

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

这会强制git创建包含所有分支更改的单个提交,您可以自己设置提交消息(如果需要)但最重要的是,它将新提交链接回刚刚合并的分支。这显然显示该分支上的工作已完成,但也允许您追溯以查看合并分支中各个提交的详细信息。

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

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

git log output