撤销与忽略
撤销用什么,取决于改动已经走到哪一步。分清 restore、reset、revert,就是这一步的全部要点。
学习目标
- 能安全丢掉还没提交的改动
- 能安全地撤销已经推出去的提交
- 用 .gitignore 把构建产物和密钥挡在仓库之外
撤销用哪个,看改动已经走到哪一步。还没提交,用 git restore;提交了但还没推,用 git reset;已经推上去、别人也拉过了,用 git revert。三者搞混就会毁掉别人的历史,所以先用 git status 确认自己站在哪一步,这个习惯要养成。
git reset 有三种:--soft 只撤销提交、改动留在暂存区;默认的 --mixed 连暂存也一并撤下;--hard 连文件内容都还原。--hard 是真的会删掉你的成果,回车之前务必再读一遍。就算真手滑了也别马上放弃——git reflog 里往往还留着那个提交。
构建产物、node_modules、.env 这类密钥文件绝不能进仓库。在项目根目录放一个 .gitignore 写好规则,GIT 就完全不看这些路径了。要注意:已经提交过的文件,再往 .gitignore 里加也照样被跟踪。这时得先用 git rm --cached 取消跟踪再提交;而如果密码已经推上去了,它会一直留在历史里,必须把那个密钥作废重发。
本步骤要掌握的命令
别光用眼睛看,去终端里真敲一遍。手记住了,工作时才使得出来。
git restore <file>- 丢掉某个文件还没提交的改动,回到最近一次提交的样子。
git reset --soft HEAD~1- 撤销最近一次提交,但把改动留在暂存区——改提交信息常用这招。
git revert <commit>- 新建一个提交把那次改动反做回去。不改写历史,所以在共享分支上很安全。
git diff --staged- 提交前先审一遍暂存了什么。把它变成每次提交前的固定动作。