提交内容到本地仓库
访问量:3483

概述

一般情况下,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)