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的源码一头雾水,由于自己很菜了,于是翻了翻牛人的播客,讲述详细,收获颇多. 先普及一下 ...
随机推荐
- ST股福音:涨停潮开始! 最全ST摘帽股汇总!
本周ST股摘帽行情提前预演,ST股上演涨停潮,部分ST股甚至出现连续涨停.云财经在三季报披露之前曾经做过一期ST股摘帽分析,在三季报正式披 露完毕后,以及部分ST公司公布了2015年年报预告,ST股能 ...
- filebeat 选项
Filebeat Options input_type: log|stdin 指定输入类型 paths 支持基本的正则,所有golang glob都支持,支持/var/log/*/*.log enco ...
- ubuntu 12.04上安装sougou输入法
1.卸载ibus sudo apt-get install ibus 2.添加源 sudo add-apt-repository ppa:fcitx-team/nightly 3.更新源 sudo a ...
- iOS- 详解文本属性Attributes(转)
iOS- 详解文本属性Attributes 1.NSKernAttributeName: @10 调整字句 kerning 字句调整 2.NSFontAttributeName : [UIFont s ...
- 活动招募 HUAWEI HiAI公开课·北京站-如何在4小时把你的APP变身AI应用
人工智能和机器学习是全球关注的新趋势,也是当前最火爆.最流行的话题.当你拿手机用语音助手帮你点外卖,智能推荐帮你把周边美食一网打尽:当你拿起P20拍照时,它将自动识别场景进行最美优化,让你成为摄影大师 ...
- OC 字符串出来
//1.获取字符串的长度 NSString * str = @"abcd"; NSUInteger length = [str length]; //str.length; NSL ...
- 第4步:创建RAC共享磁盘组
方法一:使用asmdevices(推荐使用,但不适用EMC Powerpath) )查看硬盘的SCSI号,两个机器认到的/dev/sda对应在实际的物理盘可能不是一块,但scsi号肯定是完全一致的. ...
- Android无线测试之—UiAutomator UiObject API介绍三
拖拽与滑动 一.拖拽与滑动的示意图 二.拖拽与滑动相关的API 返回值 API 描述 boolean dragTo(UiObject destObj, int setps) 拖拽对象到另一个对象位置上 ...
- 使用jQuery lazyload 实现图片延迟加载
下载地址 使用说明 0. 准备工作 下载jQuery和lazyload 插件(地址如上) 1. HTML 引入jQuery库和lazyload插件 <div id="imagesCon ...
- fiddler抓包工具使用图文教程
一.软件简介: 一款免费且功能强大的数据包抓取软件.它通过代理的方式获取程序http通讯的数据,可以用其检测网页和服务器的交互情况,能够记录所有客户端和服务器间的http请求,支持监视.设置断点.甚至 ...