Skip to content

Shenjinghao/JHGit

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

探究git的基础工作原理

简书地址

git基本命令还可以参考Pro Git; 以下是mac系统终端操作,常用命令可以参考http://www.jianshu.com/p/3291de46f3ff

** 附上方便操作的终端快捷键**

Command + K 清屏 Command + T 新建标签 Command +W 关闭当前标签页 Command + S 保存终端输出 Command + D 垂直分隔当前标签页 Command + Shift + D 水平分隔当前标签页 Command + shift + {或}向左/向右切换标签

git基本操作流程

  1. 创建测试文件夹,名字我命名为JHGit;
mkdir JHGit

目录下的文件

2.切换到JHGit文件夹下

cd JHGit

3.初始化git

git init

初始化后的文件夹目录

4.先查看下.git文件内容

vi .git   //或者  
cd .git

vim编辑器下的内容

**也可以使用tree命令! 温馨提示:mac下默认是没有 tree命令!!!**下面几个方法可以试试

1.可以使用find命令模拟出tree命令的效果

find . -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'

2.手动alias一下,在你的.bash_profile或者.zshrc中添加:(前提你已经安装了oh-my-zash)

alias tree="find . -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'"

3.可以使用 homebrew 安装 tree 命令行:

brew install tree

Paste_Image.png

5.HEAD

当前所在分支

6.查看下config里面的东西:设置了一些默认的参数之类的

cat .git/config

config

7.description是描述文件

对当前库的描述

8.根据HEAD打印的路径提示找到refs/heads/下

HEAD路径

9.hooks(脚本文件夹),具体了解可以参考GIt Hooks

Paste_Image.png

10.info里面的exclude objects里面的info和pack目前都是空文件

11.和远程仓库建议联系

git remote add origin https://github.com/Shenjinghao/JHGit

** 注意:连接简历后,可以正常git pull代码,但是如果不做修改,是无法git push提交代码,原因是此时的master的分支不指向任何commit。**

其实这里也可以通过git clone命令跳过和远程仓库连接这一步!

git clone https://github.com/Shenjinghao/JHGit.git

连接后config内容变为下图 连接后的config内容

12.使用touch命令创建个test1文件,工作区会提示,通过命令

git add test1

将test1添加到暂存区,也可以跳过add阶段,既跳过使用暂存区域,直接把已经跟踪的文件暂存起来一起提交。

git commit -am“xx”  ||   git commit -a -m“xx”

创建commit

添加暂存区

提交commit

然后此时的.git变化如下

变化后的.git

变化的.git

使用log命令可以看到最近的log日志

git log

git log

.git的新增内容

对应关系

从上面几幅图可以看出,提交的commit消息,最新的commit id和origin的commit id都会被保存

下面引入git的主要工作方式

三个区域
  • 工作区
  • 暂存区
  • git仓库
Three Sections

四种状态

已跟踪(tracked)已提交(commited) 已修改(modified) 已缓存(staged)

  • 在工作目录中修改某些文件

  • 对修改的文件做快照,并保存到暂存区

  • 提交更新,将保存在暂存区的文件快照储存到git目录中

  • changed but not updated:已跟踪文件内容发生改变,并没有放入缓存区

  • Changes to be committed:已存入缓存状态

  • Untracked files: git 不会自动将之纳入跟踪范围

Four States

git 原理工作图

暂存区index

index文件是个二进制文件,用cat命令是无法打开的

index 一堆乱码

使用

hexdump -C index 

index内部数据

具体数据代表的意义可以参考git index data format

总结

先打印log

git log

通过命令

git cat-file -p <commit id>

git cat-file

通过以上数据可以发现git所有功能都基于三棵树。
  • 第一棵树:所有提交的commit组成一棵树,分别指向不同版本的提交
  • 第二棵树:每个commit代表一棵树,里面包含所有指向子树的commit(tree),指向上一次的commit id(parent),每个tree里面有包含下一级的tree,blob文件的快照。
  • 第三课树:index暂存区

综上所述,git的实现都是通过比较遮三棵树而进行工作的。

git-fire

References

  1. Git 官方文档
  2. Git man page
  3. A Little Of Git's Internals
  4. sed编辑二进制文件
  5. git index data format

About

深入学习Git

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published