git的基本原理
git 是一个版本控制工具。可以帮忙我们更好的管理自己的文件。
下面是一个我们经常使用的一些基本命
先简单介绍下这几个区域:
工作区:就是我们写代码的地方。
暂存区:当我们写完后,使用git add命令就可以将自己的文件放入暂存区。
本地仓库:使用git commit后会将暂存区的文件提交到本地仓库
远程仓库:和本地仓库一样,只不过是远程的,可以供其他人下载。
首先我们我们初始化一个本地仓库 git init
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 add test1.txt
发现objects里面多了一个d1/d06ad36a5841e8c06a90bd29707290d979cc2b,这个d1其实为了快速定位文件的,实际上和后面的文件名拼接成一个SHA1 160bit(40位)文件加密结果, 有点类似于桶排序。
查看这个文件类型,为blob类型
查看文件内容,里面是1111,可以看到并没有存储文件名信息的。
同时index文件也发生了变化,使用git提供的命令查看,发现这里记录文件名,同时指向了上面的文件,这样文件名和文件内容都存储了。
2、接着看看git commit
首先是object里面又生成了两个文件,分别查看一下,可以看到多了分别多了一个commit和tree类型的文件。
commit文件存储的此次commit的相关信息,如提交人、提交时间等等,里面有一个tree文件指针。
tree文件里面有文件名,同时指向了blob文件,blob文件里面有文件的内容。
同时在ref/heads下面生成了master文件,里面记录了这次的commit指针,表示当前分支的最新commit。
那如果有目录怎么办,这里新建一个文件dir2/test2.txt,文件内容2222,指向git add,git commit后,
dir2被当成一个tree,可以依次类推。
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
第二种情况,有分叉,不能直接移动过去,这个时候会新生成一个commit,指向一个新的tree对象。这个新的commit会有两个parent commit