• 【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
    在工作区创建一个文件
    touch readme.txt  (linux中的新建文件命令)
    
    vim readme.txt    #编辑该文件
    
    • 1
    • 2
    • 3
    • 4

    在文件里写入一句话:
    在这里插入图片描述

    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来进行查看了。用以下命令:

    git cat-file -p commitID
    
    • 1

    例如:
    在这里插入图片描述
    我们查看到里面存放的是这些信息。我们可以观察到除了第一行的tree我们不知道是什么外,其他的我们都知道是什么。
    patent: 是我们上一次提交的commitID,然后就是提交的用户邮箱,最后就是本对象提交时打印的描述信息。

    那我们来看看 tree 里是什么:
    在这里插入图片描述
    可以看到里面存放的就是我们提交的文件,而每一个文件也都有自己的索引。
    我们可以查看一下其中一个内容:
    在这里插入图片描述
    其实这里面就存放的是我们修改文件的内容


    补充上文add与log的内容:

    git add --all
    git add .
    
    • 1
    • 2

    git add --all命令会将当前目录下包括子目录下所有改动的文件提交到暂存区,注意只包括改动的文件,不改动的不会放到缓存区。

    这个命令还会把删除的文件也提交进去

    如你在本地删除了min.c ,这个命令会把删除信息也记录进去,然后在提交的时候把仓库里对应的min.c也删除掉,也就是说你在本地做的删除操作会被记录,提交仓库时会删除同样的文件,如果不想删除文件,可以使用git add .,注意后面有一个“.”点的符号,这个命令跟git add --all一样,但是不会记录删除操作。

    只要对文件进行了修改,那我们就需要重新 git add,不然只是在工作区中修改,仓库中还是原来的版本

    最后别忘记使用git commit提交到仓库中

    git log --pretty=oneline
    
    • 1

    我们在使用git log命令看历史记录时,会打印以下信息:
    在这里插入图片描述
    如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数
    在这里插入图片描述


    git status

    可以查看当前仓库状态。
    比如我对某个仓库里的文件,进行了修改,那我们就可以使用这个命令进行状态查看,或者我们在向仓库中添加新的文件时,也可以使用这个命令进行查看状态。
    例如:
    我们对一开始创建的readme.txt文件内容进行添加以下内容:
    在这里插入图片描述

    我们对文件进行修改后,使用git status来查看此时仓库状态。
    在这里插入图片描述
    这里很明确的提示咱们,修改的文件时哪个文件,而且只是在工作区进行了修改,并没有进行提交到暂存区中。

    注意: 我们使用git status命令只能查看哪个文件被修改,并不能查看具体文件修改的内容。

    查看被修改的内容:
    命令:

    git diff filename
    
    • 1

    例如:
    在这里插入图片描述
    对上述进行一下解析:

    在这里插入图片描述

    那我们进行提交到暂存区后看看。
    在这里插入图片描述
    此时我们就可以看到有个修改文件提交到了暂存区。
    在这里插入图片描述

    当我们提交到仓库中之后,在使用git status查看,则表示没有需要提交的文件了

  • 相关阅读:
    室内定位解决方案-最新全套文件
    rabbitmq的高级特性
    d借助cppnew与c++互操作
    拓朴排序例题
    编码遗产:解锁祖传代码的秘密与智慧
    FMI标准:实现SkyEye与Simulink无需缝合的联合仿真
    链栈的基本操作c语言
    一个由public关键字引发的bug
    C语言 —— 函数
    魔功心法-枚举篇
  • 原文地址:https://blog.csdn.net/m0_58124165/article/details/134408262