Git 是一款分布式版本控制系统,有别于 CVS 和 SVN 等集中式版本控制系统,Git 可以让研发团队更加高效地协同工作、提高生产率。使用 Git,开发人员的工作不会因为频繁地遭遇提交冲突而中断,管理人员也无须为数据的备份而担心。经过 Linux 这样庞大的项目的考验之后,Git 被证明可以胜任任何规模的团队,即便这个团队的成员分布于世界各地。

Git 是开源社区奉献给每一个人的宝贝,用好它可以实现个人的知识积累、保护好自己的数据,而且还能与他人分享自己的成果。

版本控制的前世和今生

即便是在 CVS 出现之前的“史前时代”,也已经有了非常好用的源码比较和打补丁的工具:diffpatch,他们今天生命力依然顽强。

对这 hello world 两个文件执行diff命令,查看两个文件的差异。如下所示:

$ diff -u hello world | less -N

上面执行 diff 命令的 -u 参数很重要,使得差异输出中带有上下文。管道后面带有 -N 参数的 less 命令(按字母 q 退出)会在输出的每一行前面添加行号,便于对输出结果进行说明。

命令 patch 相当于 diff 的反向操作

分布式版本控制系统最大的反传统之处在于,可以不需要集中式的版本库,每个人都工作在通过克隆操作建立的本地版本库中,也就是说每个人都拥有一个完整的版本库。分布式版本控制系统的几乎所有操作包括查看提交日志、提交、创建里程碑和分支、合并分支、回退等都直接在本地完成而不需要网络连接。每个人都是本地版本库的主人,不再有谁能提交谁不能提交的限制,加之多样的协同工作模型(版本库间推送、拉回,及补丁文件传送等)让开源项目的参与度有爆发式增长。

爱上 Git 的理由

  • 每日的工作备份。鸡蛋不全放在一个篮子里。
  • 异地协同工作。通过一个远程版本库,同步数据。
  • 现场版本控制。在部署的现场,进行源代码的修改,能够将修改结果甚至修改过程一并带走,并能够将修改结果合并至项目对应的代码库中。
  • 避免引入辅助目录。只在工作区的顶级目录下创建名为 .git 的目录(版本库目录),如果认为唯一的一个 .git 目录也过于碍眼,可以将其放到工作区之外的任意目录。一旦这么做了,你在执行 Git 命令时,要通过命令行 --git-dir 或环境变量 GIT_DIR 为工作区指定版本库目录,甚至还要指定工作区目录。
  • 重写提交说明。这个命令如果不带 -m 参数,会进入提交说明编辑界面。
$ git commit --amend
  • 想吃后悔药。假如提交的数据中不小心包含了一个不应该检入的虚拟机文件——大约有 1 个 GB。
$ git rm --cached winxp.img
$ git commit --amend
  • 更好用的提交列表。正确的版本控制系统的使用方法是:一次提交只干一件事。而不要在下班时才想起来要提交,那样的话版本控制系统就被降格为文件备份系统了。
  • 更好的差异比较。git diff
  • 工作进度保存。
$ git stash
$ git checkout <new_branch>
# do something
$ git checkout <orignal_branch>
$ git stash pop
  • 代理 SVN 提交实现移动式办公。
  • 无处不在的分页器。-p
  • 快。Git作为分布式版本控制系统几乎所有的操作都在本地进行。

安装 Git

$ sudo aptitude install git
$ sudo aptitude install git-doc git-svn git-email gitk

软件包 git-svn、git-email、gitk 本来也是 Git 软件包的一部分,但是因为有着不一样的软件包依赖(如更多 perl 模组,tk 等),所以单独作为软件包发布。

软件包 git-doc 则包含了 Git 的 HTML 格式文档,可以选择安装。如果安装了Git 的 HTML 格式的文档,则可以通过执行 git help -w <sub-command> 命令,自动用 Web 浏览器打开相关子命令 <sub-command> 的 HTML 帮助。

中文支持

$ git config --global core.quotepath false

Reference: