Git合并扁平化

Ver*_*gen 40 git git-pull git-merge git-push

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

Jak*_*ski 71

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

git-merge(1):

- 壁球

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


Pat*_*otz 25

您可以使用交互式rebase并"压缩"提交 - 另请参阅Git Ready教程,了解如何通过rebase进行挤压.很抱歉只是转发链接,但这是一个非常全面的教程.哦,这也会压缩你的合并就好了.

  • 交互式变基不是唯一的方法.更简单的方法是简单地"合并--squash",如另一个答案所述.效果(即从分支转储所有更改作为当前分支上的单个差异)将是相同的,但只有一半的工作. (11认同)
  • `git merge --squash branch && git commit -m"message"`的问题在于它实际上并没有将分支标记为已合并.`git branch -d`不会删除它(使用`-D`),图形查看工具会显示刚挂起的分支而不是连接. (5认同)

sam*_*pin 8

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

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

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

git merge --no-ff somebranch -m "my commit message"
Run Code Online (Sandbox Code Playgroud)

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

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

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

git日志输出