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的源码一头雾水,由于自己很菜了,于是翻了翻牛人的播客,讲述详细,收获颇多. 先普及一下 ...
随机推荐
- 设计模式之简单工厂模式(C#语言描述)
严格意义上来说,简单工厂模式并不属于GoF的23种设计模式,但是它是学习其他工厂模式的基础和前提条件.理解了简单工厂模式,学习工厂方法模式和抽象工厂模式会比较容易一些. 简单工厂模式的定义 定义一个工 ...
- linux 自启动
使用chkconfig命令可以查看在不同启动级别下课自动启动的服务(或是程序),命令格式如下:chkconfig --list可能输出如下:openvpn 0:关闭 1:开启 ...... 6:关闭 ...
- PyCharm 环境配置
1.去掉“自动保存功能” pycharm默认是自动保存的,习惯自己按 ctrl + s 的可以进行如下设置: 菜单File -> Settings... -> Appearance &am ...
- GEEK学习笔记— —程序猿面试宝典笔记(三)
所谓笔记,就是比較个人的东西,把个人认为有点意思的东西记录下来~~ 程序猿面试宝典笔记(一)基本概念 程序猿面试宝典笔记(二)预处理.const和sizeof 程序猿面试宝典笔记(三)auto_ptr ...
- atitit.跨语言执行cmd cli api的原理及兼容性设计草案
atitit.跨语言执行cmd cli api的原理及兼容性设计草案 1. 标准输入,标准输出,标准错误与重新定向1 2. 常见问题2 2.1. 执行bat文件2 2.2. 执行bat文件 /c ...
- C# 网络打印机ESC指令打印小票
public void SendSocketMsg(String ip, int port, int times, byte[] data) { try { byte[] mData; ) { mDa ...
- Linux Linux程序练习四
编写两个不同的可执行程序,名称分别为a和b,b为a的子进程. 在a程序中调用open函数打开a.txt文件. 在b程序不可以调用open或者fopen,只允许调用read函数来实现读取a.txt文件. ...
- error LNK2019: unresolved external symbol 的一个解决方法
在VS2010中使用opencv时,有时会出现如下类似的连接错误: 解决方法:根据头文件手动指定lib文件 #ifdef _DEBUG #pragma comment(lib,"*.lib& ...
- css3的线性渐变效果
1.代码: <!doctype html> <html lang="en"> <head> <meta charset="UTF ...
- RAC中数据文件创建到了本地路径(非系统表空间) 使用rman转移
环境: 11.2.0.1 + RHEL5.8 參考文档ID:1678747.1 1.模拟创建 一节点: SQL> create tablespace tdb datafile '/u02/app ...