Git is what
总而言之,git是一个分布式的版本管理工具。
首先,版本管理工具,简单说,就是记录你每一次的修改内容,以便版本回退,多方协作的合并等。
在没有接触到多个人合作开发的项目之前,其实用不到这种版本管理工具,因为所有的修改都是一个人完成的,比如编写一个word,哪里修改错了,大不了ctrl+z一直回退,自己写个大项目,哪边做了修改,自己都清楚,有哪些地方先前写了之后用不到,本地删除就行。
但是,一旦涉及多方合作共同开发一个项目,就会有版本管理的问题。假设有如下场景:项目P中的一个文件D,A同学修改了其中的11-55行,B同学修改了其中的35-45行,增加了61-70行,此时A和B就产生了冲突。在没有版本管理工具之前,合作完成的项目,需要人工去合并,大致分为以下几步:
- B把自己本地的项目文件打包发送给A,并且告诉A自己修改的地方
- A根据具体情况处理两个人的修改
- 合并完成之后,将新版的项目文件传回给B
git作为一个版本管理工具,就可以解决这种麻烦的问题。
其次分布式,我就直接抄一段网上的文章好了
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果网速慢的话,一个10M的文件要传10min。
Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
Get start
因为git是分布式,所以本机也可以作为一个版本仓库。我们新建一个本地的项目hello,并把它交由git管理。
git init helo
echo "good night, my friend" > README.md
git add README.md
git commit -m "init and create README"
其中我们用到了git init
,git add
以及git commit
命令。
How git manage your project
不论你是通过git clone从github上拉取的项目,还是自己本地git init创建出来的项目,都会有一个隐藏文件夹.git。git目录存放着整个项目的历史和元信息
HEAD – 记录当前分支;
config – 记录git配置,包含git全局配置和当前项目配置
description – 当前项目详细描述,初始为空,自己写
hooks – 存放shell脚本(暂时还不知道干啥用,哪里用的)
index – 暂存区/索引,非常重要,保存暂存的文件名、文件内容的SHA1哈希串值和文件访问权限等,二进制文件无法直接查看
logs – 日志文件夹,下面又有两个目录HEAD文件和refs文件夹。HEAD文件记录了当前分支下所有执行过的git命令;refs其他分支?
objects – 存放所有的git对象,真正意义上的仓库,所有的文件都会变成git对象/,SHA值的前两位作为目录名,后38位作为目录下文件名
refs – 记录本地/远程分支的SHA值
GIT对象存储及管理
git中一共有四种对象blob
、tree
、commit
和tag
。
blob – 存储文件的内容,代表一个基础文件,被git管理的基础文件都有一个blob对象。一块二进制数据,没有任何其他属性,所以一个项目下不同路径/不同名称的文件,只要内容一样,那就是同一个blob对象。如下图,我们一个项目中有两个相同内容的md文件,不论路径/文件名,他们对象的SHA值都是一样的。git通过比较两个关联文件的SHA值,判断该文件是否发生改变。
tree – 代表一个目录文件,被git管理的目录文件都是一个tree对象。每个tree对象都有若干条目,若干个blob对象/tree对象。只有每个tree包含的内容相同(包含的文件名/文件内容都相同)时,tree对象的SHA相同。git通过比较两个关联文件夹的SHA值,判断该文件夹是否发生改变。
commit – 一次git commit就会生成一个commit对象。git会把每次commit的工作区所有文件都记录下来,与其他“增量文件系统”不同。一个commit对象大致包含如下信息,commit的tree对象,该tree对象可以理解为整个工作区的根目录;上一个版本的commit对象的SHA值;commit的修改的作者,修改时间;commit的实际提交者,提交时间;commit的注释。
根据commit类,tree类以及blob类,我们大致可以梳理出一个git提交时候的模型,即一个版本。
tag –
How to use Git
在正式使用Git之前,我们需要弄清几个基础的概念:版本库,工作区,暂存区