当你的毕业论文文件名从“最终版”变成“最最终版”再变成“最最终版打死不改版”时你一定想过有没有一个工具能让我清晰地看到每一次修改随时回到任何一个版本还能跟别人一起协作而不互相覆盖作为一名程序员这种痛苦每天都在发生。但好在我们有版本控制。如果你打开过自己电脑上的“毕业论文”文件夹你可能会看到类似这样的景象名称修改日期XXX毕业论文.docx2021/4/7 15:01XXX毕业论文改1.docx2021/4/7 15:01XXX毕业论文改2.docx2021/4/7 15:01XXX毕业论文完成版1.docx2021/4/7 15:01XXX毕业论文最终版2.docx2021/4/7 15:01XXX毕业论文最最终稿对不修改版修改就辍字版.docx2021/4/7 15:01遗书.docx2021/4/7 15:01这就是“手工控制版本”的典型写照。它存在两个致命的缺点粒度太大你无法精确知道改1和改2之间到底改了什么、可控性太差你甚至不知道“遗书.docx”是谁写的为什么存在。而版本控制就是来解决这个问题的。一、版本控制给你的代码装上“时光机”所谓版本控制本质上就是一个记录文件内容变化的系统让你可以随时查阅特定版本的修订情况。简单来说它做了三件事记录历史每一次修改都被记录下来包括谁改的、什么时候改的、改了哪里。随时回退不管你的代码崩成什么样你都可以一键回到“还能运行”的那个版本。多人协作你和同事可以同时修改同一个项目系统会自动合并你们的改动而不是互相覆盖。听起来很美好对吧但现实中很多人对版本控制的理解还停留在“把代码拷到U盘里备份”的阶段。这种“手工控制”带来的问题我们不妨看看几个真实场景。场景1改了几行代码程序崩了改回去也还是崩你的代码本来正常运行。你改了其中几行程序出了问题。你凭记忆把代码改回去结果程序还是不能工作。为什么因为你可能改了三处却只记得改回两处。或者你在改的过程中无意间触发了其他依赖的变化。人脑无法精确记住每一次修改的细节。场景2昨天还能跑今天崩了客户下午要演示你昨晚做了大量改进代码规模大了不少但还没调试完成。今天客户要看你程序的演示版。怎么办如果有版本控制你可以一键切换到昨天稳定版本的代码先完成演示。等客户走了再切回今天的分支继续开发。场景3客户的需求反复横跳第一天要对话框显示进度。第二天对话框不好看改成进度条。第三天还是对话框好看改回来。如何应对用版本控制你只需要创建不同的分支branch每个需求独立开发。客户改主意时你只需要切换分支而不是把代码“抠出来”再“塞回去”。场景4有人在你代码里动了手脚但死不承认程序员A说“这段代码不是我写的。”怎么查版本控制工具会记录每一次提交的作者、时间和内容。你甚至可以逐行查看是谁、在什么时候、为什么加了这行代码。场景5权限管理开发人员需要修改代码测试人员只需要读取代码不能随意改动。如何实现版本控制工具尤其是集中式系统天然支持权限控制可以精细到谁对哪些文件有读/写权限。场景6代码备份项目源码存放在本地万一硬盘坏了、电脑丢了所有工作付诸东流。版本控制工具通常配合远程仓库使用代码同时在本地和云端存在一台机器出问题另一台可以恢复。场景7两人协作合并后程序不工作你改了一部分代码正常运行同事改了一部分代码也正常运行。你把两个人的代码合并在一起程序崩了。怎么定位问题版本控制工具可以自动比较两个版本的差异并高亮显示哪些文件、哪些行发生了变化。你可以逐行审阅判断冲突来源。场景8项目管理与工作量统计管理者想知道这个月谁提交了多少代码谁在频繁修复Bug谁一直在改同一个模块版本控制工具能生成详细的提交记录和统计报表为管理提供数据支撑。二、版本控制工具的发展史从集中式到分布式为了解决以上问题版本控制工具应运而生。但不同的工具走的是不同的技术路线。集中式版本控制工具CVS、SVN这类工具的代表是SVNSubversion。它的工作模式是这样的有一个中央服务器保存所有文件的全部版本。每个开发者通过客户端连接到这台服务器取出最新文件或提交更新。优点管理员可以轻松控制权限。每个人都能在一定程度上看到项目中的其他人正在做什么。缺点离线无法工作断网或服务器宕机时你无法提交更新、无法查看历史版本。单点故障如果中央服务器崩溃且没有备份所有版本历史可能丢失。只有最新版本每个开发者本地只有代码的最新快照而非完整历史。下图是SVN的工作原理示意分布式版本控制工具Git、Mercurial分布式系统的出现解决了集中式的核心痛点。以Git为代表它做了两件关键的事本地是完整仓库每个开发者在本地克隆的不是最新快照而是整个代码库的所有版本包括完整历史。这意味着你可以在离线状态下进行几乎所有版本控制操作。没有唯一的中央服务器即便中央服务器挂了任何一个客户端的本地仓库都可以作为新的服务器恢复整个项目。此外服务器可以采用集群、主从复制等方式提高可用性。Git的典型工作流程三、Git的诞生一个两周写出来的传奇Git的诞生本身就是一个充满戏剧性的故事。1991年Linux系统诞生。在之后的十几年里Linux社区一直在使用一款名为BitKeeper的商业版本控制软件。BitKeeper的东家BitMover公司出于“人道主义精神”授权Linux社区免费使用但有一个条件不允许破解。2002年Linux社区开始正式使用BitKeeper。一切看起来都很美好。但到了2005年事情发生了变化。开发Samba一个开源软件的开发者Andrew试图破解BitKeeper的协议被BitMover公司发现。BitMover公司一怒之下收回了Linux社区的免费使用权。这下Linux社区炸了锅。没有版本控制工具Linux这个全世界最大的开源项目将寸步难行。这时Linux的创始人Linus Torvalds做了一个惊人的决定自己写一个于是在2005年Linus用C语言开发了一个分布式版本控制系统并命名为Git在英式英语俚语中意思是“不愉快的人”。有趣的是Git的主体程序只用了两周就开发完成。一个月后Linux系统的源代码正式由Git管理。此后Git迅速风靡全球。2008年GitHub上线成为全球最大的开源代码托管平台。2018年10月微软以75亿美元收购GitHub作为对比2009年Oracle收购Sun公司花了74亿美元。四、代码托管中心你的代码放在哪有了Git这样的分布式版本控制工具后我们还需要一个地方来“共享”代码这就是代码托管中心也称远程仓库。互联网上的托管平台GitHub全球最大的开源托管平台项目丰富但国内访问速度较慢。Gitee码云国内托管平台服务器在国内访问速度快适合国内开发者和企业使用。局域网内的自建平台GitLab开源的仓库管理系统可以部署在企业内部服务器上适合有安全合规要求、不能使用外网的企业。五、Git安装与配置实战第一步说了这么多我们不妨把Git装起来亲自体验一下。下载与安装Git的官方网站是https://git-scm.com/。我们以Git 2.40.0版本为例演示安装过程。下载好的安装包https://pan.baidu.com/s/1eWcDgvUGMelyfGTEZSQKoQ?pwdm2um1. 查看GNU协议直接点击“下一步”。2. 选择安装目录要求是非中文、无空格的目录比如 D:\ProgramFiles\Git。3. 选择组件建议勾选Git Bash HereGit GUI HereGit LFS大文件支持关联 .git 配置文件4. 选择默认编辑器建议使用默认的Vim虽然对新手不太友好但它是Git的默认编辑器后续可根据需要更换。5. 设置初始分支名选择“Let Git decide”分支名默认为 master。6. 调整PATH环境变量选择“Git from the command line and also from 3rd-party software”推荐选项这样你可以在Windows的命令提示符、PowerShell和Git Bash中都能使用Git命令。7. 选择SSH客户端选择“Use bundled OpenSSH”使用Git自带的SSH客户端确保兼容性。8. 选择HTTPS后端选择“Use the OpenSSL library”。9. 配置行末换行符选择“Checkout Windows-style, commit Unix-style line endings”推荐。这样Git会自动处理Windows和Linux/Unix之间的换行符差异。10. 选择终端类型选择“Use MinTTY”Git Bash的默认终端因为它支持Linux命令和更丰富的功能。11. 配置 git pull 行为选择默认的“Default (fast-forward or merge)”。12. 选择凭据管理器选择“Git Credential Manager”方便后续存储用户名和密码。13. 其他配置勾选“Enable file system caching”提升性能和“Enable symbolic links”支持符号链接。14. 实验室功能不要勾选这些功能有已知Bug技术尚不成熟。15. 点击“Install”开始安装完成后点击“Finish”。测试安装是否成功安装完成后在桌面或任意文件夹中右键点击选择“Git Bash Here”。在打开的终端中输入git --version如果出现类似 git version 2.40.0.windows.1 的输出说明安装成功。六、Git的核心思想工作区、暂存区、本地仓库在正式开始使用Git之前有一个概念非常重要它贯穿了Git的整个使用过程那就是三个区域工作区Working Directory你电脑上实际看到的文件目录你在里面编辑、删除、新增文件。暂存区Staging Area / Index一个临时的区域用于存放你准备提交的文件快照。你可以把它理解为“提交前的待办列表”。本地仓库Local Repository真正存放所有版本历史的地方在你电脑的 .git 目录下。基本的操作逻辑是在工作区修改文件。用 git add 将修改添加到暂存区。用 git commit 将暂存区的内容提交到本地仓库形成一个版本。用 git push 将本地仓库的版本推送到远程仓库如GitHub、Gitee。用 git pull 从远程仓库拉取其他人的更新到本地。而 git clone 则是第一次从远程仓库下载整个项目包括完整历史到本地。七、总结为什么你迟早要用Git无论你是学生、独立开发者还是团队成员版本控制都不是一个可选项而是必需品。它帮你解决的问题远不止“文件丢了”这么简单。它让你能够无惧改错随时回到任何历史版本。安心实验新建分支试错成本极低。高效协作多人同时开发互不干扰合并清晰。责任可溯每一行代码都有归属每一个改动都有记录。数据安全代码既在本地又在云端多重备份。Git作为当前最主流的分布式版本控制系统已经不仅仅是一个工具它几乎成为了现代软件开发的基础设施。学好Git相当于给你的代码买了一份“终身保险”。