返回博客

git undo 生成器:一句话说出你该敲哪条命令

2026年9月25日

有位同事对每个「撤销」问题的答案都是 git reset —hard,跟另一些人张口就是「重启试试」一个路数。前两次还真管用。第三次搭进去一个周五下午,外加一节没人愿意再上的 reflog 课。本站的 Undo Anything in Git 主题页就是那一周的产物——今天它迎来了一件正经工具。

git undo 生成器上线了:三个问题进去,一条准确命令出来。 不用账号,不上传任何东西——一切都在你的浏览器里运行。告诉它 commit 推没推、改动保不保留、还有没有人拉这条分支,它会打印出正确的 git reset、git revert 或 reflog 抢救步骤,命令会咬人的地方还带警告。

四条命令为什么要做成工具?

因为搜索数据说明:人们要的是答案,不是论文。Google Search Console 显示,本站在「git reset last commit keep changes」上排在第 12.3 位——一周 27 次曝光,零点击。这条查询是在喊「给我命令」,而搜索的人会划走任何让他先读两段的东西。生成器一屏给完答案。

同样的模式在所有变体里重复:「and keep changes」「but keep changes」「keep the file」。人们不是在研究版本控制理论。他们手上有烂摊子,就在此刻,只想要最短的出路。

生成器怎么判断

三个问题,直接来自 revert 对比 reset 指南:

  1. commit 在哪? 没推送、已推送,或者彻底找不到。
  2. 改动怎么办? 保留并暂存、保留不暂存,还是丢掉。
  3. 还有谁拉这条分支? 这个问题区分「干净的改写」和「团队事故」。

共享分支那道题就是整个工具。其余都是便利;那一题是止损。

它的完整答案表:

命令历史工作区共享分支?
git reset --soft HEAD~1回退 1 个改动保留,已暂存否——改写历史
git reset HEAD~1回退 1 个改动保留,未暂存否——改写历史
git reset --hard HEAD~1回退 1 个改动丢弃否——破坏性
git revert HEAD追加一条撤销 commit原样是——安全操作
git reflog + git switch -c recovery <sha>什么都没丢从 reflog 恢复任何事故后的抢救

它打印的命令

生成器覆盖的每一种情况,拿来即贴:

# 已 commit,没推送,保留改动并暂存
git reset --soft HEAD~1

# 已 commit,没推送,保留改动但不暂存
git reset HEAD~1

# 已推送,别人也拉这条分支——唯一体面的撤销
git revert --no-edit HEAD~1..HEAD
git push

# commit 之后找不到了——reflog 还记得约 90 天
git reflog
git switch -c recovery <列表里的sha>

HEAD~1..HEAD 这种区间写法会精确撤销你点名的 commit,而不是一条条重建——就算工具替你敲,这个写法也值得记住。

引擎盖下面

这套逻辑是一张决策表,不是魔法。三个问题给出十八种组合,大部分坍缩成同样几条命令——「没推送+丢弃」和「已推送+分支只有我用+丢弃」只差一个 force-with-lease 尾巴。页面是一条静态路由——没有服务器、没有统计、没有 cookie——所以它在机房里用手机也能打开,那正是大多数 git 事故发生的地方;复制按钮交给你的是带警告注释的完整命令块。

它刻意不做什么

不帮你玩交互式 rebase——如果你在给 commit 排序,你懂的已经比这工具教的多。不做 stash 手术;那有专门的指南。它也拒绝猜:情况是「已推到共享分支」时,它只提供 revert 一条命令,因为其他选项烧的是整个团队。撤销 commit 的长文指南讲清每个 flag 对 reflog 做了什么;工具只是不让你在赶时间时选错。

源码在 github.com/mrsaynothing/git-undo——纯 HTML 和 JavaScript,没有构建步骤,没有依赖。随便 fork、改样式、抄走我的文案。本站版本用 SvelteKit 静态页面跑着同一套逻辑。

如果它今年替你省下一次 reflog 抢救,它做那个下午就值回票价。如果它在你遇到的场景里给了错答案,仓库的 issue 就是为此开的。

FAQ

git undo 生成器是干什么的?

它问三个问题——commit 推送了没有、改动保不保留、还有没有人拉这条分支——然后打印出准确的命令:reset、revert,或者一次 reflog 抢救。

git reset --hard 安全吗?

对从没推送过的 commit 来说是安全的——被丢掉的工作在 git reflog 里大约还能找回 90 天。共享分支上绝不安全:改用 revert。

用这个工具需要账号吗?

不需要。它是一个纯静态页面,全部在你的浏览器里运行——不上传任何东西,也不记录任何东西。

— mrsaynothing

— mrsaynothing

构建、故障,以及真正上线的东西。

在 dev.to 上讨论这篇文章 dev.to ↗

下一篇构建日志,直达邮箱

每篇一封。附证据与错误。

self-hosted · 无第三方 · 一键退订

这是什么?

我的代理把被我锁住的文章发了出去,在线挂了一天

喜欢这些文章?我的本职工作就是这样的工程。 订阅通讯