git中暂存区和本地库的区别:暂存区又称索引区,是工作区与本地仓库之间的一个过渡区域,它记录了工作区的代码状态(有无改动,或者做了哪些改动);而本地仓库则记录了本地代码的状态。
本教程操作环境:Windows7系统、Git2.30.0版、Dell G3电脑。
1、git仓库相关概念的理解
要想深入理解git命令,必须理解git仓库相关的几个概念。先看一下一份本地代码目录D:gittest目录下:
需要注意的是.git是隐藏目录,需要显示隐藏文件才能看到。
工作区(working directory):简单来说保存在本地的文件或目录都属于工作区,平常修改代码都是在工作区进行的。一般本地的文件,除了隐藏的.git目录,其它都属于工作区。上图中看到的mydir、file1.txt、file2.txt都是属于工作区。
暂存区(Stage):又称索引区(index),顾名思义,它是工作区与本地仓库之间的一个过渡,它记录了工作区的代码状态(有无改动,或者作了哪些改动)。位于.git目录中。
本地仓库(repository):记录了本地代码的状态,位于.git目录中。
关于状态的理解:
想一下,我们平时在修改一份重要的文件时,肯定要先做一份备份,目的是防止修改出错,最终还能恢复。假如这份文件本身很大,如果如果备份就会占用额外较多的空间,这样就显得不太划算。还有另外一种方式,就是记录文件的修改状态,而不是对文件本身进行备份。文件状态类似如下描述:
文件第一行:将xxx换成了****
文件第三行和第四行之间,增加了一行,内容是……
说白了文件状态就是文件的修改记录,根据修改记录我们就可以知道我们对文件作了哪些修改,根据修改记录也可以恢复到文件修改之前的状态。
2、git命令讲解
几个与查看状态相关的命令:
git status 查看文件在工作区、暂存区、本地仓库之间的变化
git diff 查看工作区与暂存区的差异
git diff –cached 查看暂存区与本地仓库的区别
git diff HEAD 查看工作区与本地仓库之间的差异
一些命令对应的操作如下:
下面以一个具体的例子来说明本地文件修改会导致相关区域的变化
修改之前,工作区、暂存区与本地仓库之间状态是一致的
(1)本地修改文件file1.txt 里面增加一行add this line
git status 查看文件在工作区、暂存区、本地仓库仓库之间的变化
上图中可以看到,Changes not staged for commit:,说明文件在工作区已经发生了变化,但是修改还未提交到暂存区
git diff 查看工作区与暂存区的变化
从图中可以看出,工作区与暂存区之间发生了变化,这是由于本地文件修改了,并且还未将修改提交到暂存区
git diff HEAD 查看工作区与本地仓库之间的状态
从上图可以看出,工作区与本地仓库之间也出现了差异。很简单,此时本地仓库与暂存区的状态是一致的
git diff –cached 查看暂存区与本地仓库,会发现它们之间缺失没有差异
(2)将本地修改提交到暂存区
git add . 将本地的修改提交的暂存区
git status
可以看到,修改已经提交到了暂存区:Changes to be committed:
提交之后,用git diff 查看,会发现工作区与暂存区已经没有了差异。
但是暂存区与工作区有了差异。
git diff –cached
同样,用git diff HEAD会发现工作区与本地仓库还是有差异
(3)将修改提交到本地仓库
git commit -m “add a line in file1.txt” 将修改从暂存区提交到本地仓库
git status查看,提示Your branch is ahead of ‘origin/master’ by 1 commit.表明工作区的修改已经提交的本地仓库,但是还没有推送到远程分支。
git diff、git diff –cached 、git diff HEAD 会发现提示没有差异。因为工作区的修改已经提交到本地仓库,此时工作区、暂存区、本地仓库的状态是一致的。
逆操作
git add – git checkout 将工作区文件退回到暂存区状态,将工作区文件替换为暂存区文件。
比如工作区修改了文件file1.txt,此时还未提交到暂存区。如果想放弃修改,就可以用
git checkout file1.txt将文件退回到暂存区状态(放弃修改)
git commit – git reset HEAD 拉取最近一次提交到本地仓库的文件到暂存区,不影响工作区。
总结:
如果我们想放弃本地文件(工作区)的某一次修改:
- 如果修改还未提交到暂存区,就可以使用git checkcout恢复
- 如果修改已经提交到暂存区,还没提交到本地仓库,就先使用git reset HEAD 将暂存区状态恢复,然后使用git checkout 恢复工作区
推荐学习:《Git教程》