不使用提交日志合并Git分支

61

目前,当我使用Git时,我为每个工作创建一个分支,在完成之前进行各种提交。然后将其合并回主分支并推送到远程。我可能会同时有几个分支,并且在任务进行时也会在它们之间切换。

但是,这些提交大多数只是保存点,即在整体上并不那么重要。因此,当我合并分支时,希望分支日志没有与主日志合并。

是否有一种方法仅合并下面提交(g)的日志消息(而不是提交c或e)?

a [master] 
|
b (create branch 'job')
|\
| \
|  c 
|  |
d  e
|  |
f  g (next step is to merge 'job' branch with 'master')

我想在这个问题上补充一点:是否有办法让 git log 仅显示不来自中间提交(如 ce)的消息? - Eric O. Lebigot
1
@EOL:除非我误解了你的意思,否则--first-parent选项(由knittl提到)正是这样做的。对于合并提交,第一个父提交来自被合并的分支,而第二个父提交来自合并的分支,因此遵循第一个父提交(通常)意味着有效地遵循您所在的分支的历史记录。 - Cascabel
@Jefromi:感谢您指出这一点。实际上,我想表达的是相反的意思:如何从“git log”中隐藏d?(我的设置是将分支合并为Python 2.6版本,因此合并到分支日志不是很有趣。) - Eric O. Lebigot
3个回答

95

我认为在使用“每个功能一个分支”的方法时,merge --squash非常有用。我在临时分支中的提交历史是一堆垃圾,完全没有意义。我真的不想再看到那些历史记录了,而不仅仅是跳过它们。

当提交进行代码审查时,重要的是不要创建额外的提交。


1
我必须同意。如果您一直将提交推送到远程服务器作为WIP分支,则无法进行变基并修复历史记录。对于小型功能分支,这是完全合法的。 - Razor
没错,这是中等规模团队中非常常见的工作流程。 - oxfn
据我所知,您只是陈述了自己的观点。您没有回答OP的问题:“有没有一种方法可以仅合并下面提交g的日志消息(而不是提交c或e)?” - jww
5
答案是“合并 --squash”,这就是原帖作者正在寻找的。其他单词是为了解释为什么“合并 --squash”不像许多人认为的那样总是“有害”的而添加的。 - Ellioh

25
有,但那是胡说八道。你为什么要这样做呢?你会失去所有分支的历史和信息。
你可以使用`g`的提交信息作为合并提交,并使用`--first-parent`选项浏览历史记录。
如果你真的想要删除分支的历史记录,可以使用`git merge --squash`,但我不建议这样做。
编辑:
如果你不满意是因为你认为你的历史记录不够清晰,你可以使用Git的rebase功能
你可以回溯性地编辑(实际上,旧的提交仍然存在,你只是创建了看起来像旧的提交的新提交)旧的提交,并从现有的分支创建新的提交(实际上是重写它)。它允许你修改提交信息,拆分提交,将提交压缩为一个提交,重新排序提交等。
只有在你还没有发布你的分支(即它只是一个私有分支)时,才应该使用rebase,因为它会给其他开发人员带来麻烦,并且可能导致合并问题,如果有人继续在旧的(rebase之前的)分支上工作。

2
@Adam:我完全同意knittl的观点;你不应该使用merge --squash,而是应该使用log --first-parent来避免查看合并的提交。如果你想先清理一下,git rebase -i(--interactive)确实是一个好方法——我相信你会发现它非常直观。你可以阅读文档,但第一次尝试它(例如git rebase -i <commit-g>^ job),你应该很清楚你可以做什么。只是不要在已发布的分支上使用它! - Cascabel
12
我认为使用“合并--压缩”是完全合理的,实际上这也是我在与提问者一样的情况下所使用的:当你本地分支上的大多数提交只是“保存点”,没有特殊需要共享的内容时。 - joachim
3
如果保留完成工作的分支,您就不会失去提交历史记录。当您将一个分支合并回主分支,并且这些提交与其他人的提交合并在一起时,如果需要回到中间的某个先前提交并成功编译,那么情况就变得很困难了。 - Steve Warren
3
"--squash" 好还是坏 - 取决于团队的工作流程。当使用“特性分支”方法时,在特定分支中保留详细历史记录,而 "master" 分支仅保留合并历史记录。 - oxfn
4
为什么会想让像“修复在开发分支上发生的内存错误”这样的信息出现在主分支上,而主分支从未遇到过它呢?不准确的日志会成为审计和认证方面的噩梦。答案是有,但那只是无意义的话语。 - jww
显示剩余5条评论

4
如 "修剪GIT提交记录/压缩GIT历史记录" 中所述,如果您的提交ce带有以fixup!为前缀的注释,则rebase --interactive --autosquash(git1.7+,2010年2月)可以完全满足您的需求。

使用fixup!指令,您可以在提交消息中保持压缩“不可见”,同时仍然从--autosquash选项的自动提交重新排序中受益。

要使用fixup!前缀进行提交,您可以定义别名。

[alias]
    fixup = !sh -c 'git commit -m \"fixup! $(git log -1 --format='\\''%s'\\'' $@)\"' -
    squash = !sh -c 'git commit -m \"squash! $(git log -1 --format='\\''%s'\\'' $@)\"' -
< p > "fixup"别名将适用于那些“提交(它们)只是保存点,即在大局上不那么重要”的情况。


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