git:合并分支并使用有意义的合并提交消息?

51

当我将一个特性分支合并回主分支时,通常默认需要进行一次合并提交。但是我想在这个提交中使用我的特性分支中的原始提交消息,而不是“合并分支XXX”。

我应该怎么做呢?

5个回答

109

只需将-m--no-ff参数传递给merge命令:

$ git merge other-branch -m "Commit Message" --no-ff

需要使用--no-ff参数,以防止快进合并而不产生合并提交。


这样做会将新消息作为“提交消息”而不是复制功能分支提交消息吗? - Ricky-U
它将作为单独的提交执行合并操作(如果可能,则不进行快进),并使用该消息作为提交消息。 - Joe Zim
2
还需要一个 --no-ff 命令。没有它,就不会有合并提交信息。所以这样做: git merge --no-ff other-branch -m "提交信息" - TinaTT2

19
你基本上有两个选择。
简单解决方案:不要合并,变基 将你的分支变基到主分支之上,解决冲突,然后再合并。由于你会拥有一个直线历史记录,所以你可以快进合并,这不会创建任何合并提交。
git checkout feature
git rebase main
# Resolve conflict if there is
git checkout main
git merge feature

第二个选项:交互式变基 您可以在合并后(推送到远程之前)编辑您的历史记录。您可以使用交互式变基模式来管理此操作。
git checkout main
git merge feature
#You merge and resolve conflict
git rebase -i <sha of the commit before the merge>

然后您将进入一个交互式 Shell,显示提交的列表,例如:

pick 73c991e Create progress bar module
pick b8a0b83 merge branch feature
pick 2120f47 Add user form
pick 70c55e4 Quiz prototype system

你只需要用squashs代替pick

pick 73c991e Create progress bar module
pick b8a0b83 merge branch feature
s 2120f47 Add user form
pick 70c55e4 Quiz prototype system

这个命令会将b8a0b832120f47合并。接下来会进入提交文本编辑器,其中包含两个提交消息的组合,现在你需要正确地编辑它们,只保留原始消息。

1
谢谢。我经常在单个分支中使用Squash来合并提交。但是我不知道合并的提交也可以被压缩。感谢这个提示。 - kakyo
转念一想,我很好奇为什么要选择rebase而不是merge。除了它不能提供正确的信息外,我对merge所做的一切都非常满意。我发现我可以使用“git ci --amend”来更改它。根据这篇文章:https://dev59.com/BXRA5IYBdhLWcg3w2xwI,rebase会更改我分支出功能分支的历史记录。我希望保留那个历史。 - kakyo
1
然后,您还可以使用 git rebase -i 编辑提交消息。不要使用 squash,只需使用 edit。我不是 Git 中保留历史记录的忠实支持者,对我来说,Git 是一个编辑器,用于编写项目历史记录,使其有意义且易于使用(例如 bisect)。因此,我广泛使用 rebase 来保持我的历史记录整洁和有用;这可能不是您的观点,但我相信最终您会接受它。 - Simon Boudrias

8
如果提交已经完成,您只需修改提交,具体方法请参考修改提交信息
如果在提交之前,请使用类似下面示例的git merge命令:
$ git checkout mainBranch
$ git merge featureBranch --squash --no-commit

您可能需要解决冲突。

这种方法避免了自动提交,所有文件都留在索引中;因此,您可以使用任何想要的提交消息提交代码。


6

在执行合并提交之后,我发现可以添加一次修订提交“git ci --amend”来更改提交消息,这正好满足了我的要求。我将接受自己的答案作为正确的答案。

Simon Boudrias和ranendra给出了相关的答案,在不同的方式上也是有效的。所以我投了赞成票。


4
当主分支和本地分支中有不同的变更集时,git会自动为merge创建一个额外的提交。如果想要阻止这样的额外提交,请在将分支合并到主分支之前,在分支中对主分支进行rebase
$ git pull(in master which retrieves the new changes>
$ git checkout <local_branch>
$ git rebase master 
$ git checkout master
$ git merge local_branch.

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