直到今天,我 git 一直在添加我提交消息Merge branch 'name_of_branch' into 'name_of_branch'
。它还添加了一个超级酷的冲突列表。但是现在,当我合并具有冲突的分支时,消息不再存在。
如何重新启用它?
我想做更多与这里问的相反的事情 如何避免"合并提交消息中的分支'name_of_branch'?
任何git merge
都会为最终提交设置默认日志消息。 "默认默认值",即,如果您不使用自己的默认值或显式内容覆盖内置默认值,则得到什么,包括1个分支名称,除非合并到master
中时它只包含一个非master
分支名称。
但是,实际消息本身取决于几个项目(我已经提到过其中一项):
- 您是自己跑
git merge
,还是让git pull
为您运行? - 您是否使用了
--squash
选项? - 是否使用远程跟踪分支名称进行合并?
- 当前分支是否名为
master
? - 您是否使用了
--log
选项,或者将merge.log
配置为整数值或true
? - 您是否在配置中设置了
merge.branchdesc
?
另请参阅git fmt-merge-msg
文档以及git merge
文档。
如果您以交互方式编辑合并消息(这是默认设置),则有机会根据自己的喜好对其进行修改。 您的prepare-commit-msg
和commit-msg
钩子也有机会修改消息;请参阅 Githooks 文档。git interpret-trailers
命令在提交消息挂钩中也可能很有用(请参阅文档中的示例)。
1"All",表示章鱼合并;但大多数合并只涉及两个分支名称。 当然,当使用原始提交哈希时,没有可用的分支名称。
> 使用 Git 2.35(2022 年第 1 季度)应该更容易:由"git merge
">(man)准备的默认合并消息记录当前分支的名称; 现在可以使用新选项覆盖该名称,以允许用户假装在不同的分支上进行合并。
参见提交 bd2bc94 (2021 年 12 月 20 日) 由 Junio C Hamano (gitster
).
(由 Junio C Hamano 合并 --gitster
-- 在提交 bb14cfd 中,2022 年 1 月 5 日)
merge
:允许假装合并到不同的分支中
当
topic-B
的一系列补丁依赖于具有topic-A
时,准备topic-B
分支的工作流程将如下所示:$ git checkout -b topic-B main $ git merge --no-ff --no-edit topic-A $ git am <mbox-for-topic-B
当
topic-A
更新时,重新创建第一次合并并重新定位topic-B
的其余部分,全部在分离的 HEAD 上,是一种有用的技术.
用新一轮补丁更新topic-A
后:(0) $ git checkout topic-B (1) $ prev=$(git rev-parse 'HEAD^{/^Merge branch .topic-A. into}') (2) $ git checkout --detach $prev^1 (3) $ git merge --no-ff --no-edit topic-A (4) $ git rebase --onto HEAD $prev @{-1}^0 (5) $ git checkout -B @{-1}
这将:
- (0) 查看当前
topic-B
。- (1)找到之前将
topic-A
合并为topic-B
。- (2) 将 HEAD 分离到上一个合并的父级。
- (3) 将更新的
topic-A
合并到其中。- (4) 重新应用补丁以重建
topic-B
的其余部分。- (5) 使用结果更新
topic-B
。而不会过多地污染
topic-B
的 reflog。
topic-B@{1}
是topic-A
更新之前的"逻辑上"状态,例如.
在(4),比较(例如range-diff
) 在HEAD
和@{-1}
之间是检查结果的有意义的方法,同样可以在 (5) 通过比较topic-B
和topic-B@{1}
来完成。但是有一个小故障。
在上面的步骤(3)中完成的合并到分离的HEAD中给了我们"
Merge branch 'topic-A' into HEAD
",并且没有说"into topic-B
"。教"
--into-name=<branch>
"选项到"git merge
">(man)及其底层的git fmt-merge-message,假装我们正在合并到<branch>
,无论我们实际上合并到哪个分支,当他们准备合并消息时。
git fmt-merge-msg
现在在其手册页中包含:
'git fmt-merge-msg' [-m ] [--in-name] [--log[=] | --no-log]
--into-name <branch>
准备合并消息,就像合并到分支
<branch>
一样, 而不是要合并到的实际分支的名称。
git merge
现在在其手册页中包含:
--into-name <branch>
准备默认合并消息,就像合并到分支一样
<branch>
,而不是其实际分支的名称 合并完成。