Chapter 1 起步
1.1 关于版本控制
- 版本控制就是一种记录一个或若干文件内容变化,以便于将来查阅特定版本修订情况的系统。
- 版本控制系统(VCS)
- 作用:
- 可以将某个文件回溯到之前的状态,或将整个项目都回退到过去的某个时间点的状态。
- 查看谁修改了什么地方,从而查找问题的所在。
- 就算你乱改一气,也能将整个项目回复到原先的版本。
本地版本控制系统
- 也许复制整个项目目录的方式来保存不同的版本,或许还会改名来备份以示区别。简单但容易犯错。
- 以前大多采用简单的数据库来记录文件的历次更新差异。
- RCS:工作原理:它的工作原理是在硬盘上保存补丁集(补丁是指文件修订前后的变化);通过应用所有的补丁,可以重新计算出各个版本的文件内容。
集中化的版本控制系统
- 为了满足在不同系统上的开发者协同工作。
- 集中化的版本控制系统(Centralized Version Control Systems,简称 CVCS)
- 这类系统,诸如 CVS、Subversion 以及 Perforce 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。
分布式版本控制系统
- Distributed Version Control System,简称 DVCS。
- 这类系统中,像Git、Mercurial、Bazaar、Darcs等,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。
- 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。 因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。
1.2 Git简史
- 详细参考
- 目标:
- 速度
- 简单的设计
- 对非线性开发模式的强力支持(允许巨量的并行开发的分支)
- 完全分布式
- 有能力高效管理类似Linux内核一样的超大规模项目(速度&数据量)
1.3 Git基础
Git和其他版本控制系统的主要差别在于Git对待数据的方法。
Git直接记录快照,而非差异比较
以下就是大部分系统以文件变更列表的方式存储信息
- Git把数据看作是对小型文件系统的一组快照。每次提交更新,或在Git中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。 为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个 快照流。
- 这是git与其他版本控制系统的重要区别。
近几乎所有的操作都是本地执行
- 在Git中绝大多数操作都只需要访问本地文件和资源,一般不需要来自互联网上其他计算机的信息。
- 这很nice
Git保证完整性
- Git中所有的数据在存储前都计算校验和,然后以校验和来引用。这表示不可能在Git不知情时更改任何文件内容或目录内容。
- Git用以计算校验和的机制叫做SHA-1散列(hash,哈希)。
- 这是一个由 40 个十六进制字符(0-9 和 a-f)组成的字符串,基于 Git 中文件的内容或目录结构计算出来。 SHA-1 哈希看起来是这样:
24b9da6552252987aa493b52f8696cd6d3b00373
- 在使用Git时会经常看到上述的哈希值。实际上Git数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。
Git一般只添加数据
- 你执行的 Git 操作,几乎只往 Git 数据库中增加数据。 很难让 Git 执行任何不可逆操作,或者让它以任何方式清除数据。
- 一旦你提交快照到 Git 中,就难以再丢失数据,特别是如果你定期的推送数据库到其它仓库的话。
- 更深层次探讨如何保存数据及恢复丢失数据的话题,可以参考撤销操作
三种状态
已提交(committed) : 表示数据已经安全的保存在本地数据库中
已修改(modified) : 修改了文件,但还没有保存到数据库中
已暂存(staged) : 表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中
提交的文件只能处于这三种状态之一;
Git项目的三个工作区域的概念: Git仓库、工作目录以及暂存区域
Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。
工作目录是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。
暂存区域是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。 有时候也被称作“索引”,不过一般说法还是叫暂存区域。
基本的Git工作流程如下:
- 1.在工作目录中修改文件。
- 2.暂存文件,将文件的快照放入暂存区域。
- 3.提交更新,找到暂存区域的文件,将快照永久性存储到Git仓库目录。
1.4 起步——命令行
- 原生的命令行模式:可以执行Git的所有命令
- GUI:只实现了Git所有功能的一个子集来降低操作难度
- 所以建议:以命令行来执行Git命令