zoukankan      html  css  js  c++  java
  • git使用三

    本章将围绕对象数据库和索引文件展开,便于理解git的工作机制和原理
    1. 先建立一个git仓库
    $ mkdir test-project
    $ cd test-project
    $ git init
    $ echo ‘Hi, sinaxyz’>file.txt
    $ git add .
    $ git commit -a -m “initial commit” //此处的-m选项表示“后面的参数是本次提交的历史记录”
    $ echo ‘Hi, sinaxyz!’>file.txt
    $ git commit -a -m “add emphasis”
    $ git log //使用log命令查看一下
    通过前面所学可知,git会对每次commit生成一个长串的十六进制(共40位),这是一个SHA1哈希数,保证每次commit后生成的值都是唯一的。
     
    $ git cat-file -t 241e //cat-file命令中-t选项表示列出相应ID的对象类型;241e是刚才commit后得出的SHA1码
    commit //可以看到此ID对应的对象类型为一次commit
    $ git cat-file commit 241e //此处的commit表示要查询的是一个对象类型为commit的对象,后面给出此对象的ID
    tree 9a327d5e3aa818b98ddaa7b5b369f5deb47dc9f6
    命令输出结果中包含了tree,tree的ID表示了一个BLOB对象(二进制对象),此对象对应着一个文件或另一个tree。你可以使用ls-tree命令来查询关于这个tree的更详细信息:
    $ git ls-tree 9a327
    100644 blob 7d4e0fa616551318405e8309817bcfecb7224cff file.txt
    可以看到9a327这棵树上包括了一个file.txt文件,其ID为7d4e0f
     
    $ git cat-file -t 7d4e0f
    $ git cat-file blob 7d4e0f
    可以看到7d4e0f对应的对象的类型是blob,而其内容就是“Hi, sinaxyz”
     
    2. 所有的对象信息都存储在.git/objects/目录下,使用find命令可以看到。
    这些对象都是被压缩过的,其类型可以是blob,tree,commit或tag。其中包括了对象长度、对象类型和对象的内容。
     
    3. 在.git目录下的HEAD文件比较特殊,查看.git/HEAD文件:
    $ cat HEAD
    $ git branch
    可以看到HEAD文件指示出当前所在的分支名称是master。其实更引起我们兴趣的是HEAD文件中所指示的这个路径“refs/heads/master”
    HEAD所指向的是最后一次commit的信息,而且经测试可知parent指的是上一次commit的信息。
     
    因此总的来说,对象数据库的管理方式是,commit对象会指向一个tree对象,即在历史记录中当前结点的tree目录的镜像;也会指向父母(parent)commit,这是为了和之前的commit建立关联。
    tree对象用于显示一个目录的状态,tree对象中包含了blob对象和子目录对象。
    blob对象包含的是文件的数据。
    每个分支的HEAD会存储在.git/refs/heads中。同时,当前所在分支的头部会存储在.git/HEAD中。
     
    4. 通过上面介绍的索引文件的作用。我们在提交工作时,使用最多的命令就是git commit -a了,但是这个将提交你所做的所有工作。其实,如果你了解commit的工作机制,你会知道我们可以自定义提交哪些部分到哪些工作树中,其实自由度很大的。
    $ echo “Hi, sinaxyz!!!”>>file.txt
    $ git diff //不急着执行commit命令,而是先用git diff看看差别情况
    $ git add file.txt //add一下,然后再git diff,看看diff有什么变化
    $ git diff //输出为空
    $ git diff HEAD //看到修改报告
    这就说明了一个问题:git diff不是在和HEAD比,而是和另外一个“神秘”内容在比,而这个“神秘”内容就是“索引文件”!
    索引文件(index file)就是.git/index文件,它是二进制形式的文件。我们可以用ls-files来检查它的内容。
    结论是git add的作用就是创建一个blob文件来记录最新的修改代码,并且在index file里添加一个到此blob的链接。
     
    5. 如果在git-diff后面加上参数HEAD,则git-diff会显示当前工作目录和最近一次提交之间的代码区别。
    $ git diff HEAD
    如果使用参数–cached,则会比较index file和最近一次提交之间的代码区别。
    $ git diff –cached
     
    通俗的解释就是:git维护的代码分成三部分,“当前工作目录”<->“index file”<->git仓库。
    git commit会将index file中的改变写到git仓库;git add会将“当前工作目录”的改变写到“index file”;“commit -a”则会直接将“当前工作目录”的改动同时写到“index file”和“git仓库”。
     
    6. status命令会显示当前状态的一个简单总结:
    $ git status
  • 相关阅读:
    Tizen Sample Web Applications
    Linux下RPM软件包的安装及卸载
    libevent
    GTest 运行参数
    【BBC micro:bit基础教程】02-micro:bit与人体运动检测传感器
    【BBC micro:bit基础教程】01-如何用按键控制一个LED
    CMD下查询Mysql中文乱码的解决方法
    php foreach 使用&(与运算符)引用赋值要注意的问题
    sql必知必会(第四版) 学习笔记一
    test
  • 原文地址:https://www.cnblogs.com/sinaxyz/p/2998733.html
Copyright © 2011-2022 走看看