# Git 版本控制:时间的后悔药
> 💡 **一句话解释**:Git 就是代码世界的**游戏存档管理器**。它能让你随时“读档”重来,也能让你和队友在各自的“平行宇宙”里互不干扰地开发。
## 1. 为什么我们需要它?
你是否经历过这种绝望?
```text
论文_初稿.doc
论文_修改版.doc
论文_最终版.doc
论文_最终版_打死不改版.doc
论文_绝对是最后一次修改版.doc
```
**Git 完美解决了三个问题**:
1. **版本混乱**:不需要复制副本,一个文件夹搞定所有历史版本。
2. **无法后悔**:删错了代码?一秒钟找回三天前的状态。
3. **协作冲突**:你改了 A 文件,我改了 B 文件,Git 帮我们自动合并。
---
## 2. 核心概念:三个箱子
Git 的设计哲学其实很像**寄快递**。
- **工作区 (Working Dir)**:你的**书桌**。你正在这里写代码,想怎么乱改都行。
- **暂存区 (Staging Area)**:**快递盒**。你把写好的文件放进去(`git add`),准备打包。
- **仓库 (Repository)**:**快递柜**。一旦你封箱寄出(`git commit`),这个版本就被永久记录下来了。
> 🔑 **关键点**:只有提交(Commit)到仓库的内容,才是安全的。工作区里没提交的内容,丢了就真丢了。
---
## 3. 基础工作流:存档三步走
日常开发中,你 90% 的时间都在重复这三个动作。
1. **修改代码**:在工作区写写画画。
2. **`git add`**:挑选你要保存的文件,放入暂存区。
3. **`git commit`**:给这次修改起个名字(比如“修复了登录 Bug”),永久存档。
---
## 4. 平行宇宙:分支 (Branch)
这是 Git 最强大的功能。想象你在玩游戏,前面有个大 Boss(上线新功能),你怕打不过导致游戏结束(系统崩溃)。
这时候,你可以开一个**分支 (Branch)**,相当于**复制了一个平行世界**。
- **主分支 (Main/Master)**:稳定的线上版本,只有测试通过的代码才能进来。
- **开发分支 (Feature)**:你的试验田。你在这里炸了地球也没关系,不会影响主分支。
- **合并 (Merge)**:你在试验田里测试成功了,就把改动“合并”回主分支。
---
## 5. 常用命令速查
| 命令 | 作用 | 人话解释 |
| :-------------------- | :------------- | :------------------------------------- |
| `git init` | 初始化 | "我要在这里建个新仓库" |
| `git status` | 查看状态 | "现在书桌上乱不乱?有没有东西没装箱?" |
| `git add .` | 添加所有 | "把桌上所有文件都扔进快递盒" |
| `git commit -m "..."` | 提交 | "封箱!贴上标签,写上这次改了啥" |
| `git log` | 查看历史 | "翻翻以前的日记" |
| `git checkout -b dev` | 以此创建新分支 | "我要去平行宇宙 dev 探险了" |
| `git checkout main` | 切换分支 | "回地球(主分支)看看" |
| `git merge dev` | 合并分支 | "把平行宇宙的成果带回地球" |
---
## 6. 进阶:解决冲突与远程协作
当你和队友同时修改了同一个文件的同一行代码,Git 就会懵逼:“我该听谁的?” 这就是**冲突 (Conflict)**。
此时你需要手动打开文件,保留需要的代码,删除 Git 自动生成的 `<<<<<<<` 标记,然后重新提交。
至于**远程仓库 (Remote)**(比如 GitHub/GitLab),它就是云端的备份中心。
- `git push`:把本地存档上传到云端。
- `git pull`:把云端最新的存档拉取到本地。