Git 是什么?

Git 是一个分布式版本控制系统。Git 是 linus 为了帮助管理 Linux 内核开发,使用 C 语言开发的一个软件版本控制软件。

什么是版本控制?

版本控制是一种记录一个或若干个文件内容变化、以便将来查阅特定版本修订情况的系统。有了它就可以随时将某个文件回溯到之前的状态,甚至将整个项目回退到之前的某个节点。还可以比较文件变化的细节(只能记录文本文件的细节,对于像 word 等二进制文件,只能记录文件发生变化,而不知具体什么变化)。

为什么使用 Git ,而不是其他的版本控制系统?

本地版本控制系统

Local Version Control Systems,简称 VCS。

许多人通过复制整个项目目录的方式保存不同的版本,有的还会通过改名或者加上时间以示区分。
这么做的好处就是简单。但是容易犯错,有时候会混淆所在的工作目录,一不小心会写错文件或者会意外覆盖文件。

image.png

为了解决这个问题,人们开发了许多版本控制系统,大多数采用数据库记录文件的历次更新差异(补丁集,补丁-文件修改前后的变化),通过应用所有的补丁,可以计算出各个版本的文件内容。代表软件是 rcs。
image.png
后来人们遇到了一个问题,如何使不同的人协同工作。

集中化版本控制系统

Centralized Version Control Systems,简称 CVCS。
为了解决上述问题,出现了集中化版本控制系统。如 CVSSubversion(简称 SVN) 等。他们都有一个集中管理的服务器,保存所有文件的修订版本,而协同工作的人都通多客户端连接到这台服务器上,去除最新文件或者提交更新。
image.png
相较于老式的 VCS,现在可以

  • 看到每个人在项目中做些什么
  • 管理员可以轻松的掌控每个开发者的权限
  • 管理一个 CVCS 远比在各个客户端维护本地数据库轻松,提高了效率

随着时间的推移,人们又发现了问题:

  • 中央服务器单点故障,导致代码丢失,只剩下人们在各自机器上的单独快照
  • 中央服务器宕机,导致谁都无法提交工作内容,也就无法协同工作。

分布式版本控制系统

Distributed Version Control Systems,简称 DVCS。

为了解决上述问题,出现了 分布式版本控制系统,如 Git、Mercurial、BitKeeper 等,客户端不只保存最新的文件快照,而是把代码仓库完整的镜像下来。如果任何一处协同工作的服务器发生故障,事后都可以用任何一个镜像恢复,因为一次克隆操作就是一次代码的完整拷贝。并且,这类系统可以指定和若干个不同的远端代码仓库进行交互。可以根据需要设定不同的工作流程。
image.png

Git 思想和基本工作原理

对待数据的方式:

不同于其他版本控制系统(包括 SVN 和 近似工具),Git 对待数据的方式不是通过记录基本文件,和随时间产生的累计差异;而是将数据看成小型文件系统的一组快照,即在每次提交时或者保存状态时,对当时的全部文件制作一个快照并保存索引,如果文件没有修改,Git 不再重新存储该文件。即使是不同仓库中,只要文件内容相同,视为同一个文件。
image.png

基本所有的操作都是本地执行:

因为本地就有完整的项目历史。

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: 表示是第一次提交到暂存区
  • modified 状态
    • 纳入跟踪的文件在工作区中被修改
    • Changes not staged for commit:未准备好提交的更改
  • rename 重命名文件
  • deleted 删除文件

Git 基本介绍 - 图6
Git 基本介绍 - 图7
Git 基本介绍 - 图8

Git 三个区域:

工作区:(working directory)。 git add 执行之前、项目根路径下除了 .git 的区域
暂存区:(stage,index)。 git add 之后, git commit 之前。
版本库:(Repository)。项目跟路径下 .git 文件夹。
image.png
工作目录是对项目的某个版本独立提取出来的内容,也就是从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你修改。
暂存区实现上是一个文件 .git/index ,保存了下次将提交的文件列表信息。当执行 git add 后,会更新暂存区的信息。可以通过 git ls-files -s 查看暂存区的内容。

相关术语

  1. repository 仓库
  2. branch 分支
  3. summary 摘要
  4. track 跟踪
  5. modify 修改
  6. stage 暂存
  7. commit 提交
  8. push 推送
  9. pull 拉取
  10. clone 克隆
  11. amend 修改
  12. merge 合并
  13. conflict 冲突
  14. origin
  15. upstream 上游
  16. downstream 下游
  17. verbose 详情
  18. reflog 参照日志 - reference log 记录的是 HEAD 的变化历史

相关资料

官方:Git Book :官网 ProGit
Book: Git Pro :md 格式的 ProGit

廖雪峰:Git 教程

对新手友好,会设想一些场景,根据不同的场景使用不同的命令;看到分支管理小结就差不多了

Git 权威指南

深入介绍 Git 的各种场景下使用的什么命令操作,还会详细解释命令的各种常用用法


WEB 端 Git 交互界面 image.png
码云:Git 大全 :收集了 Git 相关的一些资源,包括教程、软件、插件等
教程:猴子都能看懂的 GIT
GitHub:Git 的奇淫技巧
码云:Git 分支管理实践

不同场景下适用的不同分支模型

GitHub 秘籍

讲解 GitHub 网站的一些使用技巧

语雀:Git 协同与提交规范 待整理
约定式提交规范