理解
branch(分支)是从“会用 Git”到“精通 Git”的决定性一步,也是团队协作的基石。
简单来说:
意思 (Meaning):
branch 就是一个独立的开发“平行时空”。它允许你在不影响主线代码(通常是
main 或
master 分支)的情况下,去开发新功能、修复 Bug 或进行各种实验。意义 (Significance):
branch 的最大意义在于隔离风险、保障稳定、支持并行开发,让团队协作变得既安全又有序。
想象一下,你们团队正在合作写一本书,这本书的主线版本存放在一个共享的云文档里,这个文档就是你们的
main 分支。
main 分支: 这是书的正式、可随时出版的版本。它的内容必须是完整的、经过校对的、没有明显错误的。任何人都不能直接在上面随意修改,否则可能导致整本书乱套。
现在,你有两个任务:
你(张三):需要为书添加一个全新的章节——“第五章:未来展望”。你的伙伴(李四):发现第二章有个严重的拼写错误需要紧急修复。如果没有分支,会发生什么?
你们俩都直接在
main 分支(那个共享云文档)上修改。你正在写第五章,写了一半,内容还不完整。这时李四为了改拼写错误,不小心把你写了一半的句子删掉了。你们互相干扰,最后
main 分支变得一团糟,既有没写完的新章节,又有改到一半的旧章节,完全无法发布。这就是混乱!
有了分支,一切都变得井然有序:
创建分支 (Branching):
你(张三):想写新章节,于是你从
main 分支拉出了一个属于你自己的分支,命名为
feature/add-chapter-5。这相当于你把书的正式版本复制了一份到自己的笔记本上,你可以在这个笔记本上自由发挥,完全不会影响到云端的正式版。你的伙伴(李四):要改 Bug,他也从
main 分支拉出一个分支,命名为
fix/typo-in-chapter-2。他也相当于复制了一份到他自己的笔记本上。
并行开发 (Parallel Development):
现在,你在你的
feature/add-chapter-5 分支上专心写你的第五章。李四在他的
fix/typo-in-chapter-2 分支上快速修复那个拼写错误。你们俩的工作互不干扰,因为你们是在各自的“平行时空”(笔记本)里工作。
main 分支在这期间保持着绝对的稳定和干净。
合并 (Merging):
李四先完成了: 他修复了拼写错误,并在自己的分支上确认无误。然后,他向
main 分支发起一个“合并请求”(Pull Request)。团队的其他成员(或你自己)检查了他的修改,确认没问题后,点击“合并”。于是,李四的修复就安全地应用到了
main 分支(正式版)上。你随后也完成了: 你写完了整个第五章,内容完整且通过了检查。你也向
main 分支发起“合并请求”。大家审核通过后,你的新章节也被合并进了
main 分支。
结果:
main 分支始终保持稳定。它先是吸收了一个 Bug 修复,然后又吸收了一个完整的新章节。整个过程清晰、安全,每个人都可以专注于自己的任务,而不用担心影响他人。
main/
master 分支永远是“可发布”的稳定版本,不会被开发中的、不成熟的代码污染。隔离开发任务 (Isolation): 每个新功能、每个 Bug 修复都在自己的分支上进行,像一个个独立的沙盒,避免了交叉影响。支持并行工作 (Parallelism): 团队成员可以同时在各自的分支上开发不同的功能,极大地提高了开发效率。方便代码审查 (Code Review): 当一个分支开发完成后,通过“合并请求”(Pull Request)的方式请求并入主线,为团队成员提供了一个审查代码、讨论方案的绝佳机会,从而保证了代码质量。清晰的开发历史 (Clear History): 通过查看分支的创建和合并记录,可以非常清晰地追溯每一个功能或修复的来源和演变过程。
main 或
master 分支上写代码,而是为你的每一个任务都创建一个新的分支,这是 Git 协作的黄金法则。
main (我们假设这是你的主分支)你的角色 (张三): 开发一个新功能,比如“登录页面”。伙伴的角色 (李四): 修复一个紧急的 Bug,比如“首页样式错乱”。
main 分支是最新在开始任何新工作前,先确保你本地的主分支和远程仓库是同步的。
# 切换回主分支
git switch main
# 从远程仓库拉取最新的更新
git pull origin main
你将要开发“登录页面”,所以创建一个名为
feature/login-page 的分支。
# 从当前的 main 分支创建并立即切换到新分支
# 'git switch -c' 是 'create' 的缩写,是推荐的新命令
git switch -c feature/login-page
# (旧的命令是 'git checkout -b feature/login-page',效果一样)
执行后: 你的工作目录没有变化,但你已经进入了
feature/login-page 这个“平行时空”。你现在可以安全地进行开发了。
现在你开始写登录页面的代码 (
login.js,
login.css …)。完成一部分后,就进行一次提交。
# 1. 添加你修改过的所有文件到暂存区
git add .
# 2. 提交你的修改,并写清楚注释
git commit -m "feat: 完成登录页面UI布局"
# ...继续开发,比如写登录逻辑...
# 3. 再次添加和提交
git add .
git commit -m "feat: 实现登录API调用逻辑"
意义: 这些
commit 都只存在于你的
feature/login-page 分支上,
main 分支对此一无所知。
为了让你的伙伴能看到你的进度,或者为了备份,你需要把你的本地分支推送到远程 GitHub。
# 首次推送一个新分支时,使用 -u 参数来建立跟踪关系
git push -u origin feature/login-page
执行后: GitHub 上也会出现一个
feature/login-page 分支,和你本地的完全一样。
在同一时间,李四发现了一个 Bug。
他需要从最新的
main 分支(因为 Bug 是在稳定版上发现的)创建一个修复分支。
# (李四也先执行了 git pull origin main 来确保同步)
# 从 main 分支创建并切换到 bug 修复分支
git switch -c fix/homepage-style-bug
李四修改了相关的 CSS 文件来修复样式问题。
# 1. 添加他修改的文件
git add styles/homepage.css
# 2. 提交修复
git commit -m "fix: 修复首页顶部导航栏错位问题"
git push -u origin fix/homepage-style-bug
因为 Bug 修复更紧急,所以先合并李四的分支。在实际团队协作中,这通常通过在 GitHub 上创建 Pull Request (PR) 来完成。
李四在 GitHub 上:从
fix/homepage-style-bug 分支向
main 分支发起一个 Pull Request。你或其他团队成员:在 GitHub 页面上审查代码,确认无误后,点击
Merge pull request 按钮。合并完成:现在,远程的
main 分支已经包含了李四的修复。
更新你的分支: 在你准备合并之前,一个好习惯是先将
main 分支上最新的改动(比如李四的修复)同步到你自己的功能分支,以确保没有冲突。
# 1. 切换回你的功能分支
git switch feature/login-page
# 2. 将远程 main 分支的最新代码合并到你当前的分支
git pull origin main
(如果出现冲突 (conflict),你需要先手动解决冲突再提交)
发起 Pull Request: 你也在 GitHub 上从
feature/login-page 向
main 分支发起一个 Pull Request。
审查与合并: 团队审查通过后,点击合并按钮。
最终,
main 分支既包含了李四的 Bug 修复,也包含了你的新登录功能,而整个过程互相独立,安全可控。
| 功能 | 命令 |
|---|---|
| 查看所有本地分支 |
git branch |
| 查看所有远程分支 |
git branch -r |
| 查看所有本地和远程分支 |
git branch -a |
| 创建新分支 |
git branch <branch-name> |
| 切换到已存在的分支 |
git switch <branch-name> (新) 或
git checkout <branch-name> (旧) |
| 创建并切换到新分支 |
git switch -c <branch-name> (新) 或
git checkout -b <branch-name> (旧) |
| 合并指定分支到当前分支 |
git merge <branch-name> |
| 删除本地分支 |
git branch -d <branch-name> |
| 删除远程分支 |
git push origin --delete <branch-name> |
main 分支创建新的功能分支永远不要、永远不要、永远不要直接在
main 分支上写代码!
在你开始写任何新代码之前,首先要确保你的本地
main 分支是最新,然后为你的新任务创建一个独立的分支。
# 1. 切换回主分支
git switch main
# 2. 从远程仓库拉取最新的更新,确保你的 main 是最新的
git pull origin main
# 3. 为你的新功能创建一个新的、有意义命名的分支,并切换过去
# 格式推荐:feature/功能名, fix/bug名, chore/杂项任务名
git switch -c feature/user-profile
git switch -c: 创建 (create) 并切换。
feature/user-profile: 一个清晰的分支名,让人一看就知道这个分支是干嘛的。此刻: 你进入了一个为“用户个人中心”准备的、全新的“平行时空”。你在这里的任何操作都不会影响到
main 分支。
现在,你可以在
feature/user-profile 分支上自由地编写代码、修改文件、进行测试。
你可以(也应该)进行多次提交,每次提交都代表一个小的、完整的功能点。
# ...疯狂编写代码...
# 完成了“显示用户头像和昵称”的功能
git add .
git commit -m "feat: display user avatar and nickname"
# ...继续疯狂编写代码...
# 完成了“编辑个人资料”的按钮和表单
git add .
git commit -m "feat: add form for editing user profile"
频繁提交的好处: 你的工作被分成了很多小步骤,如果发现某个地方改错了,可以很容易地回退到上一个正确的状态。
为了备份你的代码,也为了让你的伙伴能看到你的进度,你需要把你的新分支推送到 GitHub。
# 首次推送新分支时,使用 -u 参数建立跟踪关系
git push -u origin feature/JY-profile
执行后: GitHub 上也会出现一个
feature/user-profile 分支。
当你觉得这个功能已经完全开发完毕、测试通过,准备好并入主线时,就到了最关键的团队协作环节:创建 Pull Request (合并请求)。
在 GitHub 上操作:
打开你的 GitHub 仓库页面,你会看到一个黄色的提示条,告诉你
feature/user-profile 分支有新的提交,旁边有一个绿色的
Compare & pull request 按钮。点击这个按钮。
创建 Pull Request:
确认方向: 确保是
base: main ←
compare: feature/user-profile。写好标题和描述: 清晰地说明你在这个分支里完成了什么功能,解决了什么问题。这非常重要,是写给你的同事看的。点击
Create pull request。
代码审查 (Code Review):
你的伙伴(或者你自己)会收到通知,来审查你提交的代码。他们可以在 PR 页面逐行评论你的代码,提出修改建议。这是保证代码质量、互相学习的最佳时机。如果你需要根据建议做出修改,只需在本地的
feature/user-profile 分支上继续修改、提交,然后
git push 即可。PR 会自动更新。
合并 (Merge):
当所有人都同意你的代码没有问题后,点击绿色的
Merge pull request 按钮,然后
Confirm merge。
至此,你的新功能就安全、可靠地并入了
main 分支。
合并成功后,
feature/user-profile 分支已经完成了它的历史使命。为了保持仓库的整洁,应该将其删除。
在 GitHub 上: PR 合并后,页面上通常会直接出现一个
Delete branch 按钮,点击即可。
在本地电脑上 (可选):
# 切换回 main 分支
git switch main
# 删除本地的旧分支
git branch -d feature/JY-profile
对于任何一个新任务(无论是新功能还是修 Bug),都请重复以上 1-6 步的完整循环。
拉取最新
main→ 创建新分支 → 开发与提交 → 推送分支 → 创建 PR → 审查与合并 → 删除旧分支