git深入讲解

一、仓库的建立

 使用git init命令(这里是从源开始讲,所以不考虑clone那种)之后会产生一个.git目录,说明本地仓库建立成功,里面有四个目录三个文件

其中hooks是一些linux脚本命令,info里面是一个exclude文件,可以在里面抛出一些文件,这俩不经常使用,在这里不做介绍。

object目录是存放git的源数据的地方,这里你的每次add会产生一个源数据,每次commit会产生两个源数据,并且执行reset的时候也不会删除任何一个源数据,所以只要这个目录的文件在,你的一切提交都可以得到恢复。

【小知识,git使用SHA-1算法进行记录每次提交或者修改的指针,其实这个指针在源数据中也可以得到体现,命名为:源数据目录(2字节)+里面文件的名称(38字节)】除了源数据以外还有两个目录,分别是infopack,但是里面一直是空的,具体有什么作用,笔者暂不知道,如果有知道的请告知,谢谢

ref里面有两个目录,分别是headstags(当你将本地仓库与远程仓库进行关联之后还会有一个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记录

今天先写到这,之后还会更新~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值