用经典图来镇个楼
这三个都涉及到两个object的交互和比较,牢记一点:
--cached 特指 暂存区/索引区
git diff
默认被比较的就是工作区,进行比较的就是比工作区高一级的(i.e. 暂存区)
git diff [to-compare = higher level of compared] [compared = working-tree]
被比较的还是工作区,指明了是HEAD,就是工作区和版本库的比较
git diff HEAD
指明了cached参数则默认被比较的就是暂存区,进行比较的就是比工作区高一级的(i.e. 版本库)
git diff --cached
git checkout
觉得这个博客说的比较详细
# 默认是切换分支版本。如果xx不是一个分支,就会把文件切出来
git checkout xx
git checkout 26a2e80 # 切一个分支
git checkout . # 将工作区恢复成版本库/缓存区的情况
# 为了防止分支和文件重名(一般概率比较小),最好加 --(前后都有空格)
git checkout -- fileName
# 如果不是从暂存区挑文件
上面说“将工作区恢复成版本库/缓存区的情况”,那到底是什么呢?
把文件在工作区的修改全部撤销,这里有俩种情况
1)文件修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态
2)已经添加到暂存区后,又做了修改,现在撤销修改回到添加到暂存区后的状态。总之,就是让这个文件回到最近一次git commit 和git add时的状态。
我总结就是:暂存区有相应文件,就恢复成暂存区的;没有相应文件,就恢复成版本库的。
- 如果是已经删除了的文件,想要checkout是没有办法的,只能先reset,然后checkout
这个博客我觉得讲得挺好
git rm
这个博客很详细
删除工作区的东西并提交到暂存库 ( = rm + add )
git rm xxx.txt
如果工作区和版本库关于xxx.txt,有不一样,就会报错(怕你没注意到,删错了,毕竟下一步就是提交,就会覆盖到版本库),如果没关系,就是要删除这个文件,也不管版本库的事情了,就加个 -f 参数。然后就git commit就行。
删除暂存区文件,但保留工作区的文件,并且将这次删除放入暂存区。
如果不小心将文件add进了暂存区,可以用这个撤回add(不影响工作区),而不是使用git checkout !
git rm --cached
常用的就是
git rm -r --cached .
git rm -r --cached dirName
r参数表示递归删除文件夹