git原理:提交原理
当运行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原理:提交原理的更多相关文章
- 代码管理工具 --- git的学习笔记二《git的工作原理》
通过几个问题来学习代码管理工具之git 一.git是什么?为什么要用它?使用它的好处?它与svn的区别,在Mac上,比较好用的git图形界面客户端有 git 是分布式的代码管理工具,使用它是因为,它便 ...
- 深入理解Git的实现原理
0.导读 本文适合对git有过接触,但知其然不知其所以然的小伙伴,也适合想要学习git的初学者,通过这篇文章,能让大家对git有豁然开朗的感觉.在写作过程中,我力求通俗易懂,深入浅出,不堆砌概 ...
- GIT的工作原理和基本命令
1.GIT的工作原理 工作区:我们写代码的地方. 暂存区:临时存储用的. 历史区:生成历史版本的地方. 提交流程:工作区->暂存区->历史区 图示: 2.GIT的全局配置 3.创建仓库完成 ...
- 【Spark Core】TaskScheduler源代码与任务提交原理浅析2
引言 上一节<TaskScheduler源代码与任务提交原理浅析1>介绍了TaskScheduler的创建过程,在这一节中,我将承接<Stage生成和Stage源代码浅析>中的 ...
- 理解git的分支原理,更好地使用git
文章内容转载于git-scm. 部分内容涉嫌枯燥 一.git分支概念 几乎每一种版本控制系统都以某种形式支持分支.使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作.在很多版本控 ...
- 【Git】5、Git如何提交代码到远程仓库
提交代码:如何把修改后的代码提交到远程仓库 文章目录 提交代码:如何把修改后的代码提交到远程仓库 1.同步远程代码 2.检查改动文件 3.添加文件到缓存 4.提交代码 5.推送代码 6.我的整个流程 ...
- 如何避免git每次提交都输入密码
在ubuntu系统中,如何避免git每次提交都输入用户名和密码?操作步聚如下:1: cd 回车: 进入当前用户目录下:2: vim .git-credentials (如果没有安装vim 用其它编辑器 ...
- Atitit 表达式原理 语法分析 原理与实践 解析java的dsl 递归下降是现阶段主流的语法分析方法
Atitit 表达式原理 语法分析 原理与实践 解析java的dsl 递归下降是现阶段主流的语法分析方法 于是我们可以把上面的语法改写成如下形式:1 合并前缀1 语法分析有自上而下和自下而上两种分析 ...
- jquery ready方法实现原理 内部原理
jquery ready方法实现原理 内部原理 今天闲来无事研究研究jquery.ready()的内部实现,看JQ的源码一头雾水,由于自己很菜了,于是翻了翻牛人的播客,讲述详细,收获颇多. 先普及一下 ...
随机推荐
- python--web项目
zope:一个容器项目Plone:一个基于zope的工作流和内容管理项目trac:一个项目管理(任务指派.bug追踪项目,可以和subversion集成)moinmoin:一个强力的weiki系统
- [ci] 构建触发器,实现当gitlab有push动作时候,jenkins自动拉代码.
构建触发器,实现当gitlab有push动作时候,jenkins自动拉代码. 拉取gitlab代码库: jenkins安装git插件 配置gitlab服务器和jenkins服务器身份互信 jenkin ...
- JavaScript之语句
ECMA-262 规定了一组语句(也称为流控制语句).从本质上看,语句定义了 ECMAScript 中的主要语法,语句通常使用一或多个关键字来完成给定任务. if语句 if语句是最常见的一种语句,语法 ...
- pthread linux mutet:example1
#include<iostream> #include<unistd.h> #include<pthread.h> #include<string> u ...
- discuz论坛模板文件目录
公共模板文件夹 ./template/default/common/ common.css 公共CSS文件 faq.htm 帮助模板文件 footer.htm 系统总底部模板 footer_ajax. ...
- Git merge two repositories (ZZ)
转自 https://stackoverflow.com/questions/2428137/how-to-rebase-one-git-repository-onto-another-one If ...
- GoWeb编程之HelloWorld
使用Go实现我们的第一个Web服务器程序 package main import "net/http" import "fmt" //打印HelloWorld ...
- Harmonic Number 求Hn; Hn = 1 + 1/2 + 1/3 + ... + 1/n; (n<=1e8) T<=1e4; 精确到1e-8; 打表或者调和级数
/** 题目:Harmonic Number 链接:https://vjudge.net/contest/154246#problem/I 题意:求Hn: Hn = 1 + 1/2 + 1/3 + . ...
- ImageData
http://www.html5china.com/HTML5features/canvas/20120501_3591.html 1.上下文对象 Context 有三个方法用来创建.读取和设置 Im ...
- OC 基础语法
:Obect c 与 c 语言的区别 () 后缀名不一样,C语言是.c 结尾 ,OC 是 .h结尾. () 输出信息不同 C语言是用print() 输出,OC 是用NSLog输出. () NSLog会 ...