Git教程第一篇:Git原理入门

Git教程第一篇:Git原理入门

一、Git是分布式版本管理工具

目前主流的版本管理工具可分为集中式(如SVN)与分布式(GIT),。
集中式版本控制系统,版本库是集中放在中央服务器的,工作时需要从中央服务器拿到最新的版本,多人共同开发时,只有某个人先同步到服务器,其他人才能在他开发的基础上继续。集中式版本控制系统必须联网,因此有带宽的要求。
分布式版本控制系统,简单说就是每个开发者都有本地的一个完整版本库,在无网环境下,也可以开发,对于同一文件的开发,可以同时进行。

二、Git流程图

Clone
Checkout
Add
Commit
Push
Pull
远程仓库Remote
本地仓库Repository
工作区Workspace
暂存区Index/Stage

工作区:就是你在电脑里能看到的目录,磁盘目录,
版本库(本地仓库):工作区有一个隐藏目录.git, 这个不是工作区,而是Git的本地版本库,Git版本库里有很多东西,其中很重要的一块是index暂存区
远程仓库:远程仓库是git的远程服务器,多人协作通过远程仓库同步

三、Git目录

git目录
Git里很重要的一块是index暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD
git文件提交
当你创建了一个git项目,并且在工作空间添加或修改文件,执行git add后,就将添加或修改的内容提交到stage(或称index);而执行git commit就是将暂存区的所有修改内容一次性提交给了本地仓库了;执行git commit后,如果你又没有对工作区做任何修改,那么暂存区就是“干净”的
index clean

$ git status
On branch master
nothing to commit, working tree clean

最后,你再执行git push就将本地仓库的内容同步到远程仓库了。

四、Git过程详解

下面,我们以一个实例,解释Git的运行过程,帮助理解Git原理

初始化

首先,让我们创建一个项目目录,并进入。

$ mkdir git_demo && cd git_demo

要对该工作目录进行git版本管理,第一件事就是使用git init命令,进行初始化。

$ git init

git init命令只做一件事,就是在项目根目录下创建一个.git子目录,用来保存版本信息。

$ ls .git
branches/
config
description
HEAD
hooks/
info/
objects/
refs/

保存对象

接下来,新建一个空文件夹doc.txt,并且把这个文件加入Git仓库,也就是为doc.txt的当前内容创建一个副本

$ touch test.txt
$ git hash-object -w doc.txt
e69de29bb2d1d6434b8b29ae775ad8c2e48c5391

上面代码中,git hash-object命令把doc.txt的当前内容压缩成二进制文件,存入Git。压缩后的二进制文件,称为一个Git对象,保存在.git/objects目录

暂存区

文件保存成二进制对象以后,还需要通知Git哪些文件发生了变动。所有变动的文件,Git都记录在一个区域,叫做“暂存区(index或stage)”,再统一把暂存区里面的文件写入正式版本历史。
git update-index用于在暂存区记录一个发生变动的文件。

$ git update-index --add --cacheinfo 100644 \
3b18e512dba79e4c8300dd08aeb37f8e728b8dad doc.txt

上面命令向暂存区写入文件名doc.txt、二进制对象名(哈希值)
和文件权限

git add 命令

上面两步(保存对象和更新暂存区),如果每个文件都做一遍,那是很麻烦的。Git提供了git add命令简化操作

commit概念

暂存区保留本次变动的文件信息,等到修改了差不多了,就要把这些信息写入历史,这就相当于生成了当前项目的一个快照(snapshot)

项目的历史就是由不同时点的快照构成。Git可以将项目恢复到任意一个快照。快照在Git里面有一个专门名词,叫做commit,生产快照又称为完成一次提交(下面所有提到“快照”的地方,指的就是commit)
首先,设置一下用户名和Email,保存快照的时候,会记录是谁提交的。

$ git config user.name "用户名"
$ git config user.email "Email 地址"

接下来,要保存当前的目录结构。前面保存对象的时候,只是保存单个文件,并没有记录文件之间的目录关系(哪个文件在哪里)

git write-tree命令用来将当前的目录结构,生成一个Git对象,目录对象也是作为二进制保存在.git/objects目录里面,对象名就是哈希值。

所谓快照,就是保存当前的目录结构,以及每个文件对应的二进制对象。上一个操作,目录结构已经保存好了,现在需要将这个目录结构与一些元数据一起写入版本历史。
git commit-tree命令用于将目录树对象写入版本历史

$ echo "first commit" | git commit-tree c3b8bb102afeca86037d5b5dd89ceeb0090eae9d
c9053865e9dff393fd2f7a92a18f9bd7f2caa7fa

上面代码中,提交的时候需要有提交说明,echo "first commit"
就是给出提交说明。然后,git commit-tree将元数据和目录树,一起生成一个Git对象

Git commit命令,简化提交的操作。保存进暂存区以后,只要git commit一个命令,就同时提交目录结构和说明,生成快照

$ git commit -m "first commit"

分支(branch)

所谓分支(branch)就是指向某个快照的指针,分支名就是指针名。哈希值是难以记忆的,分支就是快照的别名。比如,master分支就是由一个叫做master指针,它指向的快照就是master分支的当前快照

用户可以对任意快照新建指针。比如,新建一个fix-typo分支,就是创建一个叫做fix-typo的指针,指向某个快照。所以,GIt新建分支特别容易,成本极低。

Git有一个特殊指针HEAD,总是指向当前分支的最近一次快照。另外,Git还提供简写方式,HEAD^指向HEAD的前一个快照(父节点)。

每一个分支指针都是一个文本文件,保存在.git/refs/heads/目录,该文件的内容就是它所指向的快照的二进制对象名(哈希值)


参考 :

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值