.git目录结构
我们在前文中提过了.git
目录,也明确说了我们不能手动去.git
目录下创建修改等任何操作。
添加文件
我们现在已经了解到,git是一个版本控制器,可以对我们的文件进行管理。而我们需要使用git管理文件的时候,我们必须将这些文件放到git仓库中,只有在git仓库中的文件才可以被我们的git追踪管理。
看完上面我们有个疑问:需要使用 git 进行文件管理,需要把文件放到仓库中,那是不是要我们把文件添加到
.git
目录下去呢?文章开头又说我们不能手动去添加或修改
.git
目录下的任何文件,那我们该怎么将文件添加到仓库中去呢?
那接下来我们就看看如何将文件添加到版本库中去吧。
首先说明一下,所有的版本控制系统,其实只能跟踪到文本文件的改动,比如txt文件、网页、程序代码等等,Git也不例外。版本控制系统可以记录你每次的改动,比如在第5行添加了一个单词"linux",在第八行删除了一个单词"windows"。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但是却补能跟踪二进制文件的细致改动,只能把二进制文件每次串起来,也就是只知道图片或视频从100KB改成了200KB,但是到底改了啥,版本控制系统不知道,也没办法知道。
新建文件添加到本地仓库:git add、git commit -m
add:将文件添加到缓存区
commit:提交到本地仓库
- 在工作区创建一个文件readme.txt
cpp
在工作区创建一个文件
touch readme.txt (linux中的新建文件命令)
vim readme.txt #编辑该文件
在文件里写入一句话:
- 将文件提交到本地git版本仓库中
- 首先:使用git add命令将文件添加到本地仓库的提交缓存(也就是提交到暂存区):
git add readme.txt
这个时候还不算添加到了本地仓库,我们还需要使用git commit命令为其添加修改的描述信息 - 使用git commit命令为其添加修改的描述信息:(完成后,就将文件提交到了仓库中了)
注意在使用git commit时我们只需要简单描述一下我们做了什么,不要像写注释那样写一大堆,不然将来在回滚代码或者查看历史版本时,很难审阅。
我们需要使用-m
选项来简写描述我们的信息,如果不使用-m,会调用终端的注释编辑器让你输入描述信息,但是不建议使用,因为注释编辑器比较难用,不舒服。
git commit -m "add new file"
- git commit 会为我们生成40位的哈希值,用于作为id,并把刚刚用git add添加到提交缓存区里的文件提交到本地仓库中,便于我们回滚,至此,这个文件就已经添加到本地仓库中了,同时本地仓库也迭代了一个版本。
- 首先:使用git add命令将文件添加到本地仓库的提交缓存(也就是提交到暂存区):
查看历史提交日志:git log
第一行的commit是哈希算法算出的id
Author是提交者是谁的意思,显示格式是:用户名 <邮箱>
Date的意思是提交时间,后面的+0800这个是格林尼治时间,代表当前是以哪儿的时间地作为基准,这是世界时间,用它来作为基数与当前所在地时差进行计算,包括地球自转等公式。
最下面的就是注释了,就是我们在git commit
时添加的描述信息。
查看.git目录
我们可以看到,当我们将文件添加到本地仓库后,我们的.git
目录和文章开头相比,就发生了变化。
还是这副图:
首先是index文件
:我们在上一篇中说到的暂存区,就是这个文件,我们add
就是先将文件添加到暂存区中(注意:不是将文件实体添加到暂存区中,暂存区存的是文件的索引,真正的文件实体在Git 对象库
(.git/objects
)中)。
HEAD文件
: 我们在上篇提到"HEAD" 实际是指向 master 分支的一个"游标",我们可以查看一下HEAD指针是不是指向master的。
可以看到是指向master的。
我们可以查看一下master文件下存放的是什么内容:
是一串字符串,我们有没有觉得这一串字符串很熟悉呢?
其实就是我们最近一次提交的commit ID,这里我们就可能需要验证一下了,是只记录最近一次,还是存放所有提交的ID,因为我们目前直提交了一个文件,接下来我们多提交几个文件试试。
我们又想本地仓库中添加了两个文件,这是我们再去看看master中存放的是什么:
从这我们就可以发现,仅仅是存放最近一次提交的commit ID。
我们要知道,不管是index暂存区还是master分支,这两个目录树存放的都是文件实体索引,而实体又存放在Git 对象库
(.git/objects
)中),那我们来看看object文件该怎么看:
其实这就里面就代表每个对象,那该怎么去看呢?其实很简答。
还是看commit ID,
ID的前两位是文件名(也就是文件夹的名称),所以我们就可以很快找到我们添加到仓库中的文件:
那我们既然找到他了,那我们来看看这个对象里具体有什么东西,这时我们不能再使用cat
l来进行查看了。用以下命令:
cpp
git cat-file -p commitID
例如:
我们查看到里面存放的是这些信息。我们可以观察到除了第一行的tree我们不知道是什么外,其他的我们都知道是什么。
patent: 是我们上一次提交的commitID,然后就是提交的用户邮箱,最后就是本对象提交时打印的描述信息。
那我们来看看 tree 里是什么:
可以看到里面存放的就是我们提交的文件,而每一个文件也都有自己的索引。
我们可以查看一下其中一个内容:
其实这里面就存放的是我们修改文件的内容
补充上文add与log的内容:
cpp
git add --all
git add .
git add --all
命令会将当前目录下包括子目录下所有改动的文件提交到暂存区 ,注意只包括改动的文件,不改动的不会放到缓存区。
这个命令还会把删除的文件也提交进去
如你在本地删除了min.c ,这个命令会把删除信息也记录进去,然后在提交的时候把仓库里对应的min.c也删除掉,也就是说你在本地做的删除操作会被记录,提交仓库时会删除同样的文件,如果不想删除文件,可以使用git add .
,注意后面有一个"."点的符号,这个命令跟git add --all一样,但是不会记录删除操作。
只要对文件进行了修改,那我们就需要重新 git add,不然只是在工作区中修改,仓库中还是原来的版本
最后别忘记使用git commit提交到仓库中
cpp
git log --pretty=oneline
我们在使用git log
命令看历史记录时,会打印以下信息:
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline
参数
git status
可以查看当前仓库状态。
比如我对某个仓库里的文件,进行了修改,那我们就可以使用这个命令进行状态查看,或者我们在向仓库中添加新的文件时,也可以使用这个命令进行查看状态。
例如:
我们对一开始创建的readme.txt文件内容进行添加以下内容:
我们对文件进行修改后,使用git status
来查看此时仓库状态。
这里很明确的提示咱们,修改的文件时哪个文件,而且只是在工作区进行了修改,并没有进行提交到暂存区中。
注意: 我们使用git status
命令只能查看哪个文件被修改,并不能查看具体文件修改的内容。
查看被修改的内容:
命令:
cpp
git diff filename
例如:
对上述进行一下解析:
那我们进行提交到暂存区后看看。
此时我们就可以看到有个修改文件提交到了暂存区。
当我们提交到仓库中之后,在使用git status查看,则表示没有需要提交的文件了