Git基础
1.直接记录快照,而非差异比较
Git和其它版本控制系统(包括Subversion和近似工具)的主要差别在于Git对待数据的方法,概念上区分,其它大部分系统以文件变更列表的方式存储信息。这类系统(CVS、Subversion、Perforce、Bazaar等等)将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。
Git不按照以上方式对待或保存数据。反之,Git更像是把数据看作是对小型文件的一组快照。每一提交更新,或在Git中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git不再重新存储该文件,而是只保留一个链接指向之前存储的文件。Git对待数据更像是一个快照流。
这是Git与几乎所有其它版本控制系统的重要区别。因此Git重新考虑了以前每一代版本控制系统延续下来的诸多方面。Git更像是一个小型的文件系统,提供了许多以此为基础构建的超强工具,而不只是一个简单的VCS。
2.Git保证完整性
Git中所有的数据在存储前都计算校验和,然后以校验和来引用,这意味着不可能在Git不知情时更改任何文件内容或目录内容,这个功能建构在Git底层,是构成Git哲学不可或缺的部分。若在传送过程中丢失信息或损坏文件,Git就能发现。
Git用以计算校验和的机制叫做SHA-1散列(hash,哈希),这是一个由40个十六进制字符组成的字符串,基于Git中文件的内容或目录结构计算处来。
实际上,Git数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。
3.Git一般只添加数据
执行Git操作,几乎只往Git数据库中增加数据。很难让Git执行任何不可逆操作,或者让它以任何方式清除数据。同别的VCS一样,未提交更新时有可能丢失或弄乱修改的内容;但是一旦你提交快照到Git中,就难以再丢失数据,特别是如果定期的推送数据库到其它仓库的话。
4.三种状态
Git有三种状态:已提交(committed)、已修改(modified)、以暂存(staged)。已提交表示数据已经安全的保存在本地数据库中。已修改表示修改了文件,但还没保存到数据库中。已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
由此引入Git项目的三个工作区域的概念:Git仓库、工作目录以及暂存区域。
Git仓库目录是Git用来保存项目的元数据和对象数据库的地方。这是Git中最重要的部分。从其它计算机克隆仓库时,拷贝就是这里的数据。
工作目录是对项目的某个版本独立提取出来的内容。这些从Git仓库的压缩数据库中提取出来的文件,放在磁盘上供用户使用或修改。
暂存区域是一个文件,保存了下次提交的文件列表信息,一般在Git仓库的工作目录中。有时候也别称为"索引",但更一般的说法是暂存区域。
基本的Git工作流程如下:
1.在工作目录中修改文件
2.暂存文件,将文件的快照放入暂存区域
3.提交更新,找到暂存区域的文件,将快照永久性存储到Git仓库目录。
如果Git仓库目录中保存着特定版本的文件,就属于已提交状态。如果做了修改并已存放入暂存区域,就属于已暂存状态。如果上次取出后,做了修改但还没放入暂存区域,就是已修改状态。