【Git】第五篇:基本操作(添加文件)

.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:提交到本地仓库

  1. 在工作区创建一个文件readme.txt
cpp 复制代码
在工作区创建一个文件
touch readme.txt  (linux中的新建文件命令)

vim readme.txt    #编辑该文件

在文件里写入一句话:

  1. 将文件提交到本地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 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的前两位是文件名(也就是文件夹的名称),所以我们就可以很快找到我们添加到仓库中的文件:

那我们既然找到他了,那我们来看看这个对象里具体有什么东西,这时我们不能再使用catl来进行查看了。用以下命令:

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查看,则表示没有需要提交的文件了

相关推荐
研究是为了理解3 小时前
Git Bash 常用命令
git·elasticsearch·bash
DKPT4 小时前
Git 的基本概念和使用方式
git
Winston Wood7 小时前
一文了解git TAG
git·版本控制
喵喵先森8 小时前
Git 的基本概念和使用方式
git·源代码管理
xianwu5439 小时前
反向代理模块
linux·开发语言·网络·git
binishuaio11 小时前
Java 第11天 (git版本控制器基础用法)
java·开发语言·git
会发光的猪。12 小时前
如何在vscode中安装git详细新手教程
前端·ide·git·vscode
stewie613 小时前
在IDEA中使用Git
java·git
晓理紫1 天前
使用git lfs向huggingface提交较大的数据或者权重
git
我不是程序猿儿1 天前
【GIT】sourceTree的“当前分支“,“合并分支“与“检出分支的区别
git