1、Git起源与哲学:Linus Torvalds与Linux内核的故事、Git与SVN/CVS的核心区别、Git的三大工作区域与数据流
1.1 Linus Torvalds与Linux内核的故事
聊Git,绕不开一个人——Linus Torvalds。
2005年,Linux内核开发正处在焦头烂额的状态。当时他们用的版本控制工具叫BitKeeper,是个商业软件。本来人家免费给Linux社区用,结果有个开发者试图逆向BitKeeper的协议,直接把合作关系搞崩了。BitKeeper收回授权,Linux内核开发瞬间没了版本控制工具。
Linus当时说了句很经典的话:「我不要用SVN,那玩意儿是垃圾。」
嗯,他就是这么直白。
于是Linus决定自己写一个。他给自己定了几个目标:
- 速度要快。比任何现有工具都快。
- 设计要简单。不能像CVS那样复杂。
- 支持非线性开发。分支合并必须流畅。
- 完全分布式。每个人都是完整仓库。
- 能应对Linux内核这种超大规模项目。
结果呢?他只用了10天就写出了Git的初版。没错,10天。
我在项目中见过不少人对这个速度感到震惊。但说实话,Linus不是从零开始写的——他借鉴了文件系统的一些设计理念,比如内容寻址存储。Git的核心其实就是一个内容可寻址的文件系统,版本控制只是它的一种应用。
核心要点:Git的设计哲学是「信任但验证」。每个文件、每次提交都有SHA-1哈希值,数据完整性由密码学保证。你改了一个字节,整个哈希链都会变。
1.2 Git与SVN/CVS的核心区别
很多人刚接触Git时,会拿它跟SVN比。我刚开始带团队时也犯过这个错——用SVN的思维去用Git,结果把自己坑得不轻。
它们到底差在哪?我列个表给你看:
| 对比维度 | Git | SVN / CVS |
|---|---|---|
| 架构模式 | 分布式 | 集中式 |
| 网络依赖 | 大部分操作离线完成 | 几乎所有操作都需要联网 |
| 分支模型 | 轻量级分支,创建成本极低 | 分支本质是目录拷贝,成本高 |
| 数据存储 | 快照式存储 | 差异式存储 |
| 完整性 | SHA-1哈希校验 | 无内置校验 |
| 提交粒度 | 本地提交,可随时提交 | 提交即推送,必须联网 |
说白了,SVN是「中央集权制」——所有代码都放在中央服务器上,你每次提交都要跟服务器确认。Git是「联邦制」——每个人本地都有完整仓库,你爱怎么提交就怎么提交,最后再同步。
为什么会这样?因为Linus要解决的核心问题是:Linux内核有上千个开发者分散在全球各地,网络条件参差不齐。如果每个人都必须连到中央服务器才能工作,那效率就太低了。
我的经验:有一次在客户现场做紧急修复,网络断了。SVN的同事只能干瞪眼,我这边Git本地提交、分支切换、代码回滚,全都能做。等网络恢复后,一个git push就完事了。这就是分布式的威力。
1.3 Git的三大工作区域与数据流
这是Git最核心的概念,也是新手最容易搞混的地方。我见过太多人把文件改了就直接git commit,结果发现提交的不是自己想要的内容。
Git有三个工作区域:
- 工作区(Working Directory):你电脑上能看到的文件目录。你在这里编辑代码。
- 暂存区(Staging Area / Index):一个临时存放区域。你决定哪些改动要进入下一次提交。
- 仓库(Repository / .git目录):真正存储所有版本历史的地方。
数据流是这样的:
工作区 --git add--> 暂存区 --git commit--> 仓库
仓库 --git checkout--> 工作区
你想想看,为什么要有暂存区?
我举个例子。你在改一个功能,同时修了两个bug。三个改动混在一起,但你想把它们分成三次提交。没有暂存区的话,你只能一次全提交。有了暂存区,你可以把每个改动分别git add,然后分别git commit。
避坑指南:我曾经有个同事,改了十几个文件,直接git commit -a提交了。结果有个调试用的日志文件也被提交进去了。后来那个日志文件被部署到生产环境,日志刷爆了磁盘。嗯,从那以后我养成了习惯——每次提交前都用git status看一眼,确认暂存区里到底放了什么。
还有一个概念叫「HEAD指针」。它指向你当前所在的分支的最新提交。你可以把它理解成一个书签,标记着你现在在哪个位置。
数据流的完整路径是这样的:
- 你在工作区修改文件
- git add 把改动放入暂存区
- git commit 把暂存区的内容打包成一个快照,存入仓库
- git push 把本地仓库的提交推送到远程仓库
- git pull 把远程仓库的更新拉取到本地
记住一个原则:工作区是你干活的地方,暂存区是你整理的地方,仓库是你存档的地方。这三个区域各司其职,搞清楚了,Git就学会了一半。
一句话总结:Git不是SVN的升级版,它是另一种思维模式。分布式、快照式、内容寻址——这三个词记住了,你就抓住了Git的灵魂。