自学教程 学编程从这里开始

Git reset revert

git revert 命令

核心:git revert 不会删除原有提交历史,而是新建一个提交,用来抵消目标 commit 的改动;适合已经推送到远程、多人协作的公共分支撤销代码。
对比 git reset:reset 是移动指针、抹掉历史;revert 是追加反向提交、保留完整历史。参见 git rest 。

revert 基础用法

# 撤销指定的一次提交(生成一个新commit)
git revert <commit-id>

示例流程:

echo "1" > demo.txt
git add demo.txt
git commit -m "v1"

echo "2" >> demo.txt
git add demo.txt
git commit -m "v2"

echo "3" >> demo.txt
git add demo.txt
git commit -m "v3"

# 撤销 v2 这一次提交,v1、v3 还在历史里,新增一个反向提交
git revert 第二个commit的hash

执行后:

  • 原来的 v1、v2、v3 记录依然存在
  • 自动生成一条新 commit,内容是把 v2 的改动删掉
  • 可以正常 git push,不会破坏其他人的仓库

撤销连续多个提交(–no-commit 批量)

# 撤销从 commitA 到 HEAD 这一段所有提交(左开右闭)
git revert --no-commit commitA..HEAD
# 手动检查文件,然后统一提交
git commit -m "revert: 批量撤销多次改动"

--no-commit:只把改动放到暂存区,不自动生成commit,适合批量撤销、中途调整。

撤销合并提交(-m 参数)

merge 提交有两个父节点,revert 合并提交必须指定 -m 1(保留第一条主线)

git revert -m 1 <merge-commit-id>

重点:revert 合并提交 ≠ 回到合并前;它只是抵消这次合并带来的代码改动,分支历史还在。后续如果要重新合并,需要注意:被 revert 过的分支,再次合并时原来的代码变更不会自动回来,需要先 revert 这个 revert。

revert 冲突处理

和普通merge冲突一样:

  1. 出现冲突,暂停 revert
  2. 手动修改文件解决冲突
  3. git add 冲突文件
  4. git revert --continue 完成

    如果不想继续撤销:
git revert --abort

git reset vs git revert 对比表

项目git resetgit revert
原理移动 HEAD 指针,删掉后面的提交新建反向提交,抵消改动,历史不变
提交历史会改写历史历史完整、新增提交
远程公共分支❌ 不推荐(需要强推,容易炸队友)✅ 推荐,安全
本地未推送分支✅ 很方便✅ 也能用,但没必要
操作后pushgit push -f 强制推送(危险)正常 git push
冲突只有 reset 到目标版本,不会产生合并冲突撤销改动时可能产生冲突

三种场景怎么选

  1. 提交还在本地,没有push到远程 → 优先 git reset
    • 想改备注、合并几次commit:reset --soft
    • 撤销commit,代码保留:默认 reset --mixed
    • 彻底不要代码:reset --hard
  2. 已经推送到远程,多人共用分支 → 必须 git revert
  3. 只需要取消add,不回退commit → git reset HEAD 文件名

配套示例:同一个需求两种方式演示

初始提交顺序:A → B → C,现在想去掉C

方式1:reset(本地未推送)

git reset --hard B
# 历史:A → B,C直接消失

方式2:revert(已推远程)

git revert C
# 历史:A → B → C → revert-C,C还在记录里

高频坑点

  1. revert 一个 revert:

    如果你之前 git revert C,现在想把C的代码恢复回来,直接 revert 那条 revert 的commit,改动就回来了。
git revert revert-C的hash
  1. 不要用 reset –hard + push -f 在 main/master / 公共开发分支;个人私有分支可以酌情使用。
  2. reset 带文件路径:只撤销暂存,不移动HEAD,和 revert 完全不是一类用途。

一句话速记

  • reset:擦掉历史,时光倒流(本地私用)
  • revert:新增一张抵消单据,历史留痕(公共分支安全回退)
标签:

0 条笔记