本文整理自Git官方的教程。[url]http://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5-Git-%E5%9F%BA%E7%A1%80[/url]
[size=medium]一,Git是什么 [/size]
[size=small] Git最初是linus大神写的用来管理linux开发的工具,可以说是现在程序员必不可少的代码管理神器。它被广泛运用于代码保存与分享、版本控制、团队协作等诸多方面。
使用Git 的几大好处(功能)如下:
1,代码一旦提交,就被Git记录在案,可以回到历史上任何一个提交的时刻,查看并编辑代码。
2,通过分支,能够非常好地维护开发的流程(比如新功能的开发和临时bug的修复),以及在团队成员之间进行协作。(这是下一篇的内容)
3,绝大多数操作都在本地完成,只有需要读写远程仓库时才需要联网。[/size]
[size=medium]二,Git的基本原理[/size]
[size=small][b]1,使用快照记录文件[/b]
在Git之前的很多版本控制工具(CVS,Subversion,Perforce等)关心的是文件内容的具体差异,即每次记录有哪些文件更新,以及具体更新了什么内容。如下图
[img]http://dl2.iteye.com/upload/attachment/0103/5230/8cc68f1b-d73d-3300-97b4-8465893fb361.png[/img]
而Git则只关心数据的整体是否变化,它保存的不是便后变化的差异,而是对文件的整体做快照,记录到微型的文件系统中。每次提交更新时,对于变化了的文件,Git会做一个快照,并保存指向这次快照的索引;而对于没变化的文件,Git会对之前的快照做一个连接。如下图。
[img]http://dl2.iteye.com/upload/attachment/0103/5232/8639f827-3517-36a5-9e43-5948552b5732.png[/img]
让我们来看一下Git在提交的时候具体做了什么。我们假设当前工作目录中有三个文件,我们先将它们暂存,再提交。
[b]暂存操作[/b]:会对每一个文件计算校验和(SHA-1哈希字符串),然后将单独跟前版本的文件快照保存到Git仓库中(Git使用blob类型的对象存储这些快照),并将校验和加入暂存区域。
[b]提交操作[/b]:此时Git会先计算每一个子目录的校验和(本例中为根目录),然后在Git仓库中将这些目录保存为树对象;然后Git创建新的提交对象,包含了提交信息、指向该树对象的指针,这样一来,就可以此后需要的时候找到此次快照的内容。
此时,从概念上说,仓库中的各个对象保存的数据和相互关系看起来如下图所示:
[img]http://dl2.iteye.com/upload/attachment/0103/5254/d7972aca-ef1c-3f36-9082-b40c8f539cc1.png[/img]
[b]2,Git中的文件状态[/b]
Git眼中的文件分为4中状态:未跟踪的(untracked),已提交的(committed),已修改的(modified),已暂存的(staged)。
[b]未跟踪的[/b]:所有新建的文件,没有使用git add命令添加到Git的跟踪清单中的文件,都处于未跟踪状态。
[b]已提交的[/b]:已经被Git保存了(已经存储了快照),并且没有再做过修改的文件。此时文件时干净安全的。
[b]已修改的[/b]:此前保存了快照,但是又做了新的修改,但还没有被git add命令添加到暂存区域。
[b]已暂存的[/b]:处于跟踪清单中的文件,做了新的修改后,被git add 命令将当前文件的快照添加到了已暂存区域,将在下次提交时保存。
[b]3,Git的工作区域[/b]
和上述的文件的4中状态相对应的,是Git的3个工作区域:工作目录、暂存区域、以及Git目录(本地仓库)
[b]Git目录[/b]:每个项目都有一个Git目录(git clone出来的项目,Git目录就是其中的.git目录),它是Git用来保存元数据和对象数据库的地方,实际上每次克隆镜像仓库的时候,拷贝的就是这个目录的数据。
[b]工作目录[/b]:每次我们从仓库中选中某个版本,并在该版本下工作的时候,实际上就处于工作目录下。工作目录实际上是从Git目录中的压缩对象数据库中提取出来的。
[b]暂存区域[/b]:当我们在工作目录下完成了修改,就需要将快照保存到暂存区域。暂存区域实际上是Git目录中的一个简单的文件。我们最终还需要将暂存区域中的快照转储到Git目录中永久保存起来。
[b]4,Git的工作流程[/b]
综上所述,Git的基本工作流程如下:
1,在工作目录中修改文件。
2,对修改后的文件进行快照,保存到暂存区域。
3,提交更新,将暂存区域中的快照转存到Git目录中。
[/size]
[size=medium]一,Git是什么 [/size]
[size=small] Git最初是linus大神写的用来管理linux开发的工具,可以说是现在程序员必不可少的代码管理神器。它被广泛运用于代码保存与分享、版本控制、团队协作等诸多方面。
使用Git 的几大好处(功能)如下:
1,代码一旦提交,就被Git记录在案,可以回到历史上任何一个提交的时刻,查看并编辑代码。
2,通过分支,能够非常好地维护开发的流程(比如新功能的开发和临时bug的修复),以及在团队成员之间进行协作。(这是下一篇的内容)
3,绝大多数操作都在本地完成,只有需要读写远程仓库时才需要联网。[/size]
[size=medium]二,Git的基本原理[/size]
[size=small][b]1,使用快照记录文件[/b]
在Git之前的很多版本控制工具(CVS,Subversion,Perforce等)关心的是文件内容的具体差异,即每次记录有哪些文件更新,以及具体更新了什么内容。如下图
[img]http://dl2.iteye.com/upload/attachment/0103/5230/8cc68f1b-d73d-3300-97b4-8465893fb361.png[/img]
而Git则只关心数据的整体是否变化,它保存的不是便后变化的差异,而是对文件的整体做快照,记录到微型的文件系统中。每次提交更新时,对于变化了的文件,Git会做一个快照,并保存指向这次快照的索引;而对于没变化的文件,Git会对之前的快照做一个连接。如下图。
[img]http://dl2.iteye.com/upload/attachment/0103/5232/8639f827-3517-36a5-9e43-5948552b5732.png[/img]
让我们来看一下Git在提交的时候具体做了什么。我们假设当前工作目录中有三个文件,我们先将它们暂存,再提交。
[b]暂存操作[/b]:会对每一个文件计算校验和(SHA-1哈希字符串),然后将单独跟前版本的文件快照保存到Git仓库中(Git使用blob类型的对象存储这些快照),并将校验和加入暂存区域。
[b]提交操作[/b]:此时Git会先计算每一个子目录的校验和(本例中为根目录),然后在Git仓库中将这些目录保存为树对象;然后Git创建新的提交对象,包含了提交信息、指向该树对象的指针,这样一来,就可以此后需要的时候找到此次快照的内容。
此时,从概念上说,仓库中的各个对象保存的数据和相互关系看起来如下图所示:
[img]http://dl2.iteye.com/upload/attachment/0103/5254/d7972aca-ef1c-3f36-9082-b40c8f539cc1.png[/img]
[b]2,Git中的文件状态[/b]
Git眼中的文件分为4中状态:未跟踪的(untracked),已提交的(committed),已修改的(modified),已暂存的(staged)。
[b]未跟踪的[/b]:所有新建的文件,没有使用git add命令添加到Git的跟踪清单中的文件,都处于未跟踪状态。
[b]已提交的[/b]:已经被Git保存了(已经存储了快照),并且没有再做过修改的文件。此时文件时干净安全的。
[b]已修改的[/b]:此前保存了快照,但是又做了新的修改,但还没有被git add命令添加到暂存区域。
[b]已暂存的[/b]:处于跟踪清单中的文件,做了新的修改后,被git add 命令将当前文件的快照添加到了已暂存区域,将在下次提交时保存。
[b]3,Git的工作区域[/b]
和上述的文件的4中状态相对应的,是Git的3个工作区域:工作目录、暂存区域、以及Git目录(本地仓库)
[b]Git目录[/b]:每个项目都有一个Git目录(git clone出来的项目,Git目录就是其中的.git目录),它是Git用来保存元数据和对象数据库的地方,实际上每次克隆镜像仓库的时候,拷贝的就是这个目录的数据。
[b]工作目录[/b]:每次我们从仓库中选中某个版本,并在该版本下工作的时候,实际上就处于工作目录下。工作目录实际上是从Git目录中的压缩对象数据库中提取出来的。
[b]暂存区域[/b]:当我们在工作目录下完成了修改,就需要将快照保存到暂存区域。暂存区域实际上是Git目录中的一个简单的文件。我们最终还需要将暂存区域中的快照转储到Git目录中永久保存起来。
[b]4,Git的工作流程[/b]
综上所述,Git的基本工作流程如下:
1,在工作目录中修改文件。
2,对修改后的文件进行快照,保存到暂存区域。
3,提交更新,将暂存区域中的快照转存到Git目录中。
[/size]