为什么需要版本控制:U盘问题
Source: Dev.to
那时候,错误还能勉强控制,但保存工作却像在拆炸弹。
这是正确的文件吗?已经有人做过编辑了吗?这一步会抹掉别人几小时的工作吗?团队没有撤销按钮——没有倒带,没有安全网,只有希望。
还有那些文件夹?它们充斥着绝望的命名:
final
final_final
final_final_please_work
dont_touch_this_one
这并非夸张或怀旧;这正是开发者的日常,也是版本控制诞生的根本原因。
问题是具体的
在 Git 等工具出现之前,代码并没有安全地存放在云端。它会通过 USB 盘、电子邮件、共享文件夹以及 FTP 服务器在不同人之间传递。代码的流转方式类似实体文档,而不是作为可追溯的历史记录。
从本质上说,版本控制解决了一个根本性的问题:多个人如何在同一段代码上协作而不相互覆盖?
开发者把代码当作 Word 文档来对待——打开、编辑、保存、覆盖。每一次覆盖都相当于抹去了一部分历史。
版本控制之前的协作
想象一个小团队共享一只装有整个项目的 USB 驱动器。
- 开发者 A 更新了一些代码,保存后把驱动器交给下一个人。
- 开发者 B 编辑了其他内容并保存,覆盖了 A 的工作。
- 开发者 C 仍在使用较旧的副本并在其上进行更改。
当驱动器再次传回时,没人知道:
- 哪个版本是最新的?
- 哪个版本实际上可以正常工作?
- 哪个更改导致了 bug?
- 为什么实习生提交了未完成的代码?
这些并不是草率的习惯;那是当时团队唯一的工作方式。核心问题仍未得到解答:
- 是谁做了此更改?
- 我们应该信任哪个文件?
- 这个 bug 首次出现是什么时候?
- 为什么它在一台电脑上运行正常,却在其他所有电脑上都失败?
- 有人在生产环境直接测试过吗?
随着项目规模扩大,U 盘被电子邮件附件、FTP 上传和共享公司文件夹取代,但问题仍然相同:代码被共享,但更改没有被追踪。 开发者开始复制文件和文件夹,导致目录名称不断膨胀,例如:
project_final
project_final_v2
project_latest
project_latest_final
project_latest_final_please_work
每个名称都是一次小小的希望。一次不小心的保存可能会抹去数天的进度,这并非因为坏习惯,而是工作流根本不支持安全协作。
The real turning point: Linux and BitKeeper
Linux 是一个规模庞大、全球使用的项目,每天都有成千上万的贡献者修改代码。自 2002 年起,Linux 项目依赖一种名为 BitKeeper 的专有工具。2005 年其免费使用被终止后,社区突然失去了赖以依赖的系统,开发进度随之放缓。
当时没有足够强大的开源替代方案可以取代 BitKeeper,Linus Torvalds 便像往常一样在没有合适选项时 自行创建 了一个工具。其结果就是 Git。
Git的诞生
Git 并不是为了好看或在第一天就易于使用而构建的。它是为大规模处理混乱而构建的。它的目标简单而严格:
- 永不丢失工作 – 每一次更改都必须被保存。
- 支持非常大的项目。
- 极其快速。
- 适用于分布式团队,且不依赖单一的中心服务器。
Git 并不是为了让开发者感到舒适而设计的;它是为了让协作可靠而设计的。
Git 如何改变开发
开发者曾经视为正常的问题突然有了解决方案:
- 被删除或覆盖的代码可以恢复。
- 冲突的更改可以干净地解决。
- 团队协作变得有结构且可预测。
- 每一次更改都有永久记录。
版本控制不再是临时的补救措施,而成为现代软件开发的核心。
现在,开发者可以:
- 无忧尝试新想法。
- 在独立的分支上开发功能。
- 在几秒钟内撤销错误。
- 自信地协作。
错误不再令人恐惧;它们变成了学习的机会。
影响
- 开源项目快速增长。
- 个人项目的风险感降低。
- 团队对变革更加开放。
- 开发变得不那么有压力。
Git 并没有消除错误——它消除了对错误的恐惧。
澄清 Git 与 GitHub 的区别
- Git – 在你的电脑上安装的软件工具,用于跟踪代码更改。它可以离线工作,不需要互联网连接。
- GitHub(以及类似服务)– 一个在线存储 Git 仓库的网站,提供诸如议题(issues)、拉取请求(pull requests)和代码审查等协作功能,帮助人们协同工作。
Git 先出现;GitHub 让它走向所有人。Git 的出现并不是因为开发者在追逐下一个炫目的工具,而是因为旧的工作流程在压力下崩溃了。
展望未来
随着 Git 的成熟,围绕它形成了完整的生态系统——GitHub、GitLab、Bitbucket、SourceForge、AWS CodeCommit、Perforce——每个系统都以自己的方式解决协作问题。尤其是 GitHub,已经演变成一个共享舞台,开发者可以公开协作,思想在开放中成长。
在下一篇文章中,我们将从 Git 为什么存在 转向 Git 如何工作,一步步探讨 Git 基础和必备命令。