Git
Git 救命手册:10 个回滚与补救命令
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)。救命操作出错时,它是你回到原点的传送门。