git有4个区域:
工作区(working directory) :工作区是我们能看到的区域,就是本地目录,我们在目录里面进行操作;
暂存区(stage index):git add命令就是将文件从工作区添加到暂存区;
本地版本库(repository):git commit命令就是将暂存区的文件提交到本地版本库中;
远程库:git push命令就是将本地版本库中的文件推送到远程库中。
四者的关系如下图:
下面记录的是,在使用git的时候,会踩到的坑!欢迎大家补充~
1、在使用git add <文件名>
命令的时候,最好紧跟着git commit -m '操作描述'
。
坑:如果你上一次操作的时候,只将一些文件add到了暂存区,但是并没有commit到本地版本库中,那么你这次push的时候,会将上一次残留在暂存区的文件,一起push到远程库中;而上次操作中已经commit到本地版本库的文件,是不会影响这次的push的.
2、git reset <文件名>
撤销已经add到暂存区,但是还没有commit的文件。
如果你往暂存区中add了一些错误的文件,但是还没有commit到本地版本库。你可以使用上述命令撤销add。
3、假如本地版本库叫learngit,结构如下:
然后,第一次向空的远程库中推送文件的时候,我仅仅只是想将文件lalala.txt push到远程库中,所以我在目录/home/lanyue/learngit/fold下进行操作:
git add lalala.txt
git commit -m '添加文件lalala.txt'
git push origin master
发现,push到远程库上的是一个文件夹fold(包含lalala.txt),而不是只是一个文件lalala.txt,为什么????
因为本地的learngit目录是用git init
初始化过的,它是本地版本库的根目录,而“远程库的根目录”是跟“本地版本库的根目录”保持一致的,所以你将fold/read.txt推送到远程的时候,远程库中呈现的结构是与本地版本库的根目录保持一致的。如果你只想push文件read.txt到远程库,将read.txt放在本地版本库的根目录learngit下,再add,commit,push就可以了。
4、git checkout -- <文件名>
误删工作区的文件,用本地版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
坑:会清除工作区中未添加到暂存区的改动 ,使用的时候要注意。
5、git rm -r --cache <文件名>
删除暂存区的文件(不改变工作区的该文件)
坑: 删除暂存区的该文件之前,你要确定之前在暂存区中的文件,你确实是不需要了,能被删除。因为该命令实际上的意思是,停止追踪某个文件(但是并不会改变工作区中的该文件),这样的话这个文件就没有追踪记录了。假如你在本地工作区误删了该文件(但是该文件你之前已经commit到了本地版本库中),此时你想要恢复该文件到本地的工作区,是不能用git checkout -- <文件名>
恢复过来的!!!
6、git status
查看暂存区和工作区文件的状态
git status只能看到”add到暂存区但是还没有commit到本地版本库的文件”和”还没有被add到暂存区的文件(工作区的文件)”的状态,已经commit到本地版本库的文件,是看不到的。看项目历史的信息要使用git log。
“add到暂存区但是还没有commit到本地版本库的文件”的状态是“unstaged”;
“还没有被add到暂存区的文件”的状态是“untracked”;