git undo 生成器:一句话说出你该敲哪条命令
回答三个问题——推没推、改不改动、分支是不是只有你用——git undo 生成器直接给你那条准确的 reset、revert 或 reflog 命令。
有位同事对每个「撤销」问题的答案都是 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 指南:
- commit 在哪? 没推送、已推送,或者彻底找不到。
- 改动怎么办? 保留并暂存、保留不暂存,还是丢掉。
- 还有谁拉这条分支? 这个问题区分「干净的改写」和「团队事故」。
共享分支那道题就是整个工具。其余都是便利;那一题是止损。
它的完整答案表:
| 命令 | 历史 | 工作区 | 共享分支? |
|---|---|---|---|
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 做了什么;工具只是不让你在赶时间时选错。 而当你要在两条撤销命令之间做选择时,git revert vs reset 讲清哪条保得住你的历史。
源码在 github.com/mrsaynothing/git-undo——纯 HTML 和 JavaScript,没有构建步骤,没有依赖。随便 fork、改样式、抄走我的文案。
如果它今年替你省下一次 reflog 抢救,它做那个下午就值回票价。如果它在你遇到的场景里给了错答案,仓库的 issue 就是为此开的。