git merge

文章目录

  • 1.简介
  • 2.格式
  • 3.选项
  • [4. 示例](#4. 示例)
    • [4.1 基础合并](#4.1 基础合并)
    • [4.2 禁用快进合并(推荐团队协作)](#4.2 禁用快进合并(推荐团队协作))
    • [4.3 只允许快进合并](#4.3 只允许快进合并)
    • [4.4 压缩合并](#4.4 压缩合并)
    • [4.5 解决冲突](#4.5 解决冲突)
  • 5.注意
    • [5.1 合并策略对比](#5.1 合并策略对比)
    • [5.2 查看合并历史](#5.2 查看合并历史)
    • [5.3 撤销合并](#5.3 撤销合并)
    • [5.4 常用别名设置](#5.4 常用别名设置)
  • [6. 小结](#6. 小结)
  • 参考文献

1.简介

git merge 用于将两个或多个分支的修改合并到一起。通常用于将功能分支(feature)合并回主分支(main)。

合并时,Git 会根据分支的提交历史自动选择合并策略:

  • 快进合并(Fast-forward):当前分支没有新提交,直接将指针向前移动
  • 三方合并(3-Way Merge):两个分支都有新提交,创建一个新的合并提交

2.格式

bash 复制代码
git merge [<options>] <branch>
git merge (--continue | --abort | --quit)

3.选项

bash 复制代码
--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 基础合并

bash 复制代码
# 切换到目标分支
git switch main

# 将 feature 分支合并到 main
git merge feature

4.2 禁用快进合并(推荐团队协作)

bash 复制代码
# 强制创建合并提交,保留分支历史
git merge --no-ff feature -m "merge feature: 添加用户登录功能"

4.3 只允许快进合并

bash 复制代码
# 如果不能快进则报错(常用于拉取上游更新)
git merge --ff-only origin/main

只允许快进合并的核心使用场景是:当你明确知道当前分支没有新提交,只是想"追上"上游分支的最新代码时,用它来防止意外创建合并提交。

4.4 压缩合并

假设分支历史如下:

复制代码
main:   A---B---C
              \
feature:        D---E---F

普通合并:

bash 复制代码
git switch main
git merge feature

结果:

复制代码
main:   A---B---C---------M
              \           /
feature:        D---E---F
  • M 是合并提交,有两个父提交(C 和 F)
  • feature 的所有提交(D、E、F)都保留在历史中

优点: 完整保留分支历史

缺点: 历史中会包含大量零碎提交(如 fix typo、update 等)

使用 --squash 合并:

bash 复制代码
git switch main

# 将 feature 的所有提交压缩成一个变更
git merge --squash feature
git commit -m "feat: 添加用户登录功能"

结果:

复制代码
main:   A---B---C---S
feature:        D---E---F
  • S 是普通提交,不是合并提交
  • feature 的所有变更被压缩成一个提交 S
  • feature 分支的 D、E、F 提交不会进入 main 历史

优点: 主分支历史保持线性、整洁

缺点: 丢失 feature 分支的详细开发历史

一图看懂:

判断是否使用 --squash 选项最根本的标准是,待合并分支上的历史记录是否有意义。如果没有意义,建议使用 --squash 选项将其废弃。

4.5 解决冲突

bash 复制代码
# 尝试合并时出现冲突
git merge feature
# CONFLICT in main.go

# 手动解决冲突后
git add .
git merge --continue

# 或放弃合并
git merge --abort

5.注意

5.1 合并策略对比

场景 命令 效果
默认合并(可快进) git merge feature 直接移动指针,无合并提交
默认合并(不可快进) git merge feature 自动创建合并提交
强制创建合并提交 git merge --no-ff feature 总是创建合并提交,保留分支历史
只允许快进 git merge --ff-only feature 不能快进时报错
压缩合并 git merge --squash feature 将所有提交压缩为一个变更

5.2 查看合并历史

bash 复制代码
# 查看分支图(直观展示合并关系)
git log --oneline --graph --all

# 查看哪些分支已合并到当前分支
git branch --merged

# 查看哪些分支尚未合并到当前分支
git branch --no-merged

5.3 撤销合并

bash 复制代码
# 撤销最近一次合并(假设还没推送)
git reset --hard HEAD~1

# 如果已推送,使用 revert(保留历史)
git revert -m 1 HEAD

5.4 常用别名设置

bash 复制代码
git config --global alias.mnf "merge --no-ff"
git config --global alias.mffo "merge --ff-only"

# 使用别名
git mf feature
git mffo origin/main

6. 小结

需求 命令 说明
普通合并 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

相关推荐
码客日记1 小时前
Spring Boot 配置文件敏感信息加密(Jasypt 企业级完整方案)
java·spring boot·git
_codemonster2 小时前
Codex 核心进阶玩法(技能/MCP/派生/分叉/Git/钩子/子智能体)
git
逻极2 小时前
Git 从入门到精通:版本控制协作实战指南
git·github·分支管理·版本控制
恋喵大鲤鱼2 小时前
git clean
git·git clean
Patrick_Wilson3 小时前
为省一次回归测试,该不该把多个改动堆进一条分支?
git·ci/cd·架构
恋喵大鲤鱼3 小时前
git blame
git·git blame
yeflx3 小时前
Git操作
git
恋喵大鲤鱼3 小时前
git pull
git·git pull
咖啡星人k4 小时前
MonkeyCode 的 Git 集成:AI编程如何与版本控制无缝协作
git·ai编程·monkeycode