我们继续第3篇,关于分支的管理。在Git中,分支是一个非常重要的概念,它允许你在同一个项目中独立开发不同的功能,而不会相互干扰。让我们用“平行宇宙”的比喻来理解分支。
第3篇:分支:开发新功能的“平行宇宙”
🌌 场景引入
小白:“我想给我的知识星球网站换个颜色主题,但又怕改坏了现在的稳定版本,怎么办?” 爱好者:“这时候就需要开一个‘平行宇宙’——在分支里大胆尝试,成功了再合并到主宇宙,失败了就放弃这个宇宙,主宇宙丝毫不受影响!” 真实痛点:你有没有遇到过?
- 想尝试一个新技术方案,但担心把现有代码搞乱
- 同时开发两个功能,但它们进度不同,一个要提前上线
- 修复一个紧急bug,但手头的新功能只做了一半
分支(Branch)就是解决这些问题的“平行宇宙制造机”!
📚 核心概念(比喻版)
什么是分支?
想象你在写一本小说:
- 主分支(main/master) = 已发布的稳定版本
- 功能分支 = 你正在写的新章节草稿
- 每个人物分支 = 为不同人物写的番外篇
关键点:在分支上写草稿,写好了、满意了,再合并到主故事里。这样主故事永远是可读的完整故事。
为什么需要分支?
- 安全实验:在新分支尝试新想法,不影响稳定版本
- 并行开发:多人同时开发不同功能,互不干扰
- 版本管理:同时维护软件的多个版本(如v1.0、v2.0)
分支的工作流程
主分支:A — B — C — F — G
功能分支: D — E
解释:在C点创建功能分支,然后在功能分支上做了D和E两个提交,最后把功能分支合并到主分支,产生F和G。
🚀 手把手教学:分支的基本操作
步骤1:查看当前分支
进入你的知识星球项目目录
cd ~/Desktop/my-knowledge-garden
查看当前分支
git branch
你会看到:
- main
(或者可能是 "* master",取决于你初始化仓库时的默认分支名)
"*"表示你当前所在的分支。
步骤2:创建新分支
假设我们要为知识星球添加一个“暗黑模式”:
创建名为dark-mode的分支
git branch dark-mode
这相当于复制了当前的宇宙,创造了一个一模一样的平行宇宙。
步骤3:切换到新分支
切换到dark-mode分支
git checkout dark-mode
你会看到终端提示符可能变了,表示你已经进入了“暗黑模式宇宙”。
查看一下:
git branch
输出:
main
- dark-mode
现在你在 "dark-mode"分支上了。
步骤4:在新分支上工作
在暗黑模式分支上修改一些文件:
创建一个暗黑模式的CSS文件
echo "body { background: #333; color: #fff; }" > dark-style.css
修改index.html,引入暗黑样式
echo '' >> index.html
查看状态
git status
步骤5:在新分支上提交
三连招
git add . git commit -m "feat: 添加暗黑模式样式" git push -u origin dark-mode # 第一次推送需要设置上游分支
注意:我们是在 "dark-mode"分支上提交,所以不会影响 "main"分支。
步骤6:切换回主分支看看
切换回主分支
git checkout main
神奇的事情发生了: "dark-style.css"文件不见了! "index.html"也没有暗黑样式的链接!
别担心,文件并没有丢失。因为你在主分支,而暗黑模式的修改是在 "dark-mode"分支上。这就是“平行宇宙”的魔力。
🔀 分支的合并:把平行宇宙的故事合并到主宇宙
当你觉得暗黑模式已经完善,可以合并到主分支了:
方法1:合并(Merge)
确保你在主分支
git checkout main
合并dark-mode分支
git merge dark-mode
你会看到类似输出:
Updating 1a2b3c4..5d6e7f8 Fast-forward dark-style.css | 1 + index.html | 1 + 2 files changed, 2 insertions(+) create mode 100644 dark-style.css
快进合并(Fast-forward):如果主分支没有新的提交,Git会直接把主分支指针移到功能分支的最新提交。
方法2:拉取请求(Pull Request)
在团队协作中,更常用的方式是通过Pull Request(PR)来合并分支。
- 把你的分支推送到远程: git push origin dark-mode
- 在Gitee上:
- 进入你的仓库
- 你会看到“有新的分支dark-mode,点击创建Pull Request”
- 点击创建PR
- 填写PR描述,讨论修改
- 点击“合并”
小知识:在开源项目中,Pull Request不仅是合并工具,更是讨论、审查代码的地方。
🧪 应用到我们的“知识星球”项目
实际开发工作流示例
假设我们要为知识星球添加“标签分类”功能:
- 从主分支创建新分支 git checkout main git checkout -b feature/tags # 创建并切换到新分支
- 在新分支上开发
创建标签相关文件
echo "# 标签管理" > tags.md echo "// 标签功能" > tags.js
提交
git add . git commit -m "feat: 添加标签管理功能" git push -u origin feature/tags 3. 继续在主分支修复紧急bug git checkout main
修复bug
echo "修复了首页显示问题" > bugfix.txt
git add . git commit -m "fix: 修复首页显示问题" git push 4. 完成功能后,合并到主分支 git checkout main git merge feature/tags 5. 删除已合并的分支(可选)
删除本地分支
git branch -d feature/tags
删除远程分支
git push origin --delete feature/tags
分支命名规范
"main/master" - 主分支,稳定版本
"feature/xxx" - 功能分支,如 "feature/dark-mode"
"bugfix/xxx" - bug修复分支
"hotfix/xxx" - 紧急修复分支
"release/xxx" - 发布分支
🔧 高级分支技巧
快速创建并切换分支
一条命令替代两条
git checkout -b 新分支名
查看分支图
git log --oneline --graph --all
你会看到分支的树状图,非常直观。
解决合并冲突
当两个分支修改了同一文件的同一部分,合并时会产生冲突。
示例:
- 在主分支修改了 "index.html"的第10行
- 在功能分支也修改了 "index.html"的第10行
- 合并时Git不知道保留哪个,需要你手动解决
解决步骤:
合并时发生冲突
git merge feature-branch
查看冲突文件
git status
打开冲突文件,你会看到:
<<<<<<< HEAD
主分支的内容
=======
功能分支的内容
>>>>>>> feature-branch
手动修改,保留你想要的内容,删除标记
然后提交解决冲突
git add . git commit -m "解决合并冲突"
变基(Rebase)简介
变基是另一种整合分支的方法,让提交历史更线性。
git checkout feature-branch git rebase main
注意:变基会重写历史,不推荐新手在共享分支上使用。
❓ 常见问题与误区
Q1:应该创建多少分支?
看情况:
- 个人小项目:一个主分支+功能分支
- 团队项目:每人有各自的功能分支
- 复杂项目:主分支+开发分支+功能分支+发布分支
Q2:分支名可以改吗?
重命名当前分支
git branch -m 新分支名
重命名其他分支
git branch -m 旧分支名 新分支名
Q3:切换分支时,有未提交的修改怎么办?
Git不允许直接切换,你可以:
- 提交修改
- 使用 "git stash"暂存修改
- 放弃修改
Q4:如何比较两个分支的差异?
git diff 分支1..分支2 git diff main..feature-branch
常见误区:
- 误区:只在主分支上开发
- 问题:不稳定代码影响主分支,无法并行开发
- 正确:新功能都在独立分支开发
- 误区:分支越多越好
- 问题:分支太多难以管理
- 正确:按需创建,及时合并删除
- 误区:从不删除旧分支
- 问题:分支列表混乱
- 正确:合并后删除已合并的分支
📊 分支策略:Git Flow vs GitHub Flow
Git Flow(复杂但规范)
主分支(main) ────────┐ ↓ 开发分支(develop) ────┐ ↓ 功能分支(feature/) ─┐ ↓ 发布分支(release/)─┐ ↓ 热修复分支(hotfix/*)
适合:有固定发布周期、需要维护多个版本的大型项目。
GitHub Flow(简单直接)
主分支(main) ←─ 功能分支 ↑ | └─── Pull Request ──┘
适合:持续部署的Web应用、小型团队、个人项目。
你的知识星球用哪个?GitHub Flow就够了!
📝 今日收获总结
今天你掌握了Git的分支管理,拥有了“平行宇宙”操控能力:
✅ 理解了分支的概念——代码的平行宇宙
✅ 学会了创建/切换/合并分支——宇宙的基本操作
✅ 体验了分支的实际应用——在不影响主分支的情况下开发新功能
✅ 了解了分支策略——知道了Git Flow和GitHub Flow的区别
你的技能清单:
"git branch" - 查看分支
"git branch 分支名" - 创建分支
"git checkout 分支名" - 切换分支
"git checkout -b 分支名" - 创建并切换
"git merge 分支名" - 合并分支
"git branch -d 分支名" - 删除分支
🔮 下篇预告 & 思考题
下篇预告:《Issue:给代码"贴便利贴"》
分支让我们能并行开发,但如何管理这些开发任务呢?下一篇我们学习用Issue记录想法、bug、任务,让你的项目井井有条。 你将学到:
- 什么是Issue?为什么要有Issue?
- 如何创建、管理、关闭Issue?
- Issue和分支如何配合使用?
今日思考题:
- 如果你要同时开发“用户登录”和“文章评论”两个功能,应该创建一个分支还是两个分支?为什么?
- 合并分支时,什么情况下会发生冲突?如何避免?
动手小任务:
- 在你的知识星球项目中:
- 创建 "feature/about-page"分支
- 在分支上完善 "about.html",添加更多个人介绍
- 提交并推送到远程
- 在Gitee上创建Pull Request
- 合并到主分支
- 尝试解决一次合并冲突(可以故意制造冲突):
- 在主分支修改 "index.html"
- 在功能分支也修改同一行
- 尝试合并,解决冲突
📖 延伸资源
- Git分支官方文档:"git-scm.com/book/zh/v2/…" (git-scm.com/book/zh/v2/…
- Git Flow工作流:"nvie.com/posts/a-suc…" (nvie.com/posts/a-suc…)
- GitHub Flow工作流:"guides.github.com/introductio…" (guides.github.com/introductio…)
- 交互式分支学习:"learngitbranching.js.org/" (learngitbranching.js.org/)
平行宇宙不是科幻,是每个Git用户的日常。 大胆创建分支,大胆尝试新想法,Git会保护你的主宇宙永远稳定。 记住:分支是你的安全沙盒,在这里你可以:
- 尝试疯狂的想法
- 重构糟糕的代码
- 修复紧急的bug
- 而不用担心破坏已有的成果
下一站,用Issue管理你的开发任务! 📋