sublime text不内置git回退功能,需依赖gitsavvy等插件调用命令行git;确保已安装git、path配置正确、项目根目录含.git;常用操作包括mixed reset撤回未push提交、revert抵消已push提交、restore取消暂存。

Sublime Text里git revert和git reset根本不能直接点出来
Sublime Text本身不内置Git回退逻辑,所谓“Sublime Git插件”(如GitSavvy或老版SublimeGit)只是把命令行Git封装成菜单项。你看到的「Revert」或「Reset」选项,本质是调用git revert或git reset --mixed等命令,背后仍依赖本地Git可执行文件和当前工作区状态。
这意味着:没装Git、PATH没配好、或者当前目录不是Git仓库,所有撤销功能都会静默失败或报错fatal: not a git repository。
- 确认Git可用:
git --version能在终端运行成功 - 确保Sublime打开的是项目根目录(含
.git/的文件夹),不是某个子文件 -
GitSavvy插件需手动启用Git路径:Preferences → Package Settings → GitSavvy → Settings,填入"git_binary": "/usr/bin/git"(macOS/Linux)或"git_binary": "C:\Program Files\Git\bin\git.exe"(Windows)
用GitSavvy安全回退到上一个commit(git reset --mixed HEAD~1)
这是最常用也最安全的“撤回未push的提交”操作——保留修改内容在工作区,只删掉最近一次commit记录。适合改完代码立刻发现写错了,又不想丢改动的情况。
操作路径:右键任意文件 → GitSavvy: Reset → Mixed → HEAD~1(注意不是“Hard”)
- 选
Mixed:commit消失,文件变更保留在编辑器里(可继续改、再commit) - 误选
Hard:commit + 所有修改全丢,连git reflog都难救(除非刚执行完立刻关Sublime) - 如果菜单里没有
HEAD~1,说明当前分支无提交历史,或你处在detached HEAD状态 - 执行后看状态栏:GitSavvy会显示
HEAD is now at xxxxx,且文件标签页右上角不再有“✓”提交标记
撤销某次已push的commit但不丢代码(git revert)
只要commit已推送到远程,就必须用git revert——它新建一个反向commit来抵消原操作,不破坏历史线性,团队协作中唯一安全的选择。
在GitSavvy里操作:按ctrl+shift+p(Win/Linux)或cmd+shift+p(macOS)→ 输入git revert → 选中目标commit(支持多选)→ 回车
- 务必确认选中的commit哈希前有
✓图标,表示它已被push(GitSavvy会灰显未push的本地commit) - 如果弹出
Aborting revert due to empty commit,说明你要revert的修改在后续commit里已被覆盖,Git认为这次revert无意义 - revert生成的新commit默认带
Revert "xxx"前缀,别手贱删掉——这是Git识别revert动作的关键标识 - revert后必须
git push,否则远程库还是旧状态;如果提示non-fast-forward,说明别人已push新提交,先git pull再重试
想撤销暂存区(staged)文件?别碰reset,用git restore --staged
很多人想“撤回add”,却去点GitSavvy里的Reset → Mixed,结果把整个HEAD都回退了。其实只需取消暂存,不影响工作区文件。
GitSavvy 4.0+ 支持该操作:右键已add的文件 → GitSavvy: Restore → Staged。底层执行的就是git restore --staged <file></file>(Git 2.23+)。
- 旧版Git(restore,GitSavvy会自动降级为
git reset HEAD <file></file>,效果一样 - 如果右键没看到这个选项,检查GitSavvy是否更新到最新版(
Package Control: Upgrade Package) - 千万别对未跟踪(untracked)文件用restore/staged——它只处理已跟踪且已暂存的文件;误操作不会报错,但也没效果
真正容易被忽略的是:GitSavvy的撤销操作全部基于当前分支HEAD,它不会帮你切分支、不会自动fetch远程更新、也不会警告你正在revert一个被rebase过的commit。这些得你自己在终端敲git log --oneline --graph确认清楚再动手。











