📚 全栈开发学习系列
01 路线总览与环境搭建 ✅
02 Python 语法基础 ✅
03 Python 进阶(上):文件读写与模块系统 ✅
04 Python 进阶(下):异常处理与综合实战 ✅
05 C 语言与内存:指针、分配与释放 ✅
06 数据结构与算法:链表、栈与队列 ✅
07 Git 版本控制:分支、合并与冲突解决(当前篇)
08 Linux 命令行:文件、权限与进程管理
Git 版本控制:分支、合并与冲突解决
从单人提交到多设备协作,掌握分支管理与冲突解决的核心技能
进阶篇
Git
版本控制
读完本篇你将能:初始化 Git 仓库并完成首次提交,创建和切换分支,执行 fast-forward 与三方合并,手动解决合并冲突,配置远程仓库并在多台设备间同步代码,执行一套完整的分支开发工作流。
📑 本文目录
01从数据结构到版本控制
02Git 基础:仓库初始化与首次提交
03分支管理:创建你的平行宇宙
04合并策略:让支流汇入主干
05冲突解决:当两条修改撞车
06多设备协作:远程仓库与同步
07综合实战:完整分支开发流程
08动手练习
01 从数据结构到版本控制
上一篇你用 C 和 Python 实现了链表、栈、队列——这些结构解决了"如何在内存中组织数据"的问题。但代码不只存在于内存中,它还存在于硬盘上、存在于多台设备之间、存在于团队协作中。如何管理代码的每一次修改、如何在多台设备间同步、如何让多人同时开发而不互相覆盖?这就是版本控制要解决的问题。
Git 是一台时光机:它记录代码的每一次修改,你可以随时回到任何一个历史版本。没有 Git 之前,人们靠手动复制文件夹来备份:project_v1、project_v2_final、project_v2_final_真的最终版——这种管理方式在团队协作中会立刻崩溃。
Git 的三个核心概念:
仓库 Repository
Git 管理的目录,内含 .git 隐藏文件夹记录全部历史
提交 Commit
一次代码快照,包含改动内容、时间、作者和说明信息
分支 Branch
独立的开发线,不影响主干,合并后合入主线
02 Git 基础:仓库初始化与首次提交
Git 的工作流程分三步:工作区(你编辑的文件)→ 暂存区(git add 后的待提交内容)→ 仓库(git commit 后的历史记录)。这个三段式设计让你可以精确控制每次提交包含哪些改动。
初始化仓库与首次提交
Bash
mkdir my-project && cd my-project
git init
# Initialized empty Git repository in /home/user/my-project/.git/
echo "# My Project" > README.md
git add README.md
git commit -m "初始化项目"
# [main (root-commit) a1b2c3d] 初始化项目
每条命令的作用:git init 在当前目录创建 .git 隐藏文件夹(仓库的"引擎");git add 把文件从工作区放入暂存区;git commit -m 把暂存区的内容快照到仓库历史中。
查看状态与历史
Bash
echo "print('hello')" > main.py
git status
# Untracked files:
# (use "git add ..." to include in what will be committed)
# main.py
git add . # 暂存所有改动
git commit -m "添加 main.py"
git log --oneline
# e4f5g6h (HEAD -> main) 添加 main.py
# a1b2c3d 初始化项目
git status 是你最常用的命令——它告诉你哪些文件被修改了、哪些在暂存区、哪些还未被 Git 跟踪。git log --oneline 用一行一个提交的简洁格式查看历史,每行前面的哈希值(如 e4f5g6h)是该提交的唯一标识。
⚠️ 常见错误
git commit -m "更新" — 提交信息过于模糊,三个月后你完全不知道"更新"了什么
✓ 正确:git commit -m "添加用户登录接口的参数校验"——动词开头,说明具体改了什么
03 分支管理:创建你的平行宇宙
分支是 Git 最强大的特性。想象平行宇宙:从同一个时间点出发,你可以在宇宙 A 开发登录功能,同时在宇宙 B 修复 bug,两个宇宙互不干扰。开发完成后,把两个宇宙合并回主线就行。
Git 2.23 引入了 git switch 命令,替代了老旧的 git checkout 用于分支切换(checkout 一个命令干太多事,容易出错):
Bash
git branch feature-login # 创建分支
git switch feature-login # 切换到分支
# Switched to branch 'feature-login'
git switch -c hotfix-bug # 创建并切换,一步到位
git branch -a # 查看所有分支
# * hotfix-bug
# feature-login
# main
git switch -c 是最常用的组合:创建新分支并立即切换过去。* 标记当前所在分支。分支名建议用 feature/xxx(新功能)、hotfix/xxx(紧急修复)、docs/xxx(文档更新)前缀,让分支用途一目了然。
💡 小贴士
分支在 Git 中非常轻量——创建分支只是创建一个指针(40 字节的文件),不复制任何代码。所以不要犹豫,随时创建分支。Git 鼓励频繁分支、频繁合并的工作流。
04 合并策略:让支流汇入主干
分支开发完成后,需要把改动合并回 main 主干。Git 有两种合并方式,选择哪种取决于分支历史的关系。
Fast-forward 合并
如果 main 分支在 feature 分支创建后没有新提交,Git 只需把 main 指针"快进"到 feature 的最新位置——这叫 fast-forward 合并,不会产生额外的合并提交:
Bash
git switch main
git merge feature-login
# Updating a1b2c3d..e4f5g6h
# Fast-forward
git branch -d feature-login # 删除已合并分支
三方合并(Three-way Merge)
如果 main 和 feature 分支都有各自的新提交,Git 找到两个分支的共同祖先,做一个三方比较,自动合并改动并生成一个 merge commit:
Bash
git switch main
git merge hotfix-bug
# Merge made by the 'ort' strategy.
# main.py | 3 +++-
# 1 file changed, 2 insertions(+), 1 deletion(-)
输出中的 2 insertions(+), 1 deletion(-) 告诉你合并涉及多少行改动。如果两个分支修改了同一文件的不同位置,Git 能自动合并。但如果修改了同一文件的同一行——冲突就来了。
05 冲突解决:当两条修改撞车
冲突不可怕——它只是 Git 在说"这两条改动我都看到了,但不知道该保留哪个,你来做决定"。让我们制造一个真实的冲突场景。
制造冲突
Bash
|
1
2
3
4
5
6
7
8
9
10
11
12
|
# main 分支修改 README.md 第1行
echo
echo "# My Awesome Project" > README.md
git commit -am "更新标题"
# feature 分支修改同一行
git switch feature-login
echo "# Login Feature" > README.md
git commit -am "更新标题"
# 合并 → 冲突!
git switch main
git merge feature-login
|
输出
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
理解冲突标记
打开冲突文件,你会看到 Git 插入的三组标记:
README.md(冲突状态)
<<<<<<< HEAD
# My Awesome Project
=======
# Login Feature
>>>>>>> feature-login
三组标记的含义:<<<<<<< HEAD 到 ======= 之间是当前分支(main)的版本;======= 到 >>>>>>> feature-login 之间是合并进来的分支版本。
手动解决冲突
解决冲突就是:编辑文件,删除冲突标记,保留正确的版本(也可以合并两个版本),然后提交:
Bash
# 手动编辑 README.md,改为最终版本:
# # My Awesome Project with Login
git add README.md
git commit -m "合并 feature-login,解决标题冲突"
# [main f7g8h9i] 合并 feature-login,解决标题冲突
⚠️ 常见错误
git merge --abort 之后又重新 merge — 如果冲突原因没解决,重新 merge 还会冲突
✓ 正确:先理解两个分支各改了什么,再决定保留哪个版本或如何合并。如果不确定,用 git diff 查看具体差异
06 多设备协作:远程仓库与同步
你的全栈学习涉及四台设备:macOS 做主力开发、Termux 随身练习、树莓派跑本地服务、云服务器部署。Git 的远程仓库就是这些设备之间的"中转站"——所有设备都指向同一个远程仓库,通过 push 和 pull 同步代码。
配置远程仓库与推送
Bash
|
1
2
3
4
5
6
7
8
9
|
# 在 GitHub/Gitee 创建空仓库后
git remote add origin git@github.com:user/repo.git
git push -u origin main
# 另一台设备克隆
git clone git@github.com:user/repo.git
cd repo
# 日常同步:先拉后推
git pull # 开始工作前拉取最新
git push # 完成后推送到远程
|
-u 参数设置 upstream(上游关联),之后直接 git push 和 git pull 不用再指定远程名和分支名。
⚠️ 常见错误
直接 git push — 在新设备上忘记先 git pull,远程已有别人的提交,push 被拒绝
✓ 正确:每次开始工作前先 git pull,写完代码后 git add . → git commit → git push
.gitignore:告诉 Git 忽略什么
不是所有文件都该提交到 Git——密码、密钥、编译产物、虚拟环境都不应该进入版本库。在项目根目录创建 .gitignore 文件:
.gitignore
# Python
__pycache__/
*.pyc
venv/
# 敏感信息
.env
*.pem
# 系统文件
.DS_Store
💡 小贴士
如果不小心把 .env 文件提交了,即使后续删除并提交,历史记录中仍然存在。需要用 git filter-branch 或第三方工具 BFG 清理历史。所以:先写 .gitignore,再开始提交。
07 综合实战:完整分支开发流程
把前面学到的所有命令串成一套完整的分支开发工作流——这是你在实际项目中最常用的操作序列:
Bash
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 1. 开始工作前:拉取最新代码
git switch main
git pull
# 2. 创建功能分支
git switch -c feature/user-auth
# 3. 编写代码,分多次提交
git add .
git commit -m "添加用户认证模块"
# 4. 合并回 main
git switch main
git merge feature/user-auth
git branch -d feature/user-auth
# 5. 推送到远程
git push
|
这个流程的精髓:main 分支始终保持可运行状态。所有开发在 feature 分上进行,测试通过后才合并回 main。这样无论你在哪台设备上 git pull main 分支,拿到的都是可用的代码。
| 命令 |
用途 |
频率 |
git status |
查看工作区状态 |
每小时 |
git add . |
暂存所有改动 |
每次提交前 |
git commit -m |
提交到本地仓库 |
每天多次 |
git pull |
拉取远程更新 |
开始工作前 |
git push |
推送到远程仓库 |
完成工作后 |
git switch -c |
创建并切换分支 |
开始新功能时 |
08 动手练习
🟢 基础验证
创建一个新目录 git-practice,执行 git init,创建一个 hello.txt 文件,完成 add → commit 流程,然后用 git log --oneline 验证提交记录。
🟡 组合应用
在上一个练习的基础上,创建 feature/add-content 分支,在 hello.txt 中添加一行内容并提交。切回 main 分支,修改同一行内容并提交。执行 merge 制造冲突,手动解决后完成合并。
🔴 开放挑战
在 GitHub 或 Gitee 上创建一个远程仓库,将本地项目推送上去。然后在另一台设备(如 Termux 或树莓派)上克隆该项目,修改代码后 push 回远程。回到原设备 pull 最新代码,验证多设备同步是否正常。提示:需要配置 SSH 密钥或使用 HTTPS 方式认证。
📖 知识回顾
git init / add / commit
git switch -c 分支
fast-forward 合并
三方合并
冲突标记解析
remote / push / pull
.gitignore
多设备工作流
下篇预告
08 Linux 命令行:文件、权限与进程管理
Git 协作已就绪,系列最后一篇回到 Linux 命令行——掌握文件操作、权限管理和进程控制,让四台设备(macOS、Termux、树莓派、云服务器)在你的指尖运转自如。