Git

Git 救命手册:10 个回滚与补救命令

分类:Git · 阅读约 8 分钟

Git 里绝大多数"完了"都是假警报。只要提交进过仓库(哪怕后来被 reset 掉),对象默认还会保留约 90 天,reflog 就是找到它们的地图。这篇按事故严重程度从轻到重排列。

1. 改错了还没 add:直接还原文件

git restore <file>          # 丢弃工作区修改,回到 HEAD 版本
git restore .               # 全部丢弃(慎用)

2. add 错了:撤回暂存,不动文件

git restore --staged <file> # 从暂存区撤回,修改保留在工作区

3. 刚提交就发现写错:修补上一个提交

git add forgotten.txt
git commit --amend --no-edit   # 把改动并入上一个提交
# 注意:已 push 的提交不要 amend,改完 hash 会变

4. 撤销最近一次提交,但保留改动

git reset --soft HEAD~1     # 提交没了,改动回到暂存区
git reset HEAD~1            # 默认 mixed:改动回到工作区
git reset --hard HEAD~1     # 连改动一起扔掉(真删除,先想清楚)
口诀:soft 留暂存、mixed 留工作区、hard 什么都不留。

5. 已经 push 了要撤销:用 revert

公共分支上不要改历史。用 revert 生成一个"反向提交"来抵消:

git revert <commit-hash>   # 生成抵消提交,可安全 push
git revert --no-commit HEAD~2..HEAD  # 批量撤销并合并为一次提交

6. 删错了分支:reflog 找回来

git reflog                  # 找到分支被删前最后一个提交的 hash
git branch rescued <hash>   # 在那个位置重建分支

7. reset --hard 之后后悔了

同样靠 reflog:reset 前的位置记录在 HEAD@{1} 里。

git reflog
git reset --hard HEAD@{1}   # 回到 reset 之前的状态

8. 临时存档手头工作:stash

git stash push -m "wip: 登录页改版"   # 存起来,切去修 bug
git stash list
git stash pop                # 回来继续(apply + 删除存档)
git stash apply stash@{0}    # 只恢复,不删存档

9. 只想要另一个分支里的某一个提交

git cherry-pick <hash>      # 把指定提交复制到当前分支

10. 文件的历史版本找回来

git log --oneline -- path/to/file     # 这个文件动过哪些提交
git show <hash>:path/to/file          # 看某个版本的内容
git restore --source=<hash> path/to/file  # 直接恢复那个版本
最后的安全垫:动手前先打一个保险分支 git branch backup-$(date +%H%M)。救命操作出错时,它是你回到原点的传送门。