当运行git add  git commit的时候,git底层都做了什么?

这里涉及到的底层命令:
git hash-object 讲对象写入到git object中
git update-index  更新暂存区
git write-tree  创建树对象(相应的有 git read-tree这个例子里没用)
git commit-tree 提交树对象
git cat-file 查看git object对象
git update-ref 创建更新引用对象
git symbolic-ref 更新HEAD指针

初始化一个仓库
$ git init
Initialized empty Git repository in F:/code/test/.git/

给一个文件中写入内容
$ echo "test" >> test.txt

将这个文件写入object中
$ git hash-object -w test.txt
warning: LF will be replaced by CRLF in test.txt.
The file will have its original line endings in your working directory.
9daeafb9864cf43055ae93beb0afd6c7d144bfa4

更新暂存区
$ git update-index --add test.txt
warning: LF will be replaced by CRLF in test.txt.
The file will have its original line endings in your working directory.

写入树对象
$ git write-tree
2b297e643c551e76cfa1f93810c50811382f9117

写入提交对象
$ echo 'first commit' | git commit-tree 2b297e643c
53c9ca31caf6c071b3fe984f66eea8048ff6fe90

通过log查看该提交对象
$ git log 53c9ca3
commit 53c9ca31caf6c071b3fe984f66eea8048ff6fe90
Author: xiaol <413902946@qq.com>
Date: Mon Nov 13 00:04:30 2017 +0800

first commit

通过cat-file查看该提交对象
$ git cat-file -p 53c9ca3
tree 2b297e643c551e76cfa1f93810c50811382f9117
author xiaol <413902946@qq.com> 1510502670 +0800
committer xiaol <413902946@qq.com> 1510502670 +0800

first commit

通过cat-file查看提交对象中的树对象
$ git cat-file -p 2b297e643c
100644 blob 9daeafb9864cf43055ae93beb0afd6c7d144bfa4 test.txt

通过cat-file查看树对象中的文件对象
$ git cat-file -p 9daeafb986
test

上面是通过底层命令完成一次提交的过程,在这个过程中,写入了objects,更新了暂存区,创建了提交对象,到这步也可以通过git log 53c9ca3来查看提交信息了,但是还少了一步,那就是写引用,引用的作用就是一个用户友好的名字,来代替那些SHA-1值,引用被存储在 .git/refs/文件夹中。
$ git update-ref refs/heads/master 53c9ca31caf6c071b3fe984f66eea8048ff6fe90

备注:
  1.本质上其实就是在refs/heads里创建了一个master文件,里面的值是53c9ca31caf6c071b3fe984f66eea8048ff6fe90
  2.其实创建分支就是git update-ref refs/heads/分支名  想要检出分支的SHA-1
  3.标签:
    附注标签:一个标签对象,标签对象指向提交对象,标签指向标签对象
      $ git tag -a v1.1 53c9ca31c -m "test tag"
      $ cat .git/refs/tags/v1.1
      95e1cec6f171640451266f4e709a73a6d9382bf5
      $ git cat-file -p 95e1cec
      object 53c9ca31caf6c071b3fe984f66eea8048ff6fe90
      type commit
      tag v1.1
      tagger xiaol <413902946@qq.com> 1510583034 +0800
      test tag
    轻量标签:一个固定的引用,引用指向一个提交对象   
      $ git update-ref refs/tags/v1.0 53c9ca31caf6c071b3fe984f66eea8048ff6fe90
      xiaol@xiaol-PC MINGW64 /f/code/test (master)
      $ git tag -l
      v1.0
  4.远程引用和分支的区别:
    远程引用是只读的
    虽然可以git checkout到远程引用,但并不会将 HEAD 引用指向该远程引用。
    永远不能通过 commit 命令来更新远程引用
    远程引用被当作服务器上各分支最后已知位置状态的书签来

然后这个引用就创建出来了,并且可以直接使用它来替代53c9c
$ git log master
commit 53c9ca31caf6c071b3fe984f66eea8048ff6fe90
Author: xiaol <413902946@qq.com>
Date: Mon Nov 13 00:04:30 2017 +0800

first commit

最后一个问题是当前分支,也就是HEAD指针,它存在于 .git/ 目录下,本质上存的是指向引用的字符串,可以用cat命令或者文本编辑器打开,但是这样并不安全,git同样提供了一个更加安全的命令:symbolic-ref  当执行git commit的时候,会创建一个提交对象,并用HEAD文件中记录引用的SHA-1值设置提交对象的父提交字段

$ git symbolic-ref HEAD
refs/heads/master

备注: 
  1.切换分支到test其实执行的就是git symbolic-ref HEAD refs/heads/test
  

      

git原理:提交原理的更多相关文章

  1. 代码管理工具 --- git的学习笔记二《git的工作原理》

    通过几个问题来学习代码管理工具之git 一.git是什么?为什么要用它?使用它的好处?它与svn的区别,在Mac上,比较好用的git图形界面客户端有 git 是分布式的代码管理工具,使用它是因为,它便 ...

  2. 深入理解Git的实现原理

      0.导读   本文适合对git有过接触,但知其然不知其所以然的小伙伴,也适合想要学习git的初学者,通过这篇文章,能让大家对git有豁然开朗的感觉.在写作过程中,我力求通俗易懂,深入浅出,不堆砌概 ...

  3. GIT的工作原理和基本命令

    1.GIT的工作原理 工作区:我们写代码的地方. 暂存区:临时存储用的. 历史区:生成历史版本的地方. 提交流程:工作区->暂存区->历史区 图示: 2.GIT的全局配置 3.创建仓库完成 ...

  4. 【Spark Core】TaskScheduler源代码与任务提交原理浅析2

    引言 上一节<TaskScheduler源代码与任务提交原理浅析1>介绍了TaskScheduler的创建过程,在这一节中,我将承接<Stage生成和Stage源代码浅析>中的 ...

  5. 理解git的分支原理,更好地使用git

    文章内容转载于git-scm. 部分内容涉嫌枯燥 一.git分支概念 几乎每一种版本控制系统都以某种形式支持分支.使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作.在很多版本控 ...

  6. 【Git】5、Git如何提交代码到远程仓库

    提交代码:如何把修改后的代码提交到远程仓库 文章目录 提交代码:如何把修改后的代码提交到远程仓库 1.同步远程代码 2.检查改动文件 3.添加文件到缓存 4.提交代码 5.推送代码 6.我的整个流程 ...

  7. 如何避免git每次提交都输入密码

    在ubuntu系统中,如何避免git每次提交都输入用户名和密码?操作步聚如下:1: cd 回车: 进入当前用户目录下:2: vim .git-credentials (如果没有安装vim 用其它编辑器 ...

  8. Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法

    Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法 于是我们可以把上面的语法改写成如下形式:1 合并前缀1 语法分析有自上而下和自下而上两种分析 ...

  9. jquery ready方法实现原理 内部原理

    jquery ready方法实现原理 内部原理 今天闲来无事研究研究jquery.ready()的内部实现,看JQ的源码一头雾水,由于自己很菜了,于是翻了翻牛人的播客,讲述详细,收获颇多. 先普及一下 ...

随机推荐

  1. 在训练CNN时,loss稳定在log(类别数)

    参见知乎问题! https://www.zhihu.com/question/275774218 很多框架都会有一个问题,当卷积 weight NaN 之后,卷积的 output 会变成 NaN.然后 ...

  2. 使用Nginx的proxy_cache缓存功能取代Squid(转)

    Nginx从0.7.48版本开始,支持了类似Squid的缓存功能.这个缓存是把URL及相关组合当作Key,用md5编码哈希后保存在硬盘上,所以它可以支持任意URL链接,同时也支持404/301/302 ...

  3. (转)NSString to string(支持中文)

    NSString to string const char* destDir = [filepath UTF8String]; string a=destDir; string to NSString ...

  4. 在modelsim中加入quartus仿真库

    找到modelsim安装目录下的modelsim.ini文件. 将modelsim.ini的只读属性去掉. 打开quartus软件.选择Launch Simulation Library Compil ...

  5. java中的参数传递——值传递、引用传递

    参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递. 在 Java 应用程序中永远不会传递对象,而只传递对象引用.因此是按引用传递对象.Java 应用程序按引用 ...

  6. codeforces 651a oysticks

      Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status De ...

  7. 源代码分析Fragmentd的BackStack管理过程

    1. Fragment基本使用方法 为了管理Activity中的fragments.须要调用Activity中的getFragmentManager()方法.由于FragmentManager的API ...

  8. FreeMarker调用Java静态方法以及静态变量的方法

    这里介绍下在类似 Spring+FreeMarker 的架构中如何在FreeMarker中访问Java中的静态方法以及静态变量. 一.首先为了方便以及可复用我们创建一个工具类 /** * FreeMa ...

  9. spring cloud与K8S

    链接:https://www.zhihu.com/question/50806354/answer/139653085 spring cloud +docker 当然没有问题,只是当我们搭建集群实现高 ...

  10. ffmpeg中的x264编码选项,对应关系

    )’ Disabled. ‘variance (1)’ Variance AQ (complexity mask). ‘autovariance (2)’ Auto-variance AQ (expe ...