什么是 Git?


你几乎肯定手动做过版本控制。一个文件夹里放着 report.docx、report_final.docx、report_final_v2.docx、report_final_ACTUAL.docx,这就是版本控制,而且是最糟糕的那种。你没法看出这几个文件之间到底改了什么,没法把两个人同时做的修改合并起来,也绝对没法找回你三个版本之前删掉的那段写得很好的文字。
Git 就是来彻底解决这个问题的。它是一个能随时间记录项目快照的工具,让你的整段历史都保存在一个地方,而不是散落成一堆副本。这个工具本身是安装在你自己电脑上的一个小程序:你在终端里输入以 git 开头的命令,它会用文字回应你。
Git 能为你做什么
从核心上说,Git 会为你的项目维护一条时间线。每当你走到一个值得保存的节点,你就记录一次**commit(提交)**:它是每个文件的一份快照,外加一句简短的说明,描述改了什么、为什么改。之后你可以回顾这条时间线,清楚地看到项目是如何一步步走到今天这个样子的。下面是 git log 打印出的一段真实历史记录,这个命令用来列出项目的所有提交(--oneline 参数会把每条记录压缩成一行):
$ git log --oneline
a1b2c3d 添加密码强度提示
9f8e7d6 修复注册表单验证
5c4b3a2 搭建项目结构这就是项目历史中的三个保存点,最新的排在最上面,每条记录都有一个简短的 ID 和作者写下的说明。(在所有这类示例中,以 $ 开头的那一行是你在终端里输入的命令,不包含 $ 本身,下面几行则是 Git 的回复。)在接下来的几章里,你会学到每一个能生成、能查看这段历史的命令。眼下你只需要记住一点:Git 把你的工作记录成了一系列你随时可以回溯的快照。
一旦项目有了这样的历史记录,很多事情就都变得可能了。你可以看到改了什么、是谁改的。你可以在旁支上试一个有风险的想法,如果不成功就干净地丢掉它。你可以把整个项目连同完整的历史一起交给别人。而当两个人修改同一段代码时,Git 能把他们的工作合并起来,并标出双方有冲突的地方,交给人来解决。这四种能力——记录历史、安全试验、共享、合并工作——正是几乎所有专业代码库都离不开 Git 的原因。
final_v2_ACTUAL 副本正是 Git 生来要解决的问题,我敢保证,第一次删掉一个这样的文件时,你会觉得特别爽。 Git 和 GitHub 是两回事
几乎所有人一开始都会在这里绊一下,所以我们直接说清楚。Git 是那个版本控制工具。它运行在你自己的电脑上,负责记录你的提交,不需要联网、也不需要账号就能用。GitHub 是一个网站,它把 Git 仓库存到网上,并在此基础上加了一堆功能:一个能分享代码、互相审查改动、报告问题、协作开发的地方。
感受这个区别最直接的方式是:你完全可以每天用 Git,在自己电脑上提交、开分支,却从来不需要注册 GitHub 账号。只有当你想把仓库放到一个共享的地方,让别人或者别的机器能访问到它时,GitHub 才会登场。Git 是引擎,GitHub 只是存放它产出的成果的一个地方。类似的地方还有其他,比如 GitLab 和 Bitbucket,它们底层托管的都是同一种 Git 仓库。
Git 从何而来
Git 的历史能解释很多它为什么会是这样设计的原因。它是 2005 年由 Linus Torvalds 编写的,他也是 Linux 的创始人。Linux 内核由分布在世界各地的数千名志愿者共同开发,之前几年,他们一直用一款叫 BitKeeper 的商业工具来协调这些工作,那家公司允许开源项目免费使用它。
2005 年,这个免费使用的安排突然告吹,内核社区一下子失去了管理这个庞大且快速变化的代码库的工具。当时市面上没有别的工具能顶上。于是 Torvalds 暂时放下内核的工作,用了大约两周时间,自己写了一个版本控制工具,并针对当时面临的问题定下了几个明确的目标。
他希望这个工具是**分布式的,这样每个贡献者的机器上都保存着完整的项目历史,不用连着中央服务器才能工作。他希望这个工具足够快**,快到能应付内核这种规模的项目,不让人干等着。他还希望这个工具能保证完整性,让任何人都无法悄悄篡改历史,也不会因为一次磁盘错误就悄无声息地损坏项目。
正是这些目标,决定了 Git 今天的行为方式。当你 clone 一个项目时,你得到的是它的整段历史,这正是“分布式”这个目标的体现:你可以在没有 wifi 的飞机上提交、开分支、查看历史。而每个提交都会被打上一个根据其确切内容算出的指纹,一旦哪怕一个字节发生变化,这个指纹就对不上了,Git 就会察觉到。Torvalds 在 2005 年匆忙做出的这些设计决定,正是你今天每次使用 Git 时都在依赖的东西。
clone 能让你拿到完整的历史记录在离线状态下工作,也是为什么每次提交都会有一个指纹。了解这段背景,对你以后要用很多年的这个工具会很有帮助。 这本手册接下来讲什么
有了这套心理模型之后,本系列剩下的内容就是动手实操了。你的第一个仓库会从零开始:打开终端,如果你的电脑还没装 Git 就先安装它,然后把一个文件夹变成一个可以提交的仓库。从那之后,你会学到保存改动的日常流程,接着是分支、合并,以及在 GitHub 上协作的完整流程。如果哪个术语让你摸不着头脑,术语表里对本文档中出现的每一个 Git 词汇都有一句简短的解释。

