一、仓库的建立
使用git init命令(这里是从源开始讲,所以不考虑clone那种)之后会产生一个.git目录,说明本地仓库建立成功,里面有四个目录三个文件
其中hooks是一些linux脚本命令,info里面是一个exclude文件,可以在里面抛出一些文件,这俩不经常使用,在这里不做介绍。
object目录是存放git的源数据的地方,这里你的每次add会产生一个源数据,每次commit会产生两个源数据,并且执行reset的时候也不会删除任何一个源数据,所以只要这个目录的文件在,你的一切提交都可以得到恢复。
【小知识,git使用SHA-1算法进行记录每次提交或者修改的指针,其实这个指针在源数据中也可以得到体现,命名为:源数据目录(2字节)+里面文件的名称(38字节)】除了源数据以外还有两个目录,分别是info与pack,但是里面一直是空的,具体有什么作用,笔者暂不知道,如果有知道的请告知,谢谢
ref里面有两个目录,分别是heads和tags(当你将本地仓库与远程仓库进行关联之后还会有一个remotes目录),其中heads里面会记录你本地仓库的所有分支的当前HEAD指针(同样适用reset命令等都是在这里面进行修改,新建一个分支只会在这个里面新建一个分支命名的文件,里面记录新建分支的指针位置,由于指针大小为40字节(目录2字节,文件38字节)所以git进行版本回退与新建分支都会非常快)所以remotes同理会先建立远程的目录,如origin,或者其他远程目录,并在远程目录里面记录当前远程里所有分支的当前版本HEAD,tags同理~
config文件记录当前仓库的配置,包括core配置,远程配置,分支配置,当前用户信息配置等【小知识:官网上说明使用git config --global进行配置,其实这个配置是分三个作用域的,分别是system(大)-global(中)-local(小),其中system的设置方式是使用git config -e --system命令打开vi窗口,然后进行配置你的信息】
这里我使用的git版本是windows2.15.1版本的,system作用域的config文件在我的git安装目录下的mingw64目录下的etc目录下的gitconfig文件,可以用记事本手动编辑
global作用域的配置方式使用git config -e --global打开当前用户下的.gitconfig文件
local作用域的使用git config -e打开当前.git仓库的config文件进行配置[这些命令同样可以使用:
(配置system作用域)
$ git config --system user.name "John Doe"
$ git config --system user.email johndoe@example.com
(配置global作用域)
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
(配置local作用域)
$ git config user.name "John Doe"
$ git config user.email johndoe@example.com
]
description文件没有什么用处,HEAD文件指向当前版本
二 文件的提交
新建一个test.txt文件,使用git status命令查看状态
显示这个信息代表git检测到工作目录里面有文件,但是还没有列入暂存区,建议我们使用git add 命令将文件加入暂存区,之后就可以提交了。
这里我们使用git add test.txt命令,我们会在.git仓库里面的objects目录下发现新增了一个文件夹e6,.git仓库新增了一个index文件,但是这个文件无法查看,所有我还不确定这个里面是什么
让我们来使用git commit命令看看会发生什么
在objects文件下同时会新增两个目录,分别是8e,5e
并且在git命令行里面有声明master版本号为8eb74bd,这里取的就是8e目录+里面文件名的前7位(这个也可以在.git\refs\heads里面的master文件里面查看到)
同时在.git仓库里面多了一个logs目录,里面有一个HEAD文件和一个ref目录,并且HEAD文件里面写入的是:
0000000000000000000000000000000000000000
8eb74bd48ddeaf09fa0b8dbe5b2fc855014d4fb9 lichengliang <lichengliang@xinglinload.com> 1514517671 +0800
commit (initial): 1
这里一堆0代表的是第一次操作,后边的8e**代表的是这次操作的指针,还有用户信息触发事件是commit操作。
ref里面记录的是本地仓库中所有分支的操作日志。【小知识:针对.git仓库里面的logs文件夹里面的HEAD文件比较有用,
标记的地方代表的是git记录的版本信息,是与git reflog记录版本信息一一对应的
】
三 分支的创建
这里我们使用git branch branch1命令创建branch1分支
首先我们可以在.git\refs\heads文件夹里面看到branch1文件
然后我们使用git checkout branch1切换到branch1分支上
就可以发现在.git仓库里面的HEAD文件指向了branch1上面:ref: refs/heads/branch1
我们在branch1分支进行修改test.txt文件之后在进行提交
使用git log 可以看到有两条记录,分别是两次commit,reflog稍微不同
上面记录信息,目前HEAD处于branch1分支上,默认为HEAD^0 ,其中HEAD^1是checkout branch1之前的master分支
HEAD^2是第一次提交的master分支(并且是初始化提交)
【小知识:.git\logs\refs\heads下面针对不同分支的日志记录的都是各种自己分支的操作日志记录,
而.git\logs下面的HEAD记录的是整个本地仓库的日志信息,git log git reflog都是在里面提取出来的 ,
差异是git log 查看的仅仅为commit的日志,reflog是操作的所有日志】
四 分支的合并
在master分支执行git merge branch1 代表将branch1分支的内容合并到master上
这时候会在.git仓库记录一个ORIG_HEAD这个文件,这个文件写入的是合并前master(当前分支)中的HEAD版本索引
在主日志HEAD里面会新增一条记录:
8eb74bd48ddeaf09fa0b8dbe5b2fc855014d4fb9 e89da430faedc99f30bed3ed829d6cabfe91ac88 lichengliang <lichengliang@xinglinload.com>
1514524094 +0800 merge branch1: Fast-forward
由于是在master上执行的这个,所有master日志里面也会增加这条记录,而branch1日志里面则不会出现这个
五 分支的查看
使用git branch命令实际上是查看的.git\refs\heads这个目录下的文件,通过.git HEAD文件里面的指向确定当前是哪个分支
六 分支的删除
使用 git branch -d branch1实质是删除.git\refs\heads这个目录下对应的文件,还有相应的日志文件
七 关联远程仓库
执行 git remote add origin http://192.168.101.215/1007027971/test2.git 会在config文件里面写入远程地址信息
使用git pull origin master 命令 实质上是先进行了git fetch origin 然后进行了git merge origin/merge命令进行了合并
然后我们会在.git仓库里面看到FETCH_HEAD文件 并且ORIG_HEAD文件得到了更新
其中FETCH_HEAD文件里面记录的是远程master分支的索引HEAD,并且会在.git\refs里面新建一个remotes文件夹,里面储存origin文件夹在origin文件夹里面有远程分支的记录
还会在.git\logs\refs里面增加remotes在这里面的origin下面新增master分支pull记录
今天先写到这,之后还会更新~