Chapter 1: Introducing Git & Version Control | Git与版本控制入门
1.1 为什么你需要版本控制?Why Do You Need Version Control?
你有没有过这样的经历?花了一周时间写的科幻作文,改了十几版,最后电脑里存着「科幻作文_v1.docx」「科幻作文_v2_改结局.docx」「科幻作文_最终版.docx」「科幻作文_真的最终版.docx」,交作业的时候手忙脚乱找不到最新版?或者和同学一起做机器人项目,你改了Arduino代码,同学改了结构设计,最后互相覆盖了对方的文件,白忙活了一下午?又或者你辛辛苦苦做的PPT,被同学不小心删了一页,你死活想不起来原来那页写了什么?
这些困扰你的问题,本质都是没有版本控制 Version Control 导致的。版本控制是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。简单来说,它就是给你的文件、代码、项目配了一个「时光机」,你可以随时回到任何一个历史版本,查看每一次修改的内容,再也不用怕文件丢失、改错覆盖、找不到历史版本的问题。
对于青少年来说,版本控制不是只有专业程序员才需要的东西:你写的每一篇参赛作文、做的每一个机器人项目、剪的每一个视频、甚至画的每一幅画,都可以用版本控制来管理。比如你参加青少年科技创新大赛,项目的代码改了上百版,评委问你某一个功能是怎么迭代出来的,你直接调出提交历史,每一次修改的时间、内容、原因都清清楚楚,比你说半天都有用。
> 💡 电子版侧边栏提示:根据2023年Stack Overflow全球开发者调查,超过92%的专业开发者使用Git进行版本控制,在青少年编程教育领域,Git已经成为Codecademy、Kaggle等学习平台的标准工具,就连Linux、Android、VS Code这些你耳熟能详的开源项目,都是用Git管理的。
---
1.2 版本控制的进化:从手动备份到Git The Evolution of Version Control: From Manual Backup to Git
在版本控制工具出现之前,人们只能靠手动备份来管理文件:改一次文件就复制一份,文件名里加个日期或者版本号,比如「报告_20240501.docx」「报告_20240502.docx」。这种方法在文件少、修改少的时候还能用,但一旦项目变大、修改变多,立刻就会出现各种问题:文件名乱飞找不到、硬盘被占满、想对比两个版本的差异要逐行翻文件,效率极低。
后来出现了第一代版本控制工具,比如集中式版本控制系统 Centralized Version Control System, CVCS,代表是SVN(Subversion)。它的逻辑是把所有的版本数据都存在一个中央服务器上,用户需要的时候从服务器下载最新版本,修改完再上传到服务器。听起来很方便,但问题也很明显:你必须联网才能提交、查看历史,要是服务器坏了,所有人的版本数据都没了,就像你把所有的作业都存在老师的U盘里,U盘丢了你就全没了。
为了解决集中式的问题,分布式版本控制系统 Distributed Version Control System, DVCS 诞生了,代表就是我们要学的Git。分布式版本控制的逻辑是:每个用户的本地电脑里都存着完整的版本库,包括所有的历史版本、分支信息,你不需要联网就能提交、查看历史、回退版本,就算中央服务器坏了,随便找一个用户的本地仓库就能恢复所有数据,就像每个同学都有一份完整的作业备份,就算老师的U盘丢了,大家都能把自己的备份交上去。
| 对比维度 | 集中式版本控制(如SVN) | 分布式版本控制(如Git) | | :--- | :--- | :--- | | 存储位置 | 所有版本都存在中央服务器 | 每个用户本地都有完整的版本库 | | 网络依赖 | 提交、查看历史必须联网 | 本地提交、查看历史不需要联网 | | 安全性 | 中央服务器损坏会导致所有数据丢失 | 任意一个用户的本地仓库损坏,都可以从其他用户处恢复 | | 分支效率 | 分支操作需要和服务器交互,速度慢 | 分支操作在本地完成,毫秒级响应 | | 学习难度 | 操作简单,功能少 | 功能丰富,学习曲线稍陡 |
对青少年来说,分布式的优势特别明显:你去参加机器人比赛、信息学奥赛,经常遇到没网的情况,用集中式工具就没法存版本,改坏了也没法回退,用Git就没这个问题,本地随时提交,改错了随时回到之前的版本,哪怕比赛现场没网,也能完美管理你的项目。
---
1.3 Git的诞生:一个极客的10天传奇 The Birth of Git: A Geek's 10-Day Legend
Git不是某个大公司花了好几年做的商业产品,而是一个程序员为了自己用,花了10天做出来的「极客工具」。2005年,Linux内核的开发者们用的版本控制工具BitKeeper突然宣布要收费,Linux之父Linus Torvalds 一怒之下决定自己写一个版本控制工具,用来管理Linux内核的代码。他只用了10天时间,就写出了Git的第一个版本,并且把它开源了,免费给所有人用。
Linus给这个工具起名叫Git,这个词是英国俚语,意思是「让人讨厌的人」,是Linus自嘲:我写这个工具就是为了自己用,才不管别人觉得我讨不讨厌呢。没想到这个「讨人嫌」的工具,后来成了全球最流行的版本控制工具,超过90%的开源项目都用Git管理。
> 💡 电子版侧边栏彩蛋:Git的官方Logo是一个叫做「Gitty」的小精灵,它的形象就是一个小极客,手里拿着代码,代表着Git的开源、极客、自由的精神。
---
1.4 Git的核心优势 Core Advantages of Git
Git之所以能成为最流行的版本控制工具,靠的是几个核心优势,每一个都刚好解决青少年做项目时的痛点:
1.4.1 极快的速度 Blazing Speed
Git的所有操作几乎都在本地完成,不需要和服务器交互,提交、回退、对比差异都是毫秒级。比如你写作文写了1000字,想存个版本,用集中式工具要上传到服务器,可能要等几秒,用Git本地提交,瞬间就完成,哪怕你有几千个版本,操作起来也一点都不卡。
1.4.2 强大的分支功能 Powerful Branching
分支是Git最厉害的功能,没有之一。你可以把分支理解成「平行宇宙」:你现在的作文是主宇宙的内容,你想改结局,又怕改坏了原来的版本,就可以开一个分支,进入平行宇宙随便改,改好了就把平行宇宙的内容合并回主宇宙,改坏了就直接销毁这个平行宇宙,完全不影响主宇宙的内容。
比如你写科幻作文,原来的结局是机器人牺牲自己拯救城市,你想试试黑暗结局:机器人黑化了,毁灭了城市,就开个分支改,改完觉得不好,直接删掉分支就行,原来的版本一点都没动。这个功能对做项目的青少年来说太实用了:你想加新功能,又怕加坏了影响原来的程序,开个分支随便试,试好了再合并,完全不用担心把项目搞崩。
1.4.3 数据完整性保证 Data Integrity
Git里的每一个提交都有一个唯一的哈希值(SHA-1哈希),就像你的指纹,全世界没有两个相同的哈希值。只要你提交的内容有一点变化,哈希值就会变,你可以通过哈希值找到任何一个提交的版本,而且如果有人篡改了你的文件,哈希值就会对不上,你立刻就能发现。
比如你和同学一起做项目,你提交了一个版本,后来发现有人改了你的代码,你可以通过提交历史看到是谁改的,改了什么内容,再也不用怕别人的修改影响你的工作。
1.4.4 完全免费且开源 Free and Open Source
Git是完全免费的开源软件,你不用花一分钱就能用上所有功能,而且它的代码是公开的,全球的开发者都在给它贡献功能,修复bug,你遇到问题随便搜就能找到解决方案,不用担心用着用着公司倒闭了,工具没了。
---
1.5 安装与配置Git:5分钟搭好你的时光机 Install and Configure Git: Build Your Time Machine in 5 Minutes
要使用Git,首先要把Git安装到你的电脑上,然后做简单的配置,只需要5分钟就能搞定。我们分Windows、Mac、Linux三个系统来讲,你可以根据自己的系统跟着操作。
1.5.1 安装步骤 Installation Steps
Windows系统
1. 打开浏览器,访问Git官网:<https://git-scm.com/>,点击「Download for Windows」下载安装包 2. 运行安装包,一路点击「Next」,默认设置就可以,不用改任何选项 3. 安装完成后,在开始菜单找到「Git Bash」,点击打开,输入`git --version`,如果显示出类似`git version 2.43.0.windows.1`的版本号,说明安装成功
Mac系统
Mac安装Git有两种方法,推荐用第一种: 1. 打开「终端」应用,输入`brew install git`,按回车,等待安装完成(如果没有安装Homebrew,先访问<https://brew.sh/>安装Homebrew) 2. 或者打开App Store,搜索「Xcode Command Line Tools」,安装完成后里面自带Git 3. 打开终端,输入`git --version`,显示版本号说明安装成功
Linux系统
Linux的包管理器自带Git,直接输入命令安装即可:
- Debian/Ubuntu系:打开终端输入`sudo apt update && sudo apt install git`
- RedHat/CentOS系:打开终端输入`sudo yum install git`
- 安装完成后输入`git --version`验证
1.5.2 基础配置 Basic Configuration
安装完Git之后,需要先配置你的用户名和邮箱,就像你写作文要署名一样,你提交的每一个版本都会记录你的名字和邮箱,方便别人知道是谁改的。打开终端/Git Bash,依次输入以下命令(把引号里的内容换成你自己的名字和邮箱): ```bash git config --global user.name "你的名字" git config --global user.email "你的邮箱@example.com" ``` 配置完成后可以输入`git config --global user.name`和`git config --global user.email`验证,显示出你设置的内容就说明配置成功。
> ⚠️ 注意:`--global`参数表示这个配置对所有Git仓库都生效,如果你只想对某个特定的仓库配置不同的名字,可以去掉`--global`参数,进入对应仓库的目录再执行命令。
1.5.3 Git安装配置流程图 Git Installation and Configuration Flowchart
下面是Git安装配置的完整流程图,你可以跟着一步步操作: ```mermaid flowchart TD A[开始安装Git] --> B{选择操作系统} B -->|Windows| C[访问git-scm.com下载安装包] B -->|Mac| D[使用Homebrew或Xcode Command Line Tools安装] B -->|Linux| E[使用apt/yum包管理器安装] C --> F[运行安装程序,默认设置] D --> G[终端输入安装命令] E --> H[终端输入安装命令] F --> I[打开终端/Git Bash输入git --version验证] G --> I H --> I I -->|显示版本号| J[配置用户名和邮箱] I -->|报错| K[检查环境变量/重新安装] K --> F J --> L[输入git config --global user.name "你的名字"] L --> M[输入git config --global user.email "你的邮箱"] M --> N[配置完成,可以开始使用Git] ```
---
1.6 创建你的第一个Git版本库 Create Your First Git Repository
安装配置完Git之后,我们来创建第一个Git版本库,体验一下版本控制的魅力。我们以管理科幻作文为例,跟着一步步操作: 1. 在电脑上新建一个文件夹,名字叫「我的科幻作文」,在里面新建一个文本文件,叫「作文.txt」,里面随便写点内容,比如「从前有个机器人叫小白,它走丢了。」 2. 打开终端/Git Bash,输入`cd`加上你文件夹的路径,比如Windows里文件夹在桌面,就输入`cd 桌面/我的科幻作文`,Mac/Linux里输入`cd 桌面/我的科幻作文`,按回车,就进入了这个文件夹的目录 3. 输入`git init`,按回车,你会看到提示`Initialized empty Git repository in 你的文件夹路径/.git/`,说明版本库创建成功了 4. 输入`git status`,按回车,你会看到提示`Untracked files: 作文.txt`,意思是Git发现了这个文件,但还没有开始管理它
这时候你的文件夹里会多出一个隐藏的`.git`文件夹,这个文件夹就是Git的「时光机仓库」,里面存了所有的版本数据、配置信息,千万不要删掉这个文件夹,不然你的所有版本都没了。
1.6.1 提交第一个版本 Submit Your First Version
现在我们要把「作文.txt」的第一个版本提交到版本库里,只需要三步: 1. 加入暂存区 Add to Staging Area:输入`git add 作文.txt`,按回车,这时候Git会把文件的当前变化记录到暂存区。暂存区就像快递驿站,你要提交的文件先放到这里,确认没问题了再正式寄到仓库。 2. 提交到版本库 Commit to Repository:输入`git commit -m "第一次提交:作文初稿"`,按回车,你会看到类似以下的提示: ``` [main (root-commit) 3a2b1c4] 第一次提交:作文初稿 1 file changed, 1 insertion(+) create mode 100644 作文.txt ``` 这说明提交成功了!`3a2b1c4`就是这个提交的唯一哈希值,相当于这个版本的「身份证号」,你可以通过这个编号找到这个版本。
> 💡 小技巧:提交信息`-m`后面的内容要写得清晰明了,方便以后查看历史的时候知道这次提交做了什么,比如可以写成「📝 提交作文初稿:完成机器人走丢情节」,加个emoji更生动。
1.6.2 查看提交历史 View Commit History
提交完成后,你可以输入`git log`查看所有的提交历史,会显示出所有提交的哈希值、作者、时间、提交信息,就像你的作文的修改记录表: ```bash commit 3a2b1c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b (HEAD -> main) Author: 你的名字 <你的邮箱@example.com> Date: Mon May 20 14:30:00 2024 +0800
第一次提交:作文初稿 ``` 如果你想看更简洁的提交历史,可以输入`git log --oneline`,每一行只显示哈希值的前7位和提交信息: ``` 3a2b1c4 第一次提交:作文初稿 ```
1.6.3 修改文件并再次提交 Modify File and Submit Again
现在我们来修改作文,比如加一段内容:「小白是个家政机器人,它的主人是个小学生,今天主人带它去公园玩,不小心走散了。」保存文件后,输入`git status`,你会看到提示`Changes not staged for commit: 作文.txt`,意思是文件被修改了,但还没有加入暂存区。这时候你可以输入`git diff`查看修改的差异,Git会用`+`号标出你新增的内容,`-`号标出删除的内容: ```diff diff --git a/作文.txt b/作文.txt index 1234567..abcdefg 100644 --- a/作文.txt +++ b/作文.txt @@ -1 +1,2 @@ -从前有个机器人叫小白,它走丢了。 +从前有个机器人叫小白,它走丢了。 +小白是个家政机器人,它的主人是个小学生,今天主人带它去公园玩,不小心走散了。 ``` 确认修改没问题后,再次执行`git add 作文.txt`和`git commit -m "第二次提交:补充机器人背景故事"`,就完成了第二个版本的提交。这时候你再输入`git log`,就能看到两个提交记录了。
---
1.7 实践案例:用Git管理你的作文迭代 Practice Case: Manage Your Essay Iteration with Git
现在我们用一个完整的作文迭代场景,来体验Git的版本控制能力。假设你要写一篇参加青少年科幻作文大赛的作品,题目是《机器人小白的冒险》,整个迭代过程如下:
1.7.1 迭代过程 Iteration Process
1. 初稿(800字):写完故事主线,小白走丢后在街上流浪,遇到很多困难,最后被好心人送回家。提交信息:「📝 初稿:完成流浪情节」 2. 第二稿(1000字):补充了小白的背景,它是为了救被车撞的小主人才走丢的,还加了小主人找它的情节。提交信息:「📝 第二稿:补充机器人背景和小主人找小白的情节」 3. 第三稿(1200字):修改了结局,原来的结局是被好心人送回家,现在改成小白自己找到了回家的路,还帮助了其他流浪的机器人,突出了成长的主题。提交信息:「📝 第三稿:修改结局,突出成长主题」
每一次修改完都提交一次,最后你可以输入`git log`看到三个提交记录,每个记录对应一个版本,时间、作者、提交信息都清清楚楚。
1.7.2 对比不同版本的差异 Compare Differences Between Versions
假设你想看看第二稿和第三稿的差异,只需要输入`git diff 第二稿的哈希值 第三稿的哈希值`,Git就会显示出两个版本的不同: ```diff diff --git a/作文.txt b/作文.txt index abcdefg..1234567 100644 --- a/作文.txt +++ b/作文.txt @@ -50,7 +50,7 @@ 小白走了一整天,脚都磨破了,突然看到前面有个熟悉的身影, 是它的主人!主人也看到了小白,跑过来抱住了它。 -