Git撤回已经提交(甚至已push)的代码,但把改动留在本地的解决

 更新时间:2026年05月29日 17:23:19   作者:程序员大龙虾  
这篇文章主要介绍了Git撤回已经提交(甚至已push)的代码,但把改动留在本地的解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

这个坑基本每个人都会踩一遍:

刚 commit 完,顺手 push 了。

过了两分钟发现:这提交现在不该上去

但问题是——

代码你还要留着,得继续改,而不是直接删掉。

这篇就讲一件事:

怎么把提交从历史里“抹掉”,但代码还留在本地

公共提交避免使用这个方法,如果你是独立开发,那没问题!!!

先说人话版结论

如果你只是:

  • 刚 push
  • 想撤回最近一次提交
  • 代码还要留着

直接用这两步就够了:

git reset HEAD~1
git push --force-with-lease origin main

执行完:

  • 远端没有这次提交
  • 本地 git log 也没有
  • 代码还在(变成未提交状态)

很多时候,到这一步就结束了。

这两条命令到底干了啥

第一条

git reset HEAD~1

意思是:

把当前分支往前退一个提交

但注意,它不会删你的代码,只是把:

  • commit 里的内容
  • 👉 变回工作区改动

所以你会看到:

  • 文件还在
  • 只是变成“未提交”

第二条

git push --force-with-lease origin main

意思是:

用你当前本地的 main,覆盖远端 main

也就是把刚才“回退后的状态”同步到远端。

如果你更想“精确控制”,可以指定 commit id

有些人不太喜欢这种“当前分支推上去”的方式,更希望明确写:

👉 我要回到哪个提交

那可以用 commit id。

第一步:查 commit id

最简单:

git log --oneline

比如看到:

070505c github page   ← 这个是你想撤回的
ff775f6 first commit  ← 这个是你要回退到的

👉 记住:你要的是前一个“正确提交”的 id

如果想看得更清楚一点:

git log --oneline --graph --decorate -5

第二步:本地回退到这个 id

git reset --mixed ff775f6

效果:

  • 提交记录回退
  • 代码还在
  • 不在暂存区

如果你希望改动还在暂存区:

git reset --soft ff775f6

第三步:远端也强制回退

git push --force-with-lease origin ff775f6:main

这句的意思很直白:

👉 把远端 main 指向 ff775f6

到这里为止,你得到什么

  • GitHub 上看不到那次错误提交
  • 本地历史也没有
  • 代码还在你本地,可以继续改

这就是很多人想要的“撤回但保留代码”。

那什么时候要用“三段式写法”?

你可能见过这种写法:

git reset --hard <commit>
git push --force-with-lease origin <commit>:main
git cherry-pick --no-commit <某个提交>

这套其实是补救方案,不是常规操作。

它通常用于:

  • 你已经 reset --hard 把代码清掉了
  • 或者你想只恢复某一次提交的内容

正常情况下(尤其是刚提交就反悔),用不到这么重。

为什么不推荐用 git revert

很多教程会说用:

git revert

但它做的事情是:

新增一个“反向提交”

也就是说:

  • 原来的错误提交还在
  • 只是多了一次“撤销它”的提交

如果你的目标是:

👉 让这次提交彻底从历史里消失

那就不要用 revert

一个很现实的问题:这操作有风险吗?

有,而且必须说清楚。

因为你用了:

git push --force-with-lease

这叫改写历史

风险 1:可能覆盖别人的提交

如果你 push 之前:

👉 别人已经往 main 提交了新代码

那你这一推,有可能把对方的提交顶掉。

风险 2:别人本地会“乱掉”

你改了远端历史之后:

  • 别人本地还是旧历史
  • pull / push 可能冲突
  • 甚至把你删掉的提交再带回来

怎么尽量安全一点

几个简单建议:

1. 尽量别在多人共用分支乱搞

尤其是 main 正在被多人提交的时候。

2. 一定用这个

git push --force-with-lease

而不是:

git push --force

前者至少会帮你检查远端有没有被别人改过。

3. 操作前看一眼远端

git fetch origin
git log --oneline --graph --decorate --all -10

4. 如果已经被别人用了,别改历史

这种时候更建议:

git revert

最后给你一个记忆版本

如果你只是:

👉 “刚 push,想撤回,但代码要留着”

记这一套就够了:

git reset HEAD~1
git push --force-with-lease origin main

如果你想完全可控(明确回到哪个点):

git log --oneline
git reset --mixed <commit-id>
git push --force-with-lease origin <commit-id>:main

总结一下

这件事本质其实就一句话:

 删的是提交记录,不是代码内容。

理解这一点,Git 基本就通了。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Git 2.27.0详细安装步骤详解

    Git 2.27.0详细安装步骤详解

    这篇文章主要介绍了Git 2.27.0详细安装步骤,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Git撤销命令revert与reset区别全面对比

    Git撤销命令revert与reset区别全面对比

    在Git中git revert和git reset都可以用来撤销更改,但它们的工作方式和影响有很大的不同,这篇文章主要介绍了Git撤销命令revert与reset区别全面对比的相关资料,需要的朋友可以参考下
    2025-12-12
  • 如何给MD5加上salt随机盐值

    如何给MD5加上salt随机盐值

    不知道大家知不知道,在开发的时候如果直接给密码散列,黑客可以通过查散列值字典(例如MD5密码破解网站),得到某用户的密码。但如果加上salt后就会难上很多,即便是你获得了其中的salt和最终密文,破解也是相当麻烦的。下面跟着小编通过这篇文章来一起学习学习吧。
    2016-11-11
  • 阿里开源低代码引擎和生态建设实战及思考

    阿里开源低代码引擎和生态建设实战及思考

    这篇文章主要为大家介绍了阿里开源低代码引擎和生态建设实战及思考,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • 算法系列15天速成 第一天 七大经典排序【上】

    算法系列15天速成 第一天 七大经典排序【上】

    今天是开篇,得要吹一下算法,算法就好比程序开发中的利剑,所到之处,刀起头落
    2013-11-11
  • 判断Email地址是否正确的几个函数(asp/php/javascript)

    判断Email地址是否正确的几个函数(asp/php/javascript)

    今天总结了几个判断Email地址的函数,和大家分享一下
    2010-08-08
  • 一文彻底理清session、cookie、token的区别

    一文彻底理清session、cookie、token的区别

    session和token本质上是没有区别的,都是对用户身份的认证机制,只是他们实现的校验机制不一样而已,下面这篇文章主要给大家介绍了关于session、cookie、token区别的相关资料,需要的朋友可以参考下
    2023-02-02
  • git验证线上的版本是否符合预期

    git验证线上的版本是否符合预期

    当我们想知道部署项目的哪个版本有问题?当我们想知道线上运行的版本是否是我们预期的版本?当我们想把部署的版本与代码进行关联?如果是你用git来做版本管理,那就可以使用git-commit-id-maven-plugin插件来实现上述功能
    2022-07-07
  • HTTP 2.0 详细介绍

    HTTP 2.0 详细介绍

    本文主要介绍 HTTP 2.0的知识,这里整理了详细的资料,并对HTTP2.0的知识做了详解,有需要的小伙伴可以参考下
    2016-09-09
  • 关于target目录在idea没显示的问题

    关于target目录在idea没显示的问题

    这篇文章主要介绍了关于target目录在idea没显示的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11

最新评论