43

如果我在多个分支中处理单个功能,我会使用git pull branch1 branch2 branch3将所有更改拉入我的主分支。但是,每个分支的所有提交日志也会被复制。如何将提交日志扁平化为一条消息?

4

3 回答 3

73

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

git-merge(1)

- 壁球

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

于 2009-04-24T18:26:07.330 回答
28

您可以使用交互式rebase并“压缩”提交 - 另请参阅Git Ready Tutorial on squashing via rebase。很抱歉只给你一个链接,但这是一个非常彻底的教程。哦,这也会很好地消除您的合并。

于 2009-04-23T23:06:01.533 回答
9

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

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

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

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

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

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

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

git 日志输出

于 2015-09-02T11:19:37.380 回答