文章目录
- 1.简介
- 2.格式
- 3.选项
- 4. 示例
- 4.1 基础合并
- 4.2 禁用快进合并(推荐团队协作)
- 4.3 只允许快进合并
- 4.4 压缩合并
- 4.5 解决冲突
- 5.注意
- 5.1 合并策略对比
- 5.2 查看合并历史
- 5.3 撤销合并
- 5.4 常用别名设置
- 6. 小结
- 参考文献
1.简介
git merge用于将两个或多个分支的修改合并到一起。通常用于将功能分支(feature)合并回主分支(main)。
合并时,Git 会根据分支的提交历史自动选择合并策略:
- 快进合并(Fast-forward):当前分支没有新提交,直接将指针向前移动
- 三方合并(3-Way Merge):两个分支都有新提交,创建一个新的合并提交
2.格式
gitmerge[<options>]<branch>gitmerge(--continue|--abort|--quit)3.选项
--ff当前分支完全包含了被合并分支的提交时,应如何处理合并。-ff 是允许快进(默认)。 快进(Fast-Forward) 是 Git 合并时的一种特殊情况:当目标分支(如 main)自创建功能分支(如 feature)以来没有产生新的提交时,Git 只需将 main 的指针直接向前移动到 feature 的最新提交,就像“顺着链条快进”一样,不创建新的合并提交,历史变成一条直线。 --no-ff 禁用快进合并,强制创建合并提交 --ff-only 只允许快进合并,否则报错。--squash压缩合并,将多个提交合并为一个变更(不创建合并提交)--abort中止当前有冲突的合并--quit就地停止:忘记当前合并,不再继续。但保留工作区和暂存区的所有修改(包括冲突和已解决的内容)--continue解决冲突后继续合并-m<msg>为合并提交指定消息 --no-commit 合并但不自动提交(用于进一步调整)--stat显示差异统计,即修改了多少个文件,多少行插入,多少行删除。默认行为 -n, --no-stat 不显示差异统计4. 示例
4.1 基础合并
# 切换到目标分支gitswitch main# 将 feature 分支合并到 maingitmerge feature4.2 禁用快进合并(推荐团队协作)
# 强制创建合并提交,保留分支历史gitmerge --no-ff feature-m"merge feature: 添加用户登录功能"4.3 只允许快进合并
# 如果不能快进则报错(常用于拉取上游更新)gitmerge --ff-only origin/main只允许快进合并的核心使用场景是:当你明确知道当前分支没有新提交,只是想“追上”上游分支的最新代码时,用它来防止意外创建合并提交。
4.4 压缩合并
假设分支历史如下:
main: A---B---C \ feature: D---E---F普通合并:
gitswitch maingitmerge feature结果:
main: A---B---C---------M \ / feature: D---E---F- M 是合并提交,有两个父提交(C 和 F)
- feature 的所有提交(D、E、F)都保留在历史中
优点:完整保留分支历史
缺点:历史中会包含大量零碎提交(如 fix typo、update 等)
使用 --squash 合并:
gitswitch main# 将 feature 的所有提交压缩成一个变更gitmerge--squashfeaturegitcommit-m"feat: 添加用户登录功能"结果:
main: A---B---C---S feature: D---E---F- S 是普通提交,不是合并提交
- feature 的所有变更被压缩成一个提交 S
- feature 分支的 D、E、F 提交不会进入 main 历史
优点:主分支历史保持线性、整洁
缺点:丢失 feature 分支的详细开发历史
一图看懂:
判断是否使用--squash选项最根本的标准是,待合并分支上的历史记录是否有意义。如果没有意义,建议使用--squash选项将其废弃。
4.5 解决冲突
# 尝试合并时出现冲突gitmerge feature# CONFLICT in main.go# 手动解决冲突后gitadd.gitmerge--continue# 或放弃合并gitmerge--abort5.注意
5.1 合并策略对比
| 场景 | 命令 | 效果 |
|---|---|---|
| 默认合并(可快进) | git merge feature | 直接移动指针,无合并提交 |
| 默认合并(不可快进) | git merge feature | 自动创建合并提交 |
| 强制创建合并提交 | git merge --no-ff feature | 总是创建合并提交,保留分支历史 |
| 只允许快进 | git merge --ff-only feature | 不能快进时报错 |
| 压缩合并 | git merge --squash feature | 将所有提交压缩为一个变更 |
5.2 查看合并历史
# 查看分支图(直观展示合并关系)gitlog--oneline--graph--all# 查看哪些分支已合并到当前分支gitbranch--merged# 查看哪些分支尚未合并到当前分支gitbranch --no-merged5.3 撤销合并
# 撤销最近一次合并(假设还没推送)gitreset--hardHEAD~1# 如果已推送,使用 revert(保留历史)gitrevert-m1HEAD5.4 常用别名设置
gitconfig--globalalias.mnf"merge --no-ff"gitconfig--globalalias.mffo"merge --ff-only"# 使用别名gitmf featuregitmffo origin/main6. 小结
| 需求 | 命令 | 说明 |
|---|---|---|
| 普通合并 | git checkout main && git merge feature | 默认行为 |
| 强制创建合并提交 | git merge --no-ff feature | 保留分支历史,推荐团队协作 |
| 只允许快进 | git merge --ff-only upstream/main | 避免意外合并提交 |
| 压缩合并 | git merge --squash feature | 保持主干历史整洁 |
| 中止冲突合并 | git merge --abort | 安全退出冲突状态 |
| 解决冲突后继续 | git add . && git merge --continue | 继续合并 |
一句话总结:git merge用于将不同分支的工作整合到一起。推荐团队协作使用--no-ff保留分支历史;遇到冲突时用--abort安全退出;合并前先用git branch --merged确认分支状态。
参考文献
Git - git-merge Documentation