基本概念
Git 是一个分布式版本控制系统,它的工作原理和其他版本控制系统(如CVS、Subversion或Perforce等)有很大的不同。理解Git的基本概念和工作原理对于有效地使用Git至关重要。
差异
Git与其他版本控制系统最大的区别在于它对待数据的方式。概念上,大多数其他系统将信息存储为一系列基于文件的变更。这些其他系统(如CVS、Subversion、Perforce等)将存储的信息视为一组文件以及随时间对每个文件所做的更改(通常被描述为基于增量的版本控制)。如图所示:
在Git中,数据模型不同。Git将数据存储为一系列快照,每次提交(commit)都会创建一个完整项目状态的快照。因此,Git更像是一个文件系统,它在管理项目的快照上工作,而不是仅仅记录文件的更改。
这种快照式的方式使得Git具有高效的性能和强大的功能,包括快速的分支和合并、本地提交和撤销等。此外,Git的这种数据模型也使得它更适合处理大型项目和高度分散的团队协作。
本地操作
几乎每个操作在 Git 中都只需要本地文件和资源来进行,通常不需要从网络上的其他计算机获取信息。如果你习惯了CVCS,那么大多数操作都需要承担网络延迟的开销,而Git则不同,它让人感觉好像拥有了超凡脱俗的速度。因为你的本地磁盘上有整个项目的历史记录,所以大多数操作似乎几乎是瞬间完成的。
例如,要浏览项目的历史记录,Git 不需要从服务器获取历史记录然后再显示给你看,它直接从本地数据库中读取。这意味着你几乎可以立即看到项目的历史记录。如果你想查看当前文件版本与一个月前文件之间的更改,Git 可以查找一个月前的文件并进行本地的差异计算,而不必请求远程服务器或者将旧版本的文件从远程服务器拉取到本地再进行计算。
这也意味着,如果你处于离线状态或者没有连接 VPN,你几乎可以做任何事情。如果你坐飞机或者火车想要做一点工作,你可以愉快地提交(记住,提交到本地副本)直到连接到网络之后再上传。如果你回家了但是无法正常工作 VPN 客户端,你依然可以工作。在许多其他系统中,要么是不可能的,要么是非常麻烦的。比如,在 Perforce 中,当你没有连接到服务器时,你几乎无法做任何事情;在 Subversion 和 CVS 中,你可以编辑文件,但是无法提交更改到你的数据库中(因为你的数据库处于离线状态)。这可能看起来不像是一件大事,但是你可能会惊讶于它能带来的巨大影响。
Git 具有完整性
在 Git 中,所有的东西都在存储之前进行了校验和检查,并且随后都会被其校验和引用。这意味着无法在 Git 不知情的情况下更改任何文件或目录的内容。这种功能被构建在 Git 的最底层,是其哲学的核心。你不可能在传输中丢失信息,也不可能出现文件损坏而 Git 没有检测到。
Git 用于此校验和检查的机制被称为 SHA-1 哈希。这是一个由十六进制字符(0-9和a-f)组成的40字符字符串,根据 Git 中文件或目录结构的内容计算得出。SHA-1 哈希看起来像这样:
24b9da6552252987aa493b52f8696cd6d3b00373
在 Git 中,你会在各个地方看到这些哈希值,因为它们被大量使用。事实上,Git 将所有内容都存储在其数据库中,而不是通过文件名,而是通过其内容的哈希值。
Git 通常只添加数据
当你在 Git 中执行操作时,几乎所有操作都只会向 Git 数据库中添加数据。很难让系统执行任何不可撤销的操作或以任何方式擦除数据。和任何版本控制系统一样,你可能会丢失或破坏尚未提交的更改,但是一旦将快照提交到 Git 中,就很难丢失,特别是如果你定期将你的数据库推送到另一个存储库中。
这使得使用 Git 成为一种乐趣,因为我们知道我们可以进行实验而不用担心严重搞砸。
Git的 三种状态
现在请注意了,如果你希望接下来的学习过程顺利进行,这里是关于 Git 最重要的事情。Git 有三种主要状态,你的文件可以处于其中之一:已修改(Modified)、已暂存(Staged)和已提交(Committed):
已修改(Modified)表示你已经对文件进行了更改,但尚未将其提交到数据库中。
已暂存(Staged)表示你已经将当前版本的修改文件标记为要包含在下一次提交的快照中。
已提交(Committed)表示数据已经安全地存储在你的本地数据库中。
这将引导我们进入 Git 项目的三个主要部分:工作区(Working Tree)、暂存区(Staging Area)和 Git 目录(Git Directory)。
工作区(Working Tree)是项目的一个版本的单个检出。这些文件从 Git 目录中的压缩数据库中拉出,并放置在磁盘上供您使用或修改。
暂存区(Staging Area)是一个文件,通常包含在 Git 目录中,它存储了关于将包含在下一次提交中的内容的信息。在 Git 的术语中,它的技术名称是"索引",但短语"暂存区"同样适用。
Git 目录是 Git 为项目存储元数据和对象数据库的地方。这是 Git 最重要的部分,当从另一台计算机克隆存储库时,这就是被复制的内容。
基本的 Git 工作流程大致如下:
在工作区中修改文件。
选择性地将想要包含在下一次提交中的那些更改放入暂存区,这样只会将那些更改添加到暂存区。
进行提交,它会将暂存区中的文件以它们当前的状态永久地存储到Git 目录中。
如果文件的某个特定版本位于 Git 目录中,则被视为已提交。如果文件已被修改并且已添加到暂存区,则处于已暂存状态。如果文件自检出以来已更改但尚未暂存,则为已修改状态。
附录
https://git-scm.com/book/en/v2/Getting-Started-What-is-Git%3F