Git起步

版本控制作用

  • 追踪变更
  • 回溯版本
  • 分享合作

当你不小心把代码搞乱了的时候,可以回溯到之前的任意提交版本,也可以追踪你的每一次提交,可以对比差异,可以分享和合作。

Git简史

同生活中的许多伟大事物一样,Git诞生于一个极富纷争大举创新的年代。

Linux内核开源项目有着为数众多的参与者,绝大多数的Linux内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。

到2002年,整个项目组开始启用一个专有的分布式版本控制系统BitKeeper来管理和维护代码。

到了2005年,开发BitKeeper的商业公司同Linux内核开源社区的合作关系结束,他们收回了Linux内核社区免费使用BitKeeper的权力,这就迫使Linux开源社区(特别是Linux的缔造者Linus Torvalds)基于使用BitKeeper时的经验教训,开发出自己的版本系统。

他们对新的系统制订了若干目标:

  • 速度

  • 简单的设计

  • 对非线性开发模式的强力支持(允许成千上万个并行开发的分支)

  • 完全分布式

  • 有能力高效管理类似Linux内核一样的超大规模项目(速度和数据量)

自诞生于2005年以来,Git日臻成熟完善,在高度易用的同时,仍然保留着初期设定的目标。

它的速度飞快,极其适合管理大项目,有着令人难以置信的非线性分支管理系统。

和SVN的差异

直接记录快照,而非差异比较

如果你使用过之前的集中式版本管理系统SVN,那么你就能体会到Git的便捷和强大。

Git和SVN的主要差别在于Git对待数据的方式。从概念上来说,其它大部分系统以文件变更列表的方式存储信息,这类系统将它们存储的信息看作是一组基本文件和每个文件随时间逐步累积的差异。

Checkins Over Time
基于差异的版本控制,存储每个文件与初始版本的差异.

Git不按照以上方式对待或保存数据,Git更像是把数据看作是对小型文件系统的一系列快照。

在Git中,每当你提交更新或保存项目状态时,它基本上就会对当时的全部文件创建一个快照并保存这个快照的索引。

为了效率,如果文件没有修改,Git不再重新存储该文件,而是只保留一个链接指向之前存储的文件。

Checkins Over Time
基于快照流的版本控制,存储项目随时间改变的快照.

Git保证完整性

Git中所有的数据在存储前都计算校验和,然后以校验和来引用,这个功能建构在Git底层,是构成Git哲学不可或缺的部分。

这意味着不可能在Git不知情时更改任何文件内容或目录内容,若你在传送过程中丢失信息或损坏文件,Git就能发现。

Git用以计算校验和的算法是SHA-1散列,这是一个由40个十六进制字符(0-9和a-f)组成的字符串,基于Git中文件的内容或目录结构计算出来。

SHA-1哈希看起来是这样:

24b9da6552252987aa493b52f8696cd6d3b00373

Git中使用这种哈希值的情况很多,你将经常看到这种哈希值。 实际上,Git数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。

三种状态

Git有三种状态,你的文件可能处于其中之一:

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

这会让我们的Git项目拥有三个阶段:工作区、暂存区以及Git目录。

Three Stage
工作区、暂存区以及Git仓库.

工作区是对项目的某个版本独立提取出来的内容,这些从Git仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。

暂存区是一个文件,保存了下次将要提交的文件列表信息,一般在Git仓库目录中,按照Git的术语叫做“索引”,不过一般说法还是叫“暂存区”。

Git仓库目录是Git用来保存项目的元数据和对象数据库的地方。 这是Git中最重要的部分,从其它计算机克隆仓库时,复制的就是这里的数据。

基本的Git工作流程如下:

  1. 在工作区中修改文件。

  2. 将你想要下次提交的更改选择性地暂存,这样只会将更改的部分添加到暂存区。

  3. 提交更新,找到暂存区的文件,将快照永久性存储到Git目录。

如果Git目录中保存着特定版本的文件,就属于已提交状态。

如果文件已修改并放入暂存区,就属于已暂存状态。

如果自上次检出后,作了修改但还没有放到暂存区域,就是已修改状态。

Git的配置

配置文件位置和优先级

Git自带一个git config工具来帮助设置控制Git外观和行为的配置变量。

这些变量存储在三个不同的位置:

  1. /etc/gitconfig文件: 包含系统上每一个用户及他们仓库的通用配置。如果在执行git config时带上--system选项,那么它就会读写该文件中的配置变量。
  2. ~/.gitconfig~/.config/git/config文件:只针对当前用户。你可以传递--global选项让Git读写此文件,这会对你系统上所有的仓库生效。
  3. 当前使用仓库的Git目录中的config文件(即.git/config):只针对该仓库。你可以传递--local选项让Git强制读写此文件,虽然默认情况下用的就是它。

每一个级别会覆盖上一级别的配置,所以.git/config的配置变量会覆盖/etc/gitconfig中的配置变量。

可以通过以下命令查看所有的配置以及它们所在的文件:

git config --list --show-origin

用户信息

安装完Git之后,要做的第一件事就是设置你的用户名和邮件地址,这一点很重要,因为每一次Git提交都会使用这些信息,它们会写入到你的每一次提交中,不可更改:

git config --global user.name "Dennis Wang"

git config --global user.email me@dengwu.wang

--global代表你只需要全局设置一次。

检查配置

可以使用git config --list命令来列出所有Git当前能找到的配置。

可以通过输入git config <key>来检查Git的某一项配置。

帮助文档

Git拥有良好的帮助文档,详细文档可以使用git help xx获取,xx代表你需要执行的命令,也可以通过git xx -h获取简短的参数列表。

Top