跳到主要内容

Git 分支管理:团队协作的基石

分支就像平行宇宙——你可以在不影响主宇宙的情况下,创建一个新的宇宙去搞实验。

为什么需要分支?

想象你在写一篇论文。写到一半,突然有个新想法,但又不想把当前的内容搞乱。怎么办?

复制一份,随便改。这就是分支。

在 Git 里,分支让你可以:

  • 安全地尝试新功能:搞砸了?删掉分支就行,主代码纹丝不动
  • 多人同时开发:你做登录,我做首页,互不干扰
  • 保持主分支稳定:main 分支永远是可以运行的版本

用火车轨道理解分支

把 Git 仓库想象成一条铁路系统:

main: ════════════●═══════════●═══════════●
\ /
feature-login: ●═════●
/
feature-home: ══════●═══════════●
  • main 是主干线——乘客(用户)坐的正式列车
  • feature-login 是支线——工程队在上面修新站,修好了并入主干线
  • feature-home 是另一条支线——另一个工程队同时在修

支线上的工作不影响主干线的正常运营。修好了,接上去就行。

分支类型速览

分支名作用举例
main生产代码,随时可部署发布版本
develop开发主线,集成功能日常开发
feature/*新功能开发feature/login
bugfix/*修 bugbugfix/header-crash
hotfix/*紧急修复生产问题hotfix/payment-error

基本分支操作

创建分支

# 查看当前分支
git branch

# 创建新分支
git branch feature/login

# 切换到新分支
git checkout feature/login

# 创建并切换(常用快捷方式)
git checkout -b feature/login

# Git 2.23+ 的新写法(推荐)
git switch -c feature/login

查看所有分支

# 本地分支
git branch

# 包含远程分支
git branch -a

# 查看分支最后提交
git branch -v

删除分支

# 删除已合并的分支
git branch -d feature/login

# 强制删除(未合并也删)
git branch -D feature/login

合并分支

merge——最常见的合并方式

# 切回 main
git switch main

# 把 feature/login 合并进来
git merge feature/login

merge 有两种模式:

快进合并(Fast-Forward)——main 没有新提交,直接"快进":

合并前:
main: A → B
\
feature: C → D

合并后(快进):
main: A → B → C → D

三方合并——main 和分支都有新提交:

合并前:
main: A → B → E
\
feature: C → D

合并后:
main: A → B → E → F (merge commit)
\ /
feature: C → D

rebase——让历史更干净

# 在 feature 分支上
git rebase main

rebase 会把你的提交"搬到"main 的最新位置后面,让历史变成一条直线:

rebase 前:
main: A → B → E
\
feature: C → D

rebase 后:
main: A → B → E → C' → D'

merge vs rebase 的选择

  • merge 保留真实历史,适合公共分支
  • rebase 历史更干净,适合个人分支
  • 黄金法则:不要 rebase 已经推送到远程的公共分支

Pull Request(PR)基础

Pull Request 是代码审查的核心流程。你写完功能,请求团队把你的代码"拉"进主分支。

在 GitHub 上创建 PR

# 1. 把你的分支推送到远程
git push origin feature/login

# 2. 去 GitHub 仓库页面,会看到黄色提示条
# 点击 "Compare & pull request"

# 3. 填写 PR 描述
# - 做了什么
# - 为什么这么做
# - 怎么测试

# 4. 等待 review,通过后 merge

PR 描述模板

## 做了什么
添加用户登录功能,支持邮箱/密码登录

## 为什么
用户需要账户系统来保存数据

## 怎么测试
1. 访问 /login
2. 输入邮箱和密码
3. 点击登录,应该跳转到首页

## 截图
(附上截图)

处理合并冲突

冲突是 Git 无法自动合并时发生的——两个人改了同一行代码。

冲突长什么样

<<<<<<< HEAD
const title = "欢迎回来";
=======
const title = "你好,欢迎";
>>>>>>> feature/login
  • <<<<<<< HEAD=======:你当前分支的内容
  • =======>>>>>>> feature/xxx:被合并分支的内容

解决步骤

# 1. 执行合并,遇到冲突
git merge feature/login
# CONFLICT (content): Merge conflict in src/app/page.tsx

# 2. 查看哪些文件有冲突
git status
# both modified: src/app/page.tsx

# 3. 打开文件,手动选择要保留的内容
# 删掉 <<<<<<< ======= >>>>>>> 标记,保留正确的代码

# 4. 标记为已解决
git add src/app/page.tsx

# 5. 完成合并
git commit -m "merge: 合并 feature/login,解决冲突"

用 VS Code 解决冲突

VS Code 会高亮显示冲突,并提供按钮:

  • Accept Current Change——保留当前分支
  • Accept Incoming Change——保留被合并的分支
  • Accept Both Changes——两边都保留
  • Compare Changes——对比差异

分支命名规范

好的分支名一看就知道在干什么:

# ✅ 好的命名
feature/user-login
feature/payment-stripe
bugfix/header-not-showing
hotfix/fix-payment-crash
chore/update-dependencies

# ❌ 坏的命名
my-branch
test
fix
new-feature
temp

命名格式:类型/简短描述

类型用途例子
feature/新功能feature/user-profile
bugfix/修 bugbugfix/login-error
hotfix/紧急修复hotfix/payment-crash
chore/杂务chore/cleanup-deps
docs/文档docs/api-guide
refactor/重构refactor/auth-module

GitHub Flow vs Git Flow

Git Flow——传统大项目

main ─────────────────────────────
│ ↑
│ ┌─ release/1.0 ────────┘
│ │
└── develop ──────────────────
│ │
│ └─ feature/B
└─ feature/A

适合:大团队、有固定发布周期的项目

GitHub Flow——简单实用(推荐新手)

main ────────────────────────
│ ↑ ↑
├─ feat/A ┘ │
│ │
└─ feat/B ──────────┘

规则很简单:

  1. main 分支永远可部署
  2. 新功能从 main 创建分支
  3. 开发完提交 PR
  4. Code review 通过后合并到 main
  5. 合并后立即部署

新手直接用 GitHub Flow,简单够用。

实战:用分支开发登录功能

来走一遍完整的流程:

# 1. 确保在 main 分支,代码最新
git switch main
git pull

# 2. 创建功能分支
git switch -c feature/user-login

# 3. 开始写代码
# 创建登录页面
# src/app/login/page.tsx
// src/app/login/page.tsx
export default function LoginPage() {
return (
<div className="flex min-h-screen items-center justify-center">
<form className="w-96 space-y-4 rounded-lg border p-8">
<h1 className="text-2xl font-bold">登录</h1>
<input
type="email"
placeholder="邮箱"
className="w-full rounded border p-2"
/>
<input
type="password"
placeholder="密码"
className="w-full rounded border p-2"
/>
<button className="w-full rounded bg-blue-500 p-2 text-white">
登录
</button>
</form>
</div>
);
}
# 4. 提交代码
git add .
git commit -m "feat: 添加登录页面 UI"

# 5. 继续开发,添加登录逻辑
# ... 写代码 ...

git add .
git commit -m "feat: 实现邮箱密码登录功能"

# 6. 推送到远程
git push -u origin feature/user-login

# 7. 在 GitHub 上创建 PR
# 填写描述,等待 review

# 8. Review 通过后,合并
# 在 GitHub 页面点击 "Merge pull request"

# 9. 本地同步
git switch main
git pull

# 10. 删除功能分支
git branch -d feature/user-login
git push origin --delete feature/user-login

常用命令速查

# 分支操作
git branch # 查看本地分支
git branch -a # 查看所有分支
git switch -c feature/xxx # 创建并切换分支
git switch main # 切换分支
git branch -d feature/xxx # 删除分支

# 合并操作
git merge feature/xxx # 合并分支
git rebase main # 变基到 main

# 同步操作
git push -u origin feature/xxx # 推送新分支
git pull # 拉取最新代码

# 冲突处理
git status # 查看冲突文件
# 手动解决冲突后
git add . # 标记为已解决
git commit # 完成合并

小结

  • 分支是安全的实验场——搞砸了删掉就行
  • 新手用 GitHub Flow——简单够用
  • 分支名要有意义——feature/xxxbugfix/xxx
  • 冲突不可怕——手动选一下就行
  • PR 是团队协作的核心——写好描述,耐心等 review

分支管理不是什么高深的技术,就是一个好习惯。用得多了,自然就熟了。