Article

没提交,用 restore;已提交但没推送,用 reset;已推送到远程,用 revert 更安全。

2026/7/5#git#教程

git中回退修改如何操作

分情况处理。核心原则:没提交,用 restore;已提交但没推送,用 reset;已推送到远程,用 revert 更安全。

1. 只是改了文件,还没提交

放弃某个文件修改:

git restore 文件名

放弃所有未提交修改:

git restore .

连新增文件也删掉:

git clean -fd

最彻底恢复到当前分支最后一次提交:

git restore .
git clean -fd

2. 已经 git add,但还没 commit

取消暂存,但保留文件修改:

git restore --staged .

取消暂存并放弃修改:

git restore --staged .
git restore .

3. 已经 commit,但还没 push

查看提交记录:

git log --oneline

假设最近一次提交是没用的优化。

保留代码,只撤销提交

git reset --soft HEAD~1

效果:commit 没了,但修改还在,并且仍然是 staged 状态。

保留代码,但取消暂存

git reset --mixed HEAD~1

效果:commit 没了,代码还在,但变成普通未提交修改。

连代码一起回退

git reset --hard HEAD~1

效果:最近一次提交和代码修改都消失。


4. 已经 push 到远程分支

如果这个分支只有你自己用,可以强制回退:

git reset --hard HEAD~1
git push --force-with-lease

不要优先用 --force,用:

git push --force-with-lease

更安全,避免覆盖别人新提交。

如果分支已经多人协作,或者已经合并进 main,不要 reset,应该用:

git revert 提交ID

例如:

git log --oneline
git revert a1b2c3d
git push

revert 会生成一个新的“反向提交”,不会改写历史,适合公共分支。


5. 优化是在一个独立功能分支上

这是最简单的情况。

假设分支叫:

feature/performance-opt

如果整个优化都不要了,直接切回主分支:

git switch main

然后删掉分支:

git branch -D feature/performance-opt

如果远程也推送过:

git push origin --delete feature/performance-opt

这就是为什么建议“每个新功能一个分支”。


6. 已经 merge 到 main,但后悔了

情况 A:普通 merge commit

查看记录:

git log --oneline --graph

找到 merge commit,然后:

git revert -m 1 merge提交ID

例如:

git revert -m 1 abc1234

-m 1 表示保留 main 这条主线,撤销被合并进来的分支内容。

情况 B:Squash merge

如果 GitHub 上用的是 Squash and merge,只会产生一个普通提交。

直接:

git revert 提交ID

7. 想临时保存优化,先切回去试别的方案

不要直接删,可以用 stash:

git stash push -m "try performance optimization"

恢复:

git stash pop

查看 stash:

git stash list

删除某个 stash:

git stash drop stash@{0}

8. 最推荐的安全流程

开发新优化:

git switch main
git pull
git switch -c feature/optimize-cache

优化没用,直接删分支:

git switch main
git branch -D feature/optimize-cache

优化已经提交但没推送:

git reset --hard HEAD~1

优化已经推送或合并:

git revert 提交ID

一句话记忆:

没提交:git restore
已提交未推送:git reset
已推送/已合并:git revert
整个分支没用:删分支