概述
一般情况下,git要将内容提交到本地仓库,都是先将内容提交到暂存区,然后再从暂存区提交到本地仓库。下面我们来初始化一个空的git仓库,用来测试,如下:
git init
此时,工作区所在目录,仅仅一个隐藏的.git目录,如下:
通过git status我们可以查看,当前git库的状态。
此时,工作区、暂存区、版本库,都是空的,如下:
一、如何将工作区的改动提交到暂存区
通过git add命令,可以将工作区的改动,提交到暂存区。如下,在工作区创建了一个文件:
echo "hello world" > index.html
此时,工作区里面就有一个文件index.html,此时工作区、暂存区、版本库内容,如下:
因为还没有添加到暂存区,也就没有被git仓库跟踪,执行git status,我们可以看到
此时,我们执行如下命令:
git add index.html
就可以将index.html添加到暂存区,因为index.html是新文件,还会让git进行跟踪index.html文件。我们可以通过如下命令,来查询当前暂存区的内容:
git ls-files --stage
此时工作区、暂存区、版本库内容,如下:
执行git add命令实质是使用工作区中提交过来的文件内容,计算出 SHA-1,创建了一个Blob对象,并将在暂存区中存储Blob对象。
二、如何将暂存区的改动提交到本地仓库
通过git commit命令,可以将暂存区的改动,提交到本地仓库。上面,我们将index.html提交到了暂存区,现在,我们先看一下其状态,如下:
执行,如下命令:
git commit -m "初次提交哦"
关于提交返回的信息中:
master 代表当前分支是master
9a85208 代表当前提交的commit对象git哈希值,也可以理解成commit的id,可用该id查询当前提交的内容。
100644 代表当前文件类型和权限,100代表regular file,644代表权限是:拥有者(读+写),所属组(读),其他人(读)
执行git commit命令实质是,首先会将暂存区中的内容保存为一个永久的快照(Tree对象),然后创建一个指向该快照的提交对象(commit对象,即上图中的9a85208),最后更新版本库中的当前分支来指向本次提交。
此时工作区、暂存区、版本库内容,如下:
若提交多次,就会生成多个tree对象,多个tree对象连起来就会生成一个链,如下图:
HEAD中commit对象,理论上说指向tree3,但却指向了tree1,因为git支持回滚操作,下面将会涉及到。
三、如何比较工作区与暂存区的差异
通过git diff命令,可比较工作区与暂存区的差异。
现在,我们来修改一下index.html文件,如下:
chmod 755 index.html
此时,通过git status,尽管,我们仅仅改动文件权限,也可以看到工作区有改动
执行如下命令:
git diff index.html
可以看出
old 代表是暂存区的文件
new 代表的是工作区的文件
暂存区和工作区的变动仅仅是文件权限。
现在执行如下命令,修改index.html的内容,
echo "just test" >> index.html
再次执行git diff 查看,结果如下:
index 3b18e51..02aba2e 代表两个版本的git哈希值(暂存区的文件对象对应的哈希值3b18e51,与工作区文件对应的哈希值02aba2e )。
我们可以通过git cat-file -t 查看其类型
可以看出,其为blob对象,即一个文件,我们可以通过git cat-file -p 查看其内容
"@@ -1 +1,2 @@" 代表差异的定位语句,减号后是原文件的开始行号和行数(若只有一行,就不显示行数)。加号后是新文件的开始行号和行数。
上面的意思表示原文件从第一行开始,只有一行。新文件从第一行开始,共二行
"---" 表示变动前的文件
"+++" 表示变动后的文件
“just test”前面的+号,代表该行是新增的。
关于文件内容内容的每一行最前面,会有一个标记位。
如果为空,表示该行无变化
如果是感叹号(!),表示该行有改动
如果是减号(-),表示该行被删除
如果是加号(+),表示该行为新增
四、如何比较工作区与本地仓库的差异
通过git diff HEAD命令,可比较工作区与本地仓库的差异。
为了便于测试,再次修改index.html文件,如下:
echo "test again" >> index.html
为了查看工作区与本地仓库的差异,执行如下命令
git diff HEAD index.html
执行结果如下:
五、如何比较暂存区与本地仓库的差异
通过git diff --cached 命令,可比较工作区与本地仓库的差异。
为了便于测试,首先将工作区的改动提交到暂存区
git add index.html
执行如下命令,查看暂存区和本地仓库中index.html文件的差异
git diff --cached index.html
六、如何撤回工作区的改动
在git的工作区里面,有的时候,不小心改动了某个文件,可以使用git checkout --来取消上次改动,比如,删除了index.html文件,如下:
rm index.html
这个时候,可以执行:
git checkout -- index.html
七、如何撤回工作区的提交
撤回工作区的提交,也就是将暂存区里面,因本次工作区里提交,而修改的blog对象,回退到修改为之前的blog对象。
有的时候,需要提交到暂存区的文件很多,为了简便,我们执行了如下命令:
git add .
将工作区内所有文件(已经添加git跟踪的文件和尚未添加到git跟踪的文件),统统搞到暂存区,那么怎样撤回其中一个多少几个文件呢?
当然是有的,我们可以使用git reset HEAD来从暂存区删除内容,如下:
此时,在暂存区中,新增了page3.html以及page2.html文件,是我不想提及到暂存区的。使用如下命令,撤回提交:
git reset HEAD page3.html page2.html
此时,就可以看到,我们已经page3.html以及page2.html文件的改动,从暂存区里面撤销了。
八、如何撤回暂存区的提交
当我们执行了git commit 的时候,发现提交的内容有问题,或是不应该提交,我们怎样取消上次提交呢?
其实,就是改变版本库当前分支指向的commit对象。
比如,通过git log查看所有提交
版本库中当前分支对应的commit对象是commit(5b4461),我们可以通如下命令,将其回退到commit(665ed5)
git reset 665ed5
执行结果如下:
此时,我们再次查看提交历史,就会发现当前分支回退了,执行了commit(665ed5)
若您感觉本站文章不错,读后有收获,不妨赞助一下?
我要赞助