Git 是什么?
Git 是一个分布式版本控制系统。Git 是 linus 为了帮助管理 Linux 内核开发,使用 C 语言开发的一个软件版本控制软件。
什么是版本控制?
版本控制是一种记录一个或若干个文件内容变化、以便将来查阅特定版本修订情况的系统。有了它就可以随时将某个文件回溯到之前的状态,甚至将整个项目回退到之前的某个节点。还可以比较文件变化的细节(只能记录文本文件的细节,对于像 word 等二进制文件,只能记录文件发生变化,而不知具体什么变化)。
为什么使用 Git ,而不是其他的版本控制系统?
本地版本控制系统
Local Version Control Systems,简称 VCS。
许多人通过复制整个项目目录的方式保存不同的版本,有的还会通过改名或者加上时间以示区分。
这么做的好处就是简单。但是容易犯错,有时候会混淆所在的工作目录,一不小心会写错文件或者会意外覆盖文件。

为了解决这个问题,人们开发了许多版本控制系统,大多数采用数据库记录文件的历次更新差异(补丁集,补丁-文件修改前后的变化),通过应用所有的补丁,可以计算出各个版本的文件内容。代表软件是 rcs。
后来人们遇到了一个问题,如何使不同的人协同工作。
集中化版本控制系统
Centralized Version Control Systems,简称 CVCS。
为了解决上述问题,出现了集中化版本控制系统。如 CVS 、Subversion(简称 SVN) 等。他们都有一个集中管理的服务器,保存所有文件的修订版本,而协同工作的人都通多客户端连接到这台服务器上,去除最新文件或者提交更新。
相较于老式的 VCS,现在可以
- 看到每个人在项目中做些什么
- 管理员可以轻松的掌控每个开发者的权限
- 管理一个 CVCS 远比在各个客户端维护本地数据库轻松,提高了效率
随着时间的推移,人们又发现了问题:
- 中央服务器单点故障,导致代码丢失,只剩下人们在各自机器上的单独快照
- 中央服务器宕机,导致谁都无法提交工作内容,也就无法协同工作。
分布式版本控制系统
Distributed Version Control Systems,简称 DVCS。
为了解决上述问题,出现了 分布式版本控制系统,如 Git、Mercurial、BitKeeper 等,客户端不只保存最新的文件快照,而是把代码仓库完整的镜像下来。如果任何一处协同工作的服务器发生故障,事后都可以用任何一个镜像恢复,因为一次克隆操作就是一次代码的完整拷贝。并且,这类系统可以指定和若干个不同的远端代码仓库进行交互。可以根据需要设定不同的工作流程。
Git 思想和基本工作原理
对待数据的方式:
不同于其他版本控制系统(包括 SVN 和 近似工具),Git 对待数据的方式不是通过记录基本文件,和随时间产生的累计差异;而是将数据看成小型文件系统的一组快照,即在每次提交时或者保存状态时,对当时的全部文件制作一个快照并保存索引,如果文件没有修改,Git 不再重新存储该文件。即使是不同仓库中,只要文件内容相同,视为同一个文件。
基本所有的操作都是本地执行:
因为本地就有完整的项目历史。
Git 保证完整性:
在存储文件前都使用 SHA-1 机制进行校验,并以其结果作为索引。其结果是一个 40 个16进制字符组成的字符串,基于文件内容或者目录结构计算出来
任何篡改历史提交信息、文件等都会对后续提交产生连锁反应
Git 一般只添加数据:
执行的 Git 操作几乎只往数据库中增加数据,一旦使文件让 Git 管理,就很难再丢失数据。
Git 的三种状态:
已修改:modify - 文件、数据修改,修改只在工作目录,未保存在数据库中。
已暂存:staged - git add 对当前修改的文件做标记,使之包含在下次提交的快照中,即修改内容被保存在 Git 数据库中。
已提交:committed - git commit 创建一个提交记录,保存在 Git 仓库中。
通过 git status 查看:
Untracked未跟踪状态:- 文件在工作区但是在工作区,但是未纳入 Git 管理的文件,不参与版本控制
- 位于暂存区待提交状态(Stated):
- git add
后,将文件纳入跟踪状态,并提交到暂存区。 - Changes to be committed:改变待提交
- new file: 表示是第一次提交到暂存区
- git add
- modified 状态
- 纳入跟踪的文件在工作区中被修改
- Changes not staged for commit:未准备好提交的更改
- rename 重命名文件
- deleted 删除文件



Git 三个区域:
工作区:(working directory)。 git add 执行之前、项目根路径下除了 .git 的区域
暂存区:(stage,index)。 git add 之后, git commit 之前。
版本库:(Repository)。项目跟路径下 .git 文件夹。
工作目录是对项目的某个版本独立提取出来的内容,也就是从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你修改。
暂存区实现上是一个文件 .git/index ,保存了下次将提交的文件列表信息。当执行 git add 后,会更新暂存区的信息。可以通过 git ls-files -s 查看暂存区的内容。
相关术语
repository 仓库branch 分支summary 摘要track 跟踪modify 修改stage 暂存commit 提交push 推送pull 拉取clone 克隆amend 修改merge 合并conflict 冲突origin 源upstream 上游downstream 下游verbose 详情reflog 参照日志 - reference log 记录的是 HEAD 的变化历史
相关资料
官方:Git Book :官网 ProGit
Book: Git Pro :md 格式的 ProGit
对新手友好,会设想一些场景,根据不同的场景使用不同的命令;看到分支管理小结就差不多了
深入介绍 Git 的各种场景下使用的什么命令操作,还会详细解释命令的各种常用用法
WEB 端 Git 交互界面
码云:Git 大全 :收集了 Git 相关的一些资源,包括教程、软件、插件等
教程:猴子都能看懂的 GIT
GitHub:Git 的奇淫技巧
码云:Git 分支管理实践
不同场景下适用的不同分支模型
讲解 GitHub 网站的一些使用技巧
