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
整个分支没用:删分支