版本控制
版本控制是一种记录若干文件内容变化,以便将来查阅特定版本修订情况的系统。
版本控制系统可以将摸个文件回溯到之前的状态,甚至将整个项目都退到过去某个之间点的状态。你可以比较文件的变化细节,查出最后是谁修改了那个地方,从而导致出现诡异问题,又是谁在何时报告了某个功能缺陷等等。使用版本控制系统通常还意味着,就算你乱来一气把整个项目中的文件改的改 删的删,你可赵勇可以轻松恢复到原来的样子。但额外增加的工作量缺微乎其微。
Git基础
那么,简单地说,Git究竟是怎样的一个系统呢?
直接记录快照,而非差异比较
Git和其他版本控制系统的主要差别在于,git只关心数据的整体是否发生变化,而大多数其他系统只关系文件内容的具体差异。这类系统 (CVS,Subversion,Perforce,Bazaar 等等)每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容,请看图 1-4。
Git并不保存这些前后变化的差异数据。实际上,Git更像是把变化的文件做快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件做一个快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git不会再次保存,而只对上次保存呢的快照做一个链接。
近乎所有的操作都是本地执行
在Git中的绝大多数操作都只需要访问本地文件和资源,不用跑到外面的服务器上去取数据回来,而直接从本地数据库读取后展示给你看。所以任何时候你都可以马上翻阅,无需等待。如果想要看当前版本的文件和一个月 前的版本之间有何差异,Git 会取出一个月前的快照和当前文件作一次差异运算,而不用请求远程服务器来做这件事,或是把老版本的文件拉到本地来作比较。
时刻保持数据完整性
在保存到 Git 之前,所有数据都要进行内容的校验和(checksum)计算,并将此结果作为数据的唯一标识和索引。换句话说,不可能在你修改了文件或目录之后,Git 一无所知。这项特性作为 Git 的设计哲学,建在整体架构的最底层。所以如果文件在传输时变得不完整,或者磁盘损坏导致文件数据缺失,Git 都能立即察觉。
Git 使用 SHA-1 算法计算数据的校验和,通过对文件的内容或目录的结构计算出一个 SHA-1 哈希值,作为指纹字符串。该字串由 40 个十六进制字符(0-9 及 a-f)组成,看起来就像是:
Git 的工作完全依赖于这类指纹字串,所以你会经常看到这样的哈希值。实际上,所有保存在 Git 数据库中的东西都是用此哈希值来作索引的,而不是靠文件名。
git具有高可靠行,在怎样也不会丢失数据
文件有三种状态
对于任何一个文件,在 Git 内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged)。已提交表示该文件已经被安全地保存在本地数据库 中了;已修改表示修改了某个文件,但还没有提交保存;已暂存表示把已修改的文件放在下次提交时要保存的清单中。
初次运行 Git 前的配置
用户信息
第一个要配置的是你个人的用户名称和电子邮件地址。这两条配置很重要,每次 Git 提交时都会引用这两条信息,说明是谁提交了更新,所以会随更新内容一起被永久纳入历史记录:
$ git config --global user.name "John Doe" $ git config --global user.email johndoe@ example.com
如果用了 --global
选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认使用这里配置的用户信息。如果要在某个特定的项目中使用其他名字或者电邮,只要去掉--global
选项重新配置即可,新的设定保存在当前项目的.git/config
文件里。
查看配置信息
要检查已有的配置信息可以使用 git config --list
用户名和邮箱地址的作用
用户名和邮箱地址是本地Git客户端的一个变量,不随git库而改变
每次commit都会用用户名和邮箱记录
github的contributions统计就是按邮箱来统计的
查看用户名和邮箱地址
git config user.name
git config user.email
修改用户名和邮箱地址
git config --global user.name 'user.name'
git config --global user.email 'user.email'