[git] git 的基本认知

时间:2022-03-23 16:07:20

版本管理 ( Version Control )

版本管理系统是一个记录文件变更的系统,让你在一段时间后可以恢复指定版本的文件。版本管理系统大致可分为三类:独立的本地版本管理系统、中心化版本管理系统、分布式版本管理系统。

本地版本管理系统

最简单的方式,就是手动备份文件,实现文件版本管理的效果。以前一个相对流行的工具是 RCS ,逻辑关系如下图

[git] git 的基本认知

中心化版本管理系统( Centralized Version Control System )

例如 CVS, subversion, perforce 等,有一个服务器包含了所有版本的文件,同时多个客户端从那个远程的服务器中拷贝出文件。这个场景下的拷贝动作,叫做签出( Checkout )。很多年来,这种方式是版本管理的标准方案。

中心化的最大缺点是单点故障。当中心的版本控制服务器处于事故状态,一段时间内不可使用,则这段时间内无法基于版本控制的合作。如果版本服务器的硬盘坏掉,并且没有及时的备份,则所有历史数据都无法找回。历史修改记录对于项目而言,非常重要。

[git] git 的基本认知

分布式版本控制系统( Distributed Version Control System )

在分布式版本控制系统中,客户端不仅仅签出最新版本的文件,也拷贝了整个版本库信息。如果版本服务器挂掉了,任何一个客户端的版本库信息都可以用来恢复版本服务器,因为所有变更记录都在版本库中。每次 clone 都是把整个库全部完整地拷贝出来。Git 是分布式版本管理系统。

[git] git 的基本认知

Git 是由 Linux kernel 开发社区开发,被用于管理 Linux kernel 项目开发。有如下几个特征

  • 快速
  • 简洁设计
  • 善于支出非线性开发(如几百个平行进行的开发分支)
  • 完全分布式
  • 可以支出大型项目,例如 Linux kernel .

Git 和其他版本管理工具的比较

在学习 Git 时候,尽量把其他版本控制系统的概念忘记掉,例如 subversion, perforce 等。这样有助于你理解 Git 。虽然 Git 和其他版本管理工具有类似的用户接口,但是Git 和其他版本管理工具的哲学不一样。

Git 基于整个项目快照,而不是单个文件差异

大多数版本控制系统,如 subversion,把信息存储为一个基于文件的变更列表。

[git] git 的基本认知

Git 把信息存储为一系列的整个系统快照。每次在 Git 中有提交或修改,整个项目在那一瞬间会被记录下来,并保留对那一瞬的引用。

[git] git 的基本认知

这是 git 和其他版本工具一个非常重要的差异。

Git 基本基本是本地操作

Git 的绝大部分操作是只用到本地的文件或资源,因为本地有项目完整的历史记录。需要查看项目历史时, Git 无需去到服务器获取历史信息,而是直接从本地数据库读取,这样响应速度很快。即使断网或 VPN 不稳地的情况下, 仍然可以继续工作。

当你在家里但 VPN 无法正常使用时,你仍然可以使用 Git 的大部分功能。这个特性非常适合在家办公、远程办公的开发工作。如果用的是 subversion ,虽然你可以修改文件,但是无法提交修改记录,因为 subversion 数据库没有连上。

Git 上面的所有东西都会被 check-sum, 并被这个 check-sum 引用。check-sum 是对文件内容进行 SHA-1加密后的哈希值,是一个40位的十六进制(0-9 以及 a-f)字符串。例如

24b9da6552252987aa493b52f8696cd6d3b00373

实际上, Git 存储文件,都是基于文件内容的哈希值,而不是基于文件名。

Git 管理下的文件状态

加入到 Git 管理体系的文件有三个状态 : commited, modified, staged。在下面的图例中

  • 工作目录 ( Working Directory ) 项目从 git 仓库中签出后存储的位置,用于存储 committed 或者 modified 状态的文件。
  • Staging Area 是一个文件,记录着下一次 commit 时会提交的内容,用于存储 staged 状态的文件。有些图形用户界面工具称这个区域为 index , 如 egit。
  • git 仓库 ( .git Repository ) 是 git 存储数据的地方,存储的是 committed 状态下的文件。这个 Git 最重要的目录。

[git] git 的基本认知

Git 的基本工作流

修改文件 --> stage 文件 --> 提交

学习时推荐使用命令行

命令行支持 git 所有的命令,如果你熟悉 git 命令行,你可以很快熟悉 GUI 操作。反之,不一定成立。关于图形用户界面,通过对 github desktop, egit, git GUI 三个工具的使用,觉得 egit 显示的分支最为清晰,这个对 git 来说比较重要,此外 egit 还同时能显示其他的有用信息,推荐使用。

遇到不懂的命令时,可以使用下面的命令,了解如何使用 git.

git help <verb>

参考资料

Chapters 1, Getting Started, git-scm