git版本提交后撤销

git版本提交后撤销

在 Git 中,撤销提交主要分两种场景:仅撤销最后一次提交撤销历史中某次提交,核心思路是先处理本地提交,再强制推送到远程覆盖。

场景 1:撤销最后一次提交(最常用)

如果只是想撤销最新的一次提交(包括本地 + 远程),推荐用 git reset 命令,这是最安全的方式。

步骤 1:撤销本地最后一次提交(保留代码改动)

如果你想保留修改的代码(只是撤销提交记录),执行:

bash 复制代码
# --soft 保留代码改动,回到 "已修改但未提交" 状态
git reset --soft HEAD~1

如果你想彻底删除最后一次提交的所有代码改动(谨慎使用),执行:

bash 复制代码
git reset --hard HEAD~1
  • HEAD~1 表示 "上一个版本",HEAD~2 就是上上个版本,以此类推。

步骤 2:强制推送到远程仓库(覆盖远程记录)

本地撤销后,需要强制推送才能同步到远程(远程仓库允许强制提交):

bash 复制代码
git push -f origin 分支名 # 如 git push -f origin master

注意:git push -f 是强制推送,会覆盖远程仓库的提交记录,如果多人协作,请确保团队成员知晓,避免覆盖他人的提交

场景 2:撤销历史中某次提交(非最后一次)

如果要撤销的不是最后一次提交,而是历史中的某次,推荐用 git revert(更安全,不会改写历史):

步骤 1:找到要撤销的提交 ID

先查看提交记录,找到目标提交的哈希值(前 6-8 位即可):

bash 复制代码
git log --oneline # 简洁展示提交记录,格式:[提交ID] [提交信息]

步骤 2:撤销指定提交(生成反向提交)

bash 复制代码
git revert 提交Id # 例如 git revert a1b2c3d4

执行后 Git 会自动生成一个新的提交,内容是 "撤销某次提交的修改",你需要填写提交信息并保存。

步骤 3:推送到远程仓库

bash 复制代码
git push origin 分支名

git revert 不会删除原有提交记录,只是新增一个反向提交,适合多人协作的公共分支,避免改写历史导致冲突

注意事项

  1. 如果远程仓库开启了 保护分支 (如 GitHub/GitLab 的 protected branch),需要先在仓库设置中临时关闭保护,或赋予自己强制推送的权限,才能执行 git push -f
  2. 若已撤销提交但想恢复,可通过 git reflog 查看所有操作记录,找到撤销前的提交 ID,执行 git reset --hard 提交ID 恢复。

情况3:撤销了本地最后一次提交,远端仓库不能强制提交

步骤 1:先恢复本地的提交记录(关键)

因为你已经用 git reset 撤销了本地最后一次提交,现在需要先把本地记录恢复到和远程一致的状态,才能进行后续操作:

bash 复制代码
git pull origin 分支名 # git pull origin main

执行后,你之前撤销的本地提交会被恢复,本地和远程的提交记录重新同步。

步骤 2:用 revert 撤销最后一次提交(生成反向提交)

git revert 会创建一个新的提交,这个提交的内容是 "撤销上一次提交的所有修改",相当于把最后一次提交的代码改回来,但不会删除原有提交记录(因此不需要强制推送):

bash 复制代码
# 撤销最后一次提交(HEAD 代表最新提交,HEAD~1 是上一次,这里直接用 HEAD 即可)
git revert HEAD

执行后会弹出提交信息编辑界面,默认信息是 Revert "你最后一次提交的备注",直接保存退出即可(一般按 Esc → 输入 :wq 回车)。

步骤 3:推送新的 revert 提交到远程

这一步是普通推送,不需要强制,因为只是新增了一个提交,完全符合远程仓库的规则:

bash 复制代码
git push origin 你的分支名  # 例如 git push origin main

示例演示

假设你的提交记录原本是:

tex 复制代码
提交C(最后一次,要撤销) → 提交B → 提交A

执行 git revert HEAD 后,会新增一个提交 D:

tex 复制代码
提交D(Revert 提交C) → 提交C → 提交B → 提交A
相关推荐
Winlifes1 天前
我给 Codex 做了一个 Git 面板:分支树、提交历史和工作区操作
git
郑州光合科技余经理2 天前
同城外卖小程序开发:下单成功后,后台导出能不能对上用户端状态
开发语言·前端·git·后端·uni-app·php·ai编程
我命由我123452 天前
Git 推送报错:error: src refspec main does not match any
运维·git·gitee·github·运维开发·学习方法·版本控制
Lcr3s2 天前
Git基础之(0):如何在Ubuntu(Linux)上安装git
git
玄芯散人3 天前
【筑基·058】Git协作工作流:冲突解决和PR流程
git·版本控制·团队协作
寺中人3 天前
Git 版本控制完全入门指南:从安装到实战,提交 + 分支 + 协作 + 冲突解决全拆解
git·开发工具·版本控制·团队协作·代码管理
荔枝梅梅3 天前
新手程序员 SSH 第一课:从 Git 仓库连接失败理解 SSH 协议与密钥配置
git
玄芯散人3 天前
【筑基·057】Git代码时光机:版本控制入门到分支管理
git·版本控制·嵌入式开发
szephyr4 天前
Git 分支管理实战:feature/release/hotfix 怎么用才不乱
git·分支管理·团队协作·工作流·hotfix
一木 之林4 天前
手搓家庭服务器:二手装机、Docker部署、端口映射与frp内网穿透
服务器·人工智能·git·编辑器