Git 教程 1 - 认识 Git

教程内容基本来自 git 官方教程系列的文章,然后对一些重点的记录下来,做了简单的归纳并写上自己的思考

版本控制

一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统
版本控制系统(VCS) 可以将选定的文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态,你可以比较文件的变化细节,查出最后是谁修改了哪个地方,从而找出导致怪异问题出现的原因,又是谁在何时报告了某个功能缺陷等等

本地式版本控制


用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别的本版控制方法
优点是简单,但是特别容易犯错。 有时候会混淆所在的工作目录,一不小心会写错文件或者覆盖意想外的文件

集中式版本控制

  • 本地式版本控制只能在一台机器上提供版本控制,为了解决不同系统开发者协同工作的问题,提出了集中式版本控制(Centralized Version Control Systems,CVCS)法,该方法有一个集中管理的服务器,保存所有文件的修订版本。类似工具有 SVM
  • 相较于老式的本地式版本控制,集中式版本控制可以在一定程度上看到项目中的其他人正在做些什么。 而管理员也可以轻松掌控每个开发者的权限,并且管理一个 CVCS 要远比在各个客户端上维护本地数据库来得轻松容易
  • 但是缺点也是明显的,如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作;如果中心数据库所在的磁盘发生损坏,又没有做恰当备份,毫无疑问你将丢失所有数据

分布式版本控制

  • 为了解决集中式版本控制可能的数据丢失问题,分布式版本控制系统(Distributed Version Control System,DVCS)将代码保存在所有的协同终端上。如此,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。类似工具有 Git
  • 更进一步,人员的逻辑划分更加容易实现,如:在同一个项目中,分别和不同工作小组的人相互协作;根据需要设定不同的协作流程,比如层次模型式的工作流

Git

采用版本控制系统(VCS)是个明智的选择。 有了它你就可以将某个文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态;你可以比较文件的变化细节,查出最后是谁修改了哪个地方,从而找出导致怪异问题出现的原因;又是谁在何时报告了某个功能缺陷等等。 使用版本控制系统通常还意味着,就算你乱来一气把整个项目中的文件改的改删的删,你也照样可以轻松恢复到原先的样子。 但额外增加的工作量却微乎其微。

版本控制原理

Git 和其它版本控制系统(包括 Subversion 和近似工具)的主要差别在于 Git 对待数据的方法。概念上来区分,其它大部分系统以文件变更列表的方式存储信息。下图是一般 CSV 的设计原理:

其他版本控制的原理

存储的是每个文件与初始版本的差异,即每个版本相当于以增量的方式存储当前版本与初始版本的差异.

Git版本控制原理

Git 不采用这种方式,而是是把数据看作是对小型文件系统的一组快照。 每次你提交更新,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。Git 对待数据更像是一个 快照流

Git 的文件布局?

工作目录、暂存区域以及 Git 仓库

在 git 的版本控制系统中,将文件存放的位置划分为 3 个区域:

  • 工作区:供用户修改文件的区域,也就是文件夹上除.git 外的所有内容
  • 暂存区:是一个文件,保存了下次将要提交的文件列表信息,一般在 Git 仓库目录中。 按照 Git 的术语叫做 “索引”,不过一般说法还是叫 “暂存区”
  • Git 仓库:用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,复制的就是这里的数据

基于以上原理,从文件所处的位置来说,文件有以下三种状态:

  • 已提交 committed: 已提交表示数据已经安全的保存在本地数据库中
  • 已修改 modified: 已修改表示修改了文件,但还没保存到数据库中
  • 已暂存 staged: 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中

从文件本身是否被编辑来说,文件有以下状态:

!

  • 未跟踪 (untracked):除已跟踪文件外的其它所有文件,即所有不进行版本控制的文件
  • 未修改 (Unmodified):从 Git 仓库 后,没有对修改过,状态一直是未修改
  • 已修改 (modified) :从 Git 仓库 后,被修改过
  • 已暂存 (staged) :将修改过的文件标记 **,** 文件记录到暂存区

Git 的基本工作流程

  • 在工作区中修改文件
  • 将你想要下次提交的更改选择性地暂存,这样只会将更改的部分添加到暂存区
  • 提交更新,找到暂存区的文件,将快照永久性存储到 Git 仓库

Git 特点

本地操作
在 Git 中的绝大多数操作都只需要访问本地文件和资源,一般不需要来自网络上其它计算机的信息。

举个例子,要浏览项目的历史,Git 不需外连到服务器去获取历史,然后再显示出来 —— 它只需直接从本地数据库中读取。 你能立即看到项目历史。 如果你想查看当前版本与一个月前的版本之间引入的修改,Git 会查找到一个月前的文件做一次本地的差异计算,而不是由远程服务器处理或从远程服务器拉回旧版本文件再来本地处理。

数据完整性
Git 数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。这意味着不可能在 Git 不知情时更改任何文件内容或目录内容。同时,若你在传送过程中丢失信息或损坏文件,Git 就能发现。

一般只添加数据
你执行的 Git 操作,几乎只往 Git 数据库中增加数据。 很难让 Git 执行任何不可逆操作,或者让它以任何方式清除数据。