Skip to content

分支基础

分支是 Git 最强大的特性之一。Git 的分支极其轻量,创建和切换几乎是瞬时完成的,鼓励开发者频繁使用分支进行实验和功能开发。

什么是分支

分支本质上是指向某个 Commit 的可移动指针

C1 ← C2 ← C3  ← main(指针,指向 C3)
               ← feature(另一个指针,也指向 C3)

当在某分支上创建新提交时,该分支指针自动移动到最新提交:

C1 ← C2 ← C3 ← C4  ← feature(移动到 C4)

              main(仍指向 C3)

分支的本质.git/refs/heads/<branch-name> 文件,内容是一个 SHA-1 哈希值。创建分支仅需写入一个 41 字节的文件,这就是 Git 分支如此轻量的原因。

git branch 查看分支

bash
# 查看本地分支
git branch
# * main         ← * 表示当前所在分支
#   develop
#   feature/login

# 查看远程分支
git branch -r
# origin/main
# origin/develop

# 查看所有分支(本地 + 远程)
git branch -a

查看分支详情

bash
# 显示最新提交信息
git branch -v
# * main    a1b2c3d feat: 最新功能
#   develop e4f5g6h fix: 修复样式

# 显示追踪关系(本地分支对应哪个远程分支)
git branch -vv
# * main    a1b2c3d [origin/main] feat: 最新功能
#   develop e4f5g6h [origin/develop: ahead 2] fix: 修复样式

# 查看哪些分支已合并到当前分支
git branch --merged

# 查看哪些分支尚未合并到当前分支
git branch --no-merged

git branch 创建分支

bash
# 在当前提交位置创建新分支
git branch feature/login

# 在指定提交/分支处创建分支
git branch hotfix v1.0.0       # 从 v1.0.0 标签处创建
git branch backup feature/old  # 从另一分支创建
git branch debug HEAD~3        # 从 3 个提交前创建

注意git branch <name> 只创建分支,不切换到该分支。

切换分支

git switch(推荐,Git 2.23+)

git switch 是专门用于切换分支的新命令,语义更清晰:

bash
# 切换到已有分支
git switch main
git switch develop

# 创建并切换(等价于 git checkout -b)
git switch -c feature/new-feature
git switch --create feature/new-feature

# 切换到上一个分支(类似 cd -)
git switch -

git checkout(传统语法)

git checkout 功能更多,但语义不够清晰(切换分支和还原文件都是它):

bash
# 切换分支
git checkout main
git checkout develop

# 创建并切换
git checkout -b feature/new-feature

# 从指定起点创建并切换
git checkout -b hotfix/bug-123 main

创建并切换分支

bash
# 新语法(推荐)
git switch -c feature/user-profile

# 旧语法
git checkout -b feature/user-profile

# 从远程分支创建本地分支
git switch -c feature/login origin/feature/login
git checkout -b feature/login origin/feature/login

删除分支

bash
# 删除已合并的分支(安全删除)
git branch -d feature/login

# 强制删除(无论是否合并)
git branch -D feature/experiment

# 删除远程分支
git push origin --delete feature/login
git push origin :feature/login     # 旧语法

# 批量删除已合并的分支
git branch --merged main | grep -v "main\|develop\|\*" | xargs git branch -d

重命名分支

bash
# 重命名当前分支
git branch -m new-name

# 重命名指定分支
git branch -m old-name new-name

# 重命名后同步到远程
git push origin --delete old-name
git push origin -u new-name

分支工作流示例

bash
# 1. 从 main 创建功能分支
git switch main
git pull                           # 确保 main 是最新的
git switch -c feature/user-auth

# 2. 在功能分支上开发
git add .
git commit -m "feat: 实现用户认证"

# 3. 推送功能分支到远程
git push -u origin feature/user-auth

# 4. 开发完成后,合并到 main
git switch main
git merge feature/user-auth

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

分支命名规范

良好的分支命名让团队更容易理解每个分支的用途:

功能分支:  feature/<描述>     feature/user-login
修复分支:  fix/<描述>         fix/login-crash
热修复:    hotfix/<版本>-<描述>  hotfix/1.2.1-null-pointer
发布分支:  release/<版本>     release/1.3.0
文档分支:  docs/<描述>        docs/update-api-guide
测试分支:  test/<描述>        test/performance-tuning
重构分支:  refactor/<描述>    refactor/auth-module

分离 HEAD 状态

当 HEAD 不指向分支,而是直接指向某个 Commit 时,处于**分离 HEAD(Detached HEAD)**状态:

bash
# 切换到某个提交(进入分离 HEAD 状态)
git checkout abc123
git switch --detach abc123

# 此时的提示:
# HEAD is now at abc123 feat: ...
# Note: switching to 'abc123'.
# You are in 'detached HEAD' state...

在分离 HEAD 状态下的新提交不会属于任何分支,切换分支后这些提交可能"丢失"。

解决方案: 及时创建分支保存这些提交:

bash
# 从当前位置创建分支(在分离 HEAD 时)
git switch -c new-branch
git checkout -b new-branch

总结

操作命令(推荐)命令(传统)
查看分支git branch
创建分支git branch <name>
切换分支git switch <name>git checkout <name>
创建并切换git switch -c <name>git checkout -b <name>
删除分支git branch -d <name>
强制删除git branch -D <name>
重命名分支git branch -m <new>

Git 分支的轻量特性鼓励你频繁创建分支,为每个功能、bug 修复、实验都创建独立分支,这是现代 Git 工作流的核心实践。