git 是一个版本控制工具。可以帮忙我们更好的管理自己的文件。

下面是一个我们经常使用的一些基本命

 

git 仓库 主流 git仓库原理_git 仓库 主流

 

 

 先简单介绍下这几个区域:

工作区:就是我们写代码的地方。

暂存区:当我们写完后,使用git add命令就可以将自己的文件放入暂存区。

本地仓库:使用git commit后会将暂存区的文件提交到本地仓库

远程仓库:和本地仓库一样,只不过是远程的,可以供其他人下载。

 

首先我们我们初始化一个本地仓库 git init 

git 仓库 主流 git仓库原理_暂存区_02

 

hooks: 里面都是一些勾子文件,可以自己去扩展

info/exclude: 当前仓库的排除信息

objects/infos、objects/pack:两者里面都是空的

refs/head、refs/tags:两者都是空的

config: git配置信息,可以配置自己的用户名邮箱

description: 仓库描述信息

 

 HEAD: 指向了refs/heads/master文件

ref: refs/heads/master

 

1、首先看看git add到底做了什么

首先新建一个文件,test1.txt,文件内容为1111,可以看到.git下文件并没有发送变化

git 仓库 主流 git仓库原理_git 仓库 主流_03

 

 

执行git add test1.txt

发现objects里面多了一个d1/d06ad36a5841e8c06a90bd29707290d979cc2b,这个d1其实为了快速定位文件的,实际上和后面的文件名拼接成一个SHA1 160bit(40位)文件加密结果, 有点类似于桶排序。

查看这个文件类型,为blob类型

git 仓库 主流 git仓库原理_文件名_04

 

 

 查看文件内容,里面是1111,可以看到并没有存储文件名信息的。

git 仓库 主流 git仓库原理_git 仓库 主流_05

 

同时index文件也发生了变化,使用git提供的命令查看,发现这里记录文件名,同时指向了上面的文件,这样文件名和文件内容都存储了。

git 仓库 主流 git仓库原理_git_06

 

 

 

 2、接着看看git commit

git 仓库 主流 git仓库原理_git 仓库 主流_07

 

 

 首先是object里面又生成了两个文件,分别查看一下,可以看到多了分别多了一个commit和tree类型的文件。

commit文件存储的此次commit的相关信息,如提交人、提交时间等等,里面有一个tree文件指针。

tree文件里面有文件名,同时指向了blob文件,blob文件里面有文件的内容。

git 仓库 主流 git仓库原理_git 仓库 主流_08

 

 

 

git 仓库 主流 git仓库原理_文件名_09

 

 

 

git 仓库 主流 git仓库原理_文件名_10

同时在ref/heads下面生成了master文件,里面记录了这次的commit指针,表示当前分支的最新commit。

 那如果有目录怎么办,这里新建一个文件dir2/test2.txt,文件内容2222,指向git add,git commit后,

dir2被当成一个tree,可以依次类推。

git 仓库 主流 git仓库原理_git 仓库 主流_11

git 仓库 主流 git仓库原理_暂存区_12

 

 

git 仓库 主流 git仓库原理_git 仓库 主流_13

 

3、接着看下git pull命令,git pull首先会拉下远程

 首先会在ref/remotes/origin下生成对应分支的文件,如master文件。

里面记录了其它远程分支master分支的最新commit,当然也是放在object目录下。

接着会执行git merge,用远程最新的commit和本地分支的commit进行一个merge,所有如果你本地有commit的话,很可能会出现冲突。

最后就是index文件重写,会根据最新的commit文件重写index文件,同时你的工作区文件也会被覆盖。所以类似于idea的编辑器在你pull时,都会提示你先git stash。

所以git pull 也等于git fetch+git merge。

 

4、最后谈谈git merge,将dev merger到master。

第一种情况,如果不存在分叉,直接将master最新commit指向commit4,很快,没有冲突。也称为fast-forward

git 仓库 主流 git仓库原理_git_14

 

 第二种情况,有分叉,不能直接移动过去,这个时候会新生成一个commit,指向一个新的tree对象。这个新的commit会有两个parent commit

git 仓库 主流 git仓库原理_git_15

 

git 仓库 主流 git仓库原理_暂存区_16

 

 

git 仓库 主流 git仓库原理_文件名_17