📚 全栈开发学习系列
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、树莓派、云服务器)在你的指尖运转自如。
关注公众号持续获取系列更新