git默认merge不显示详细提交说明是因为它将分支变更视为逻辑单元,仅生成自动生成的合并提交消息;可通过--no-ff配合-m手动编写消息、amend修改或squash and merge预判规则来补充上下文;真正保留完整历史需rebase后快进合并。

为什么默认 merge 不显示详细提交说明
Git 默认执行 git merge 时,只生成一条合并提交(merge commit),其消息是自动生成的,比如 Merge branch 'feature/login'。原始分支上每个 commit 的标题、作者、时间、正文全部丢失,仅作为父提交存在。这不是 bug,而是 Git 的设计:它把整个分支的变更视为一个逻辑单元,而非逐条继承。
用 --no-ff + -m 配合手动写提交消息
想保留“谁在什么时候做了什么”的上下文,关键不是让 Git 自动拼凑,而是主动控制合并提交的内容。最直接有效的方式是:
- 强制创建合并提交(避免快进):
git merge --no-ff feature/login - 立即打开编辑器自定义消息:
git merge --no-ff -m "feat(auth): add login flow\n\n- Refactored session handling (Alice, 2026-07-15)\n- Added OAuth2 callback validation (Bob, 2026-07-18)\n- Fixed CSRF token rotation (Charlie, 2026-07-20)" feature/login - 如果已执行了默认 merge,可以用
git commit --amend -m "..."修改刚生成的合并提交消息(仅限未推送前)
GitHub 上压缩合并(Squash and merge)的说明生成规则
GitHub 的 Squash and merge 按提交数量自动组织消息,但可被仓库管理员配置。你无法绕过这个规则,但能预判输出:
- 单个提交 → 默认用该提交的标题 +
#PR123,正文直接复制原commit message - 多个提交 → 标题用 PR 标题 +
#PR123,正文按时间顺序列出所有被压缩提交的标题(不含正文) - 若想包含正文,必须在 PR 描述里手动汇总,或让维护者开启「标题 + 提交详细信息」策略
真正保留完整历史的唯一方式:不 merge,用 rebase + fast-forward
如果你需要每个原始提交都出现在主分支时间线上(含作者、时间、完整 message),merge 本身做不到——它天生产生新提交。可行路径只有:
- 在
feature分支上持续git rebase main,保持其线性 - 确保
main无新提交干扰(或先git pull --rebase origin/main) - 最后在
main上执行git merge --ff-only feature(即快进) - 此时所有原始
commit直接成为main的一部分,历史完全保留
注意:rebase 会改写提交哈希,已推送的 feature 分支需强制推送(git push --force-with-lease),协作中务必提前同步。











