git revert

文章目录

  • [1. 简介](#1. 简介)
  • [2. 格式](#2. 格式)
  • [3. 选项](#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. 注意)
    • [5.1 `git revert` vs `git reset` 对比](#5.1 git revert vs git reset 对比)
    • [5.2 revert 多个提交的顺序](#5.2 revert 多个提交的顺序)
    • [5.3 revert 合并提交的特殊性](#5.3 revert 合并提交的特殊性)
    • [5.4 撤销 revert(恢复被撤销的提交)](#5.4 撤销 revert(恢复被撤销的提交))
    • [5.5 常用别名设置](#5.5 常用别名设置)
  • [6. 小结](#6. 小结)
  • 参考文献

1. 简介

git revert 用于撤销部分现有提交。

git revert 不会删除历史提交记录,会用一个新的提交来消除历史提交所做的修改。新提交的内容是"反向"的------即撤销指定提交所引入的变更。

git reset 不同,git revert安全的 ,因为它不修改历史,适合用于已推送到远程仓库的公共分支

典型场景:

  • 撤销已经推送到远程的提交
  • 撤销公共分支(如 main)上的错误提交
  • 需要保留完整历史记录的场景

2. 格式

bash 复制代码
git revert [<options>] <commit>...
git revert (--continue | --skip | --abort | --quit)

3. 选项

bash 复制代码
-n, --no-commit
  只暂存撤销的变更,不自动提交(可继续修改或添加其他变更)

-e, --edit
  在提交前编辑提交信息(默认行为)

--no-edit
  不编辑提交信息,直接使用自动生成的默认信息

-m, --mainline=<parent-number>
  指定撤销合并提交时,保留哪个父分支(1 或 2)

--no-commit
  只将变更放入暂存区,不自动提交

--signoff
  在提交信息末尾添加 Signed-off-by 行

--continue
  解决冲突后继续 revert

--skip
  跳过当前提交

--abort
  放弃 revert,恢复到操作前的状态

--quit
  忘记并中断:放弃当前的 revert 操作,但保留工作区和暂存区当前的修改(即冲突解决了一半的状态)

4. 示例

4.1 撤销单个提交

bash 复制代码
# 撤销最近一次提交(会打开编辑器让你修改提交信息)
git revert HEAD

# 撤销指定提交,然后生成一个新的提交
git revert a1b2c3d

# 使用默认提交信息,不编辑
git revert --no-edit a1b2c3d

4.2 撤销多个提交

bash 复制代码
# 撤销多个提交(按顺序从新到旧)
git revert a1b2c3d e5f6g7h

# 撤销一段范围(不包含 A,包含 B)
git revert A..B

4.3 撤销合并提交

bash 复制代码
# 撤销合并提交,需要指定保留哪个父分支
# -m 1:保留第一个父分支(通常是主分支)
git revert -m 1 a1b2c3d

4.4 只暂存不提交

bash 复制代码
# 只将撤销的变更加入暂存区,不自动提交
git revert -n a1b2c3d

4.5 解决冲突

bash 复制代码
# revert 时产生冲突
git revert a1b2c3d
# CONFLICT in main.go

# 手动解决冲突后
git add main.go
git revert --continue

# 或者放弃 revert
git revert --abort

5. 注意

5.1 git revert vs git reset 对比

对比维度 git revert git reset
是否改变历史 ❌ 否(创建新提交) ✅ 是(删除提交)
是否安全用于公共分支 ✅ 是 ❌ 否(会改写历史)
撤销方式 增加反向提交 删除提交
适用场景 已推送的公共分支 本地未推送的分支

与 git reset 的区别主要有:

  • 实现的方式不用。

git revert 使用一次新的提交来回退到指定版本,不会改变历史的提交历史。git reset 移动 HEAD 指针指向历史某次提交,历史提交记录将被改变。因此,git revert 一般用在公共分支上,git reset 一般用在私有分支上。

  • 使用的场景不同。

git revert 一般只用于版本回退,撤销已经提交的更改,并且要求暂存区与工作区是干净的。git reset 一般用于撤销未提交的修改,比如使用 git reset --hard 放弃暂存区与工作区的修改。

5.2 revert 多个提交的顺序

bash 复制代码
# revert 多个提交时,按从新到旧的顺序
git revert HEAD~2 HEAD~1 HEAD
# 等价于先 revert 最新的,再 revert 次新的

5.3 revert 合并提交的特殊性

bash 复制代码
# 合并提交有两个父提交,必须用 -m 指定保留哪个
# 查看合并提交的两个父分支
git show a1b2c3d

# 一般 -m 1 表示保留当前分支(目标分支)
git revert -m 1 a1b2c3d

5.4 撤销 revert(恢复被撤销的提交)

bash 复制代码
# 如果 revert 错了,可以直接 revert 这个 revert 提交
git revert <revert-commit>

5.5 常用别名设置

bash 复制代码
git config --global alias.rv "revert --no-edit"
git config --global alias.rvc "revert --continue"

# 使用别名
git rv a1b2c3d
git rvc

6. 小结

需求 命令 说明
撤销最近一次提交 git revert HEAD 创建反向提交
撤销指定提交 git revert a1b2c3d 撤销该提交的修改
撤销多个提交 git revert a1b2c3d e5f6g7h 按从新到旧的顺序
撤销合并提交 git revert -m 1 a1b2c3d 必须指定 -m 参数
使用默认提交信息 git revert --no-edit a1b2c3d 不打开编辑器
解决冲突后继续 git add . && git revert --continue 继续 revert
放弃 revert git revert --abort 恢复到操作前

一句话总结git revert安全撤销 的命令,它不删除历史,而是创建反向提交。适合撤销已推送到远程 的公共分支。撤销合并提交时必须用 -m 指定保留哪个父分支。


参考文献

Git - git-revert Documentation

相关推荐
爱和冰阔落2 小时前
【Codex项目实战】从模糊需求到可验证交付:Plan、测试、Review与Worktree完整流程
人工智能·git·codex
恋喵大鲤鱼11 小时前
git rebase
git·git rebase
大志哥12316 小时前
idea+git插件+云备份实现项目新分支新建维护
git
恋喵大鲤鱼16 小时前
git merge
git·git merge
码客日记17 小时前
Spring Boot 配置文件敏感信息加密(Jasypt 企业级完整方案)
java·spring boot·git
_codemonster17 小时前
Codex 核心进阶玩法(技能/MCP/派生/分叉/Git/钩子/子智能体)
git
逻极17 小时前
Git 从入门到精通:版本控制协作实战指南
git·github·分支管理·版本控制
恋喵大鲤鱼17 小时前
git clean
git·git clean
Patrick_Wilson18 小时前
为省一次回归测试,该不该把多个改动堆进一条分支?
git·ci/cd·架构