git revert 2

一、什么是合并提交(Merge Commit)

合并提交是指通过 git merge 命令把一个分支合并到当前分支时产生的特殊提交。它有两个或多个父节点,通常用于整合分支开发成果。例如:

复制代码
A---B---C---E  (master)
     \     /
      D---F    (feature)

合并 featuremaster 后,会产生一个新的合并提交 E,它有两个父节点:C(master)和F(feature)。


二、为何撤销合并提交比较特殊

普通提交只有一个父节点,git revert <commit-hash> 可以直接反向应用。但合并提交有多个父节点,Git 不知道你要保留哪条分支的内容,所以需要额外指定"主分支"(即保留哪一条父分支的内容)。


三、撤销合并提交的命令及参数

1. 基本命令

bash 复制代码
git revert -m <parent-number> <merge-commit-hash>
  • <merge-commit-hash>:你要撤销的合并提交的哈希值。
  • -m <parent-number>:指定主分支的父节点编号(通常是 1)。

2. 如何确定 parent-number?

  • 如果你在 master 分支上合并了 feature,那么合并提交的第一个父节点(parent 1)通常是 master,第二个父节点(parent 2)是 feature
  • 一般撤销合并时,-m 1 表示保留当前分支(master)的内容,撤销被合并分支(feature)的变更。

3. 实例演示

假设你在 master 分支上执行了如下合并:

bash 复制代码
git merge feature
# 产生了一个合并提交 hash 为 abcdef

后来发现合并有问题,需要撤销:

bash 复制代码
git revert -m 1 abcdef

这会生成一个新的提交,内容是把合并分支的变动"反向应用",只保留主分支的内容。


四、撤销合并提交的注意事项

  1. 冲突处理:撤销合并提交时,可能会遇到冲突。需要按照 Git 的提示解决冲突,再提交。
  2. 只撤销合并,不影响主分支历史:revert 合并提交不会删除任何历史,只是新增一个"反向合并"的提交。
  3. 慎用 reset:如果合并提交已经推送到远程仓库,建议用 revert 而不是 reset,否则会破坏团队协作。

五、常见问题与解答

Q1. 如果我不确定 parent-number 应该是多少,怎么办?

可以用如下命令查看 merge commit 的父节点:

bash 复制代码
git log -1 --pretty=raw <merge-commit-hash>

输出中会有 parent <hash> 字段,按顺序分别是 parent 1、parent 2......

Q2. 撤销合并提交后,能再次合并同一个分支吗?

如果你撤销了合并提交,Git 会认为你已经合并过该分支。此时再次合并可能会提示"Already up to date",需要用 --no-ff--allow-unrelated-histories 之类参数。

Q3. 撤销合并提交和普通提交有什么区别?

  • 普通提交只需要 git revert <commit-hash>
  • 合并提交必须指定主分支 -m <parent-number>,否则 Git 会报错。

六、总结

撤销合并提交的正确方式是:

bash 复制代码
git revert -m <parent-number> <merge-commit-hash>
  • -m <parent-number> 指定你要保留的父分支。
  • 适用于已推送远程仓库、团队协作场景。
  • 不会破坏历史,安全可靠。
相关推荐
wxr06162 小时前
GIT学习
git·学习
猫头虎4 小时前
2026最新|GitHub 启用双因素身份验证 2FA 教程:TOTP.app 一键生成动态验证码(新手小白图文实操)
git·开源·gitlab·github·开源软件·开源协议·gitcode
爱学英语的程序员5 小时前
让AI 帮我做了个个人博客(附提示词!)
人工智能·git·vue·github·node·个人博客
liu****6 小时前
git工具
git·python·算法·机器学习·计算机基础
wxr06167 小时前
git无法克隆
git
cooldream20099 小时前
Git 拒绝推送(Push Rejected)问题全解析与解决方案实战指南
git
wxr06169 小时前
GIT无法push
git·gitee
装不满的克莱因瓶11 小时前
【踩坑】IDEA提交Git .gitignore忽略文件不起作用
java·git·.gitignore·踩坑
cos21 小时前
Fork 主题如何更新?基于 Ink 构建主题更新 CLI 工具
前端·javascript·git
OpenMiniServer1 天前
当 AI 成为 Git 里的一个“人”
人工智能·git