Loading

文章背景图

Git实际问题解决:如何撤销已经推送到远程仓库的提交

2026-03-02
21
-
- 分钟

一、具体方法选择

1. 撤销方法选择图示

二、具体方法说明

1. 方法一:使用 git revert

^d5075f

1.1 简要说明

  • 说明
    git revert会创建一个新的提交,新提交的操作与目标提交的操作完全相反
  • 优点
    git revert不会改变提交历史记录,对团队协作友好
  • 场景
    代码已经推送到远程仓库,并且其他人可能已经下载了代码

1.2 具体使用

1.2.1 撤销一个普通提交
git revert <commit_id>
1.2.2 撤销一个合并提交
git revert -m <branchNumber> <merge_commit_id>

Git 并不知道撤销一个merge提交后回退的目标父节点,通过-m <no>参数可以指定回退目标父版本

  • -m 1:表示保留主干分支(接收合并的分支)的修改
  • -m 2:表示保留被合并分支的修改

[!warning]
通过git revert撤销merge提交后,若想再次合并被撤销的分支,Git 会认为代码已经合并拒绝再次合并,若想再次提交就需要使用git revert撤销掉revert提交

1.2.3 撤销多个连续提交
git revert <commit_id>..<commit_id2>
git revert HEAD~3..HEAD

使用..连接两个版本号可以撤销连续的提交,如HEAD~3..HEAD可以撤销最后3 个提交

1.2.4 撤销多个独立提交
git revert <commit_id> <commit_id2> ..
git revert HEAD~6 HEAD~3 HEAD~1

版本号之间使用空格分隔,可以撤销多个独立的提交

1.2.5 撤销提交后不自动提交
git revert -n <commit_id>

使用-n参数在撤销指定提交后会将代码保存在暂存区,可以检查后再使用git commit提交

2. 方法二:使用 git reset

2.1 简要说明

  • 说明
    git reset会直接把本地分支的指针指向之前的指定提交
  • 优点
    git reset操作后的提交历史非常干净,错误的提交记录直接被删除,不会被保留
  • 缺点
    会改变提交历史记录,会导致其他拉取代码的成员环境出现冲突,提交时需要强制推送

2.2 具体使用

2.2.1 退回并保留后续代码到暂存区
git reset --soft <commit_id>

代码版本退回到<commit_id>对应版本,该提交后续代码进入暂存区,可以修改后重新提交

2.2.2 退回并保留后续代码到工作区
git reset --mixed <commit_id>
git reset <commit_id>

代码版本退回到<commit_id>对应版本,该提交后续代码进入工作区,需要git add后再提交

2.2.3 退回并永久删除后续代码
git reset --hard <commit_id>

代码版本退回到<commit_id>对应版本,该提交后续代码被永久删除

2.2.4 直接强制推送到远程仓库
git push origin <branch_name> --force
git push origin <branch_name> -f

Jetbrains 旗下的 IDE 自带 Git 插件默认会阻止强制推送,需要在 IDE 设置中设置允许强制推送

2.2.5 安全强制推送到远程仓库
git push origin <branch_name> --force-with-lease

安全强制推送会检查在我上次拉取代码之后其他成员是否对远程仓库提交了新代码,若存在其他成员提交的新代码,推送会失败,可以防止意外覆盖其他成员新提交的代码 ^35db5c

3. 方法三:使用 git commit --amend

3.1 简要说明

  • 说明
    git commit --amend会将当前暂存区的改动合并到上一个提交里,生成一个新的提交 ID
  • 优点
    git commit --amend可以很方便的修改上一次提交的错误,且不会污染提交历史记录
  • 场景
    • 修改上一次提交代码中的错误
    • 补充或删除上一次提交的文件
    • 改动上一次提交的提交的备注

3.2 使用教程


使用git commit --amend一般分为三个步骤

  • 修改暂存区的代码
    修改暂存区中的代码,将漏掉、多出的文件或写错的代码更正
  • 合并到上一次提交
    git commit --amend -m "改动后的提交注释"
    git commit --amend --no-edit
    
    通过git commit --amend指令将暂存区改动合并到上一次提交,若不需要改动提交注释,可以使用--no-edit参数沿用上一次提交的提交注释
  • 强制推送到远程仓库
    git commit --amend会更改commit_id从而改变提交历史,所以需要进行强制推送
    git push origin <branch_name> --force
    git push origin <branch_name> -f
    git push origin <branch_name> --force-with-lease
    
    选择合适的参数进行强制推送,--force-with-lease安全强制推送参数

4. 方法四:GitHub 网页撤销 PullRequest

4.1 简要说明

  • 说明
    需要对已经合并的PullRequest进行回退,并且不想在本地命令行操作

4.2 操作步骤

  • 找到指定 PR
    在 GitHub 仓库页面点击 PR 标签,使用 Closed 过滤器,定位到目标合并 PR
  • 点击按钮 Revert
    在页面的下方寻找Revert按钮并点击,GitHub 会自动创建一个新的分支,并在该分支上生成一个“反向修改“的提交(底层就是使用 git revert),随后跳转到一个新的 PR 提交页面
评论交流

文章目录