1. git checkout -- filename
撤销最近一次工作区的修改,git add filename
命令的后悔药
git checkout --filename 其实是用版本库的文件替换工作区的文件,无论工作区是修改还是删除,都可以“一键还原”。
git checkout 分支名
用来切换分支
2. git reset -- filename
撤销暂存区的提交,git commit -m 'msg'
的后悔药
git reset HEAD filename
撤销暂存区的修改(HEAD 表示最近一次),将暂存区的修改回退到工作区
git reset HEAD 就是用版本库的内容替换掉暂存区的内容
在 git 中 HEAD 表示当前版本,指向最新的提交
HEAD^ → 上一个版本
HEAD^^ → 上上一个版本
HEAD^^^ → 上上上一个版本
HEAD~100 → 往上100个版本
git reset --hard HEAD^ 回退到上一个版本
git reset --hard commitId
工作目录也会变
git reset --soft commitId
工作目录不会变
--soft – 缓存区和工作目录都不会被改变
--mixed – 默认选项。缓存区和你指定的提交同步,但工作目录不受影响
--hard – 缓存区和工作目录都同步到你指定的提交
3. git reflog
记录你的每条命令
假设一个版本被 reset 之后消失在未来,可以通过这个命令找到版本 ID,照样可以 reset 回来。
4. git diff
git diff
→ 工作区 🆚 暂存区
git diff --cache
→ 暂存区 🆚 当前分支
5. git rm filename
从版本库里删除一个文件
如果在工作区误删,但已经提交到版本库,可以通过 git checkout --file
从版本库恢复到工作区【原理看第一点】
6. 撤销 git add 的操作
git reset HEAD .
git reset --mixed
文件退出暂存区,但是修改保留
git rm -r --cached dirname
git rm -r --cached dirname
这个命令是使用过的,git add dirname
之后,发现添加的文件夹是眼花了看错的,于是要把这个文件夹从暂存区删除,git rm -r --cached dirname
可以把特定文件从暂存区删除;
同样能达到效果的还有 git reset HEAD
,区别:
git reset --hard HEAD 是全局的, 整个repo都reset了
git rm --cached 是只针对参数指的文件的