【Git】基本指令
工作区、暂存区、版本库
- 工作区:是在电脑上你要写代码或文件的目录。
- 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,我们把暂存区有时也叫作索引(index)。
- 版本库:又名仓库,英文名 repository 。工作区有一个隐藏目录 .git ,它不算工作区,而是 Git 的版本库。这个版本库里面的所有文件都可以被 Git 管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
下面这个图展示了工作区、暂存区和版本库之间的关系:
图中左侧为工作区,右侧为版本库。Git 的版本库里存了很多东西,其中最重要的就是暂存区。
• 在创建 Git 版本库时,Git 会为我们自动创建一个唯一的 master 分支,以及指向 master 的一个指
针叫 HEAD。(分支和HEAD的概念后面再说)
• 当对工作区修改(或新增)的文件执行 git add
命令时,暂存区目录树的文件索引会被更新。
• 当执行提交操作 git commit
时,master 分支会做相应的更新,可以简单理解为暂存区的目录树才会被真正写到版本库中。
由上述描述我们便能得知:通过新建或粘贴进⽬录的⽂件,并不能称之为向仓库中新增文件,而只是在工作区新增了文件。必须要通过使用 git add
和 git commit
命令才能将文件添加到仓库中进行管理!!!
基本指令
在包含 .git 的目录下新建一个 ReadMe 文件,我们可以使用 git add
命令可以将文件添加到暂存区:
• 添加一个或多个文件到暂存区: git add [file1] [file2] ...
• 添加指定目录到暂存区,包括子目录: git add [dir]
• 添加当前目录下的所有文件改动到暂存区: git add .
再使⽤ git commit
命令将暂存区内容添加到本地仓库中:
• 提交暂存区全部内容到本地仓库中: git commit -m "message"
• 提交暂存区的指定⽂件到仓库区: git commit [file1] [file2] ... -m "message"
注意 git commit
后面的 -m
选项,要跟上描述本次提交的 message
,由用户完成,这部分内容绝对不能省略,并要好好描述,是用来记录你的提交细节,是给我们人看的。
例如:
git commit 命令执行成功后会告诉我们,1个文件被改动(就是我们新添加的ReadMe文件),插入了一行内容(ReadMe有一行内容)。
我们还可以多次 add 不同的文件,而只 commit 一次便可以提交所有文件,是因为需要提交的文件是通通被 add 到暂存区中,然后一次性 commit 暂存区的所有修改。如
截至目前为止,我们已经更够将代码直接提交至本地仓库了。我们可以使用 git log
命令,来查看下历史提交记录。
该命令显示从最近到最远的提交日志,并且可以看到我们 commit
时的日志消息。
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上 --pretty=oneline
参数:
需要说明的是,我们看到的一大串类似 23807c5…56eed6 的是每次提交的 commit id
(版本号),Git 的 commit id 不是1,2,3……递增的数字,而是一个 SHA1 计算出来的一个非常大的数字,用十六进制表示(你看到的 commit id 和我的肯定不一样,以你自己的为准)。
查看 .git 文件
先来看看我们的 .git 的目录结构:
-
index 就是我们的暂存区,add 后的内容都是添加到这里的。
-
HEAD 就是我们的默认指向 master 分支的指针:
而默认的master
分支,其实就是
打印的 82a32a9010e8dfc2c94124d973c744d92a120a53 是什么东西呢?保存的就是当前最新
的commit id
。 -
objects 为 Git 的对象库,里面包含了创建的各种版本库对象及内容。当执行
git add
命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,就位于 “.git/objects” 目录下,让我们来看看这些对象有何用处:
查找 object 时要将 commit id 分成2部分,其前2位是文件夹名称,后38位是文件名称。
找到这个文件之后,一般不能直接看到里面是什么,该类文件是经过 sha (安全哈希算法)加密过的文件,好在我们可以使影 git cat-file
命令来查看版本库对象的内容:
这就是我们最近⼀次的提交
其中,还有⼀行tree 1fbf42c98753beefa45a2e0f48bd171dac697592
,我们使用同样的方法,看看结果:
在看 test 对应的 8836513e5d67c172edd7e79031674c9bb2ffff69
这是我们对ReadMe做的修改!!被git记录了下来!!
总结一下,在本地的 git 仓库中,有几个文件或者目录很特殊
- index: 暂存区,
git add
后会更新该内容。 - HEAD: 默认指向 master 分⽀的一 个指针。
- refs/heads/master: 文件里保存当前 master 分支的最新
commit id
。 - objects: 包含了创建的各种版本库对象及内容,可以简单理解为放了 git 维护的所有修改。
学习到这里,我们已经清楚了如何向仓库中添加文件,并且对于工作区、暂存区、版本库也有了一定的认识。那么我们再展示一种添加文件的场景,能加深对工作区、暂存区、版本库的理解,示例如下:
提交后发现打印了 1 file changed, 0 insertions(+), 0 deletions(-)
,意思是只有一个文件改变了,这时我们提出了疑问,不是新增了两个文件吗?
再来回忆下, git add
是将文件添加到暂存区, git commit
是将暂存区的内容添加到本地仓库中。由于我们并没有使用 git add file5
,file5
就不在暂存区中维护,所以我们 commit
的时候其实只是把已经在暂存区的 file4 提交了,而遗漏了工作区的 file5
。
如何提交 file5
呢?很简单,再次add
, commit
即可。