Git 是什么?
Git 是一个分布式版本管理系统。
什么是版本管理系统?
顾名思义就是管理文件版本的系统。
想象一下你是个设计师。你好不容易完成了设计稿,兴冲冲地交上去了,结果无情地被打了回来。好吧那你再改改,可是其中一部分删掉又怕以后还有用,于是另存为设计稿1,经过多次,就会变成这样:

这还没完!你的设计稿交上去之前同事也对它做了一点点修改,怎么办?只能手工把修改的内容添加进来了。
于是你一定会想:为什么要手动管理这些东西?是的,我们还有版本管理系统。你写了一份设计稿,存到了管理系统里,做了标记。第二天你在里面加了一段文字,又提交到了管理系统里。同事对设计稿的修改同样作为一个版本保存了下来。于是你就会有这样一个版本库:

于是你就有了一个版本库来管理你不同版本的设计稿了。
等等!这些操作我手工就可以完成了,虽然麻烦点,但我为什么要额外花点精力学 Git 呢?其实 Git 所能做的不只是保存不同版本文件。想想如果你的文件不止一个,你提交了一次“设计稿1”版本。之后你对很多文件进行了修改,然后提交了“设计稿2”版本。提交之后发现这次提交的修改好多都是错误的,怎么办?有了 Git,你只需要一个简单的命令,就能像拥有时光穿梭机一样把所有文件恢复到“设计稿1”的状态。
注意:所有的版本控制系统,其实只能跟踪文本文件的改动,比如 TXT 文件,网页,所有的程序代码等等,Git 也不例外。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从 100KB 改成了 120KB,但到底改了啥,版本控制系统不知道,也没法知道。Microsoft 的 Word 格式也是二进制格式,因此,版本控制系统是没法跟踪 Word 文件的改动的。
二进制文件管理已经是基本操作后的进阶内容,有兴趣的可以参阅 这里。
为什么叫分布式?
版本管理系统主要分为集中式和分布式两种。CVS 和 SVN 属于集中式,而 Git 属于分布式。

集中式版本管理系统有个中央服务器,要工作时从服务器下载最新的文件版本,完成后提交到服务器上。这样子的话你就需要联网,如果服务器在局域网内的话,上传下载都不是问题,但如果处在互联网环境下,网速又不够给力的话,下载个小文件也许就会让人抓狂。
而分布式版本管理系统就没有这个问题。因为它没有集中式中那样的“中央服务器”概念,每个用户自己电脑上都有一个完整的版本库。你工作的时候就算不联网也没有问题,因为版本库就在你的电脑上。于是问题又来了:那如果多人一起协作开发的话怎么办?你那里修改了文件“设计稿1”,同事也修改了“设计稿1”,你们要做的就是把你所做的修改互相推送给对方,于是你这边就收到了同事的修改,而同事也能看到你的修改,并加入自己的版本库之中,就像是在自己的时间轴上标记出别人的修改,并作为一个版本保存下来。
注意:分布式版本管理系统在实际使用中,很少在两个人之间推送版本库的修改,因为有可能受制于网络因素,或是对方根本没开机等因素的影响。因此分布式管理系统一般也有一台充当“中央服务器”的电脑,但它的作用仅仅是方便大家相互“交换”版本库的更改而已,没有它也可以进行工作,不过在“交换”更改数据的时候会稍微麻烦一些。

图形化显示版本历史的小工具 gitg。图为 LCTT 翻译项目 版本历史。
Github 和 Git 有什么关系?
也许你没有听过 Git,但听说过 Github,它们是什么关系?Github 是一个基于 Git 的在线开源项目托管库。

Github 与本地 Git 仓库。
在 Github 上新建一个项目,实际上就相当于新建了一个版本库(也叫仓库),称为 Repository(Repo)。你可以新建一个项目,也可以通过 Github 的“Fork”功能复制一个已有的仓库到你的帐号下,而这正是协作的常见模式。图中的 Main Repo 相当于上文提到的“中央服务器”,方便大家交换更改。比如当你拥有一个项目的 Fork,发现其中有 bug,你可以在你的仓库中修复它,先提交到自己的 Repo,然后向 Main Repo 发起拉取请求(PR)。当你的请求被接受,你所做的修改就合并进了 Main Repo 中。
你在 Github 拥有项目时,你可以把它 Clone 到本地,或将你已有的本地版本库推送到 Github。此时 Github 上面的 Repo 是你的远端仓库。你可以在本地做出修改并提交,推送到你的 Github 远端仓库之中。而你的 Github 仓库任何人都可以看到,也就方便大家进行版本库的修改推送等操作。
Github 不仅仅只是个在线的开源项目托管库,它更多地引入了社交元素,称为“社会化编程协作”。你可以 Folllow 你感兴趣的用户或关注(Watch)/收藏(Star)你感兴趣的项目。而依托于互联网也使得全世界的人们都可以轻松地协作完成同一个项目。比如大名鼎鼎的 Linux内核 就托管在 Github 之上。
关于 Github 的更多详情可以参考 GotGithub 教程。
Git 的仓库是什么样子?
你看了这么多,知道 Git 是个版本管理系统,但也许还是对它没有一个直观的感受。来,上图:

Git 仓库结构
这里只是直观介绍一下 Git 仓库结构。
当你创建一个仓库之后,你就拥有了你自己的版本库了。你的项目文件夹就是工作区,你可以对项目文件随意进行修改。(你的仓库里的 .git 文件夹就是 Git 用来跟踪管理版本库的信息,不属于工作区,请不要随意修改!)工作区和版本库之间还有一个暂存区,当你工作的时候,可以把修改完的文件使用 git add
命令提交到暂存区。此时提交到暂存区的内容并没有提交入版本库。所有工作完成后,你可以将暂存区里存储的修改作为一个版本,使用 git commit
命令提交到版本库。这才完成了一次版本提交。
太好了,那怎么学习使用 Git 呢?
本文只是抛砖引玉,简单介绍了 Git 和 Github。
推荐 @廖雪峰 的 Git 教程。(←他的 Python 教程一样给力哦~)
传送门: (~ ̄▽ ̄)→ 戳我