Skip to content

Git 分支管理

分支是 Git 最强大的功能之一,它允许你并行开发不同的功能,实验新想法,而不会影响主要代码。本章将详细介绍 Git 分支的创建、管理和使用。

分支基础概念

什么是分支?

分支本质上是指向某个提交的可移动指针。Git 的默认分支通常叫做 mainmaster

分支示意图:

A---B---C---D  (main 分支)
     \
      E---F     (feature 分支)

分支的优势

  • 🔄 并行开发:多个功能可以同时开发
  • 🧪 安全实验:在分支上尝试新想法,不影响主代码
  • 👥 团队协作:每个人可以在自己的分支上工作
  • 🚀 快速切换:分支创建和切换几乎是瞬时的

查看分支

基本查看命令

bash
# 查看本地分支
git branch

# 查看所有分支(包括远程分支)
git branch -a

# 查看远程分支
git branch -r

# 查看分支详细信息
git branch -v

# 查看分支的跟踪关系
git branch -vv

实际操作示例

bash
# 创建演示项目
mkdir git-branch-demo
cd git-branch-demo
git init

# 创建初始提交
echo "# 分支管理演示" > README.md
git add README.md
git commit -m "初始提交"

# 查看当前分支
git branch

输出:

* main

星号 * 表示当前所在的分支。

创建分支

创建分支的方法

bash
# 创建新分支(但不切换)
git branch feature-login

# 创建并切换到新分支
git checkout -b feature-register

# 使用新语法创建并切换(Git 2.23+)
git switch -c feature-profile

# 从特定提交创建分支
git branch hotfix-bug commit_hash

# 从远程分支创建本地分支
git checkout -b local-branch origin/remote-branch

分支命名规范

bash
# ✅ 好的分支命名
git branch feature/user-authentication
git branch bugfix/login-error
git branch hotfix/security-patch
git branch release/v1.2.0
git branch experiment/new-algorithm

# ❌ 避免的分支命名
git branch test
git branch temp
git branch branch1
git branch 修复bug  # 避免中文和特殊字符

创建分支示例

bash
# 创建功能分支
git branch feature/user-login
git branch feature/user-register
git branch feature/password-reset

# 查看所有分支
git branch

输出:

  feature/password-reset
  feature/user-login
  feature/user-register
* main

切换分支

切换分支的方法

bash
# 切换到已存在的分支
git checkout feature/user-login

# 使用新语法切换(Git 2.23+)
git switch feature/user-login

# 切换到上一个分支
git checkout -
git switch -

# 强制切换(丢弃工作区修改)⚠️ 危险操作
git checkout -f branch-name

切换分支的注意事项

bash
# 创建一些修改来演示
echo "新功能代码" > login.py
echo "配置文件" > config.json

# 查看状态
git status

# 尝试切换分支
git checkout feature/user-login

如果有未提交的修改,Git 会阻止切换:

error: Your local changes to the following files would be overwritten by checkout:
        login.py
Please commit your changes or stash them before you switch branches.

解决方法:

bash
# 方法1:提交修改
git add .
git commit -m "WIP: 正在开发登录功能"
git checkout feature/user-login

# 方法2:暂存修改
git stash
git checkout feature/user-login
# 稍后恢复
git stash pop

# 方法3:强制切换(会丢失修改)
git checkout -f feature/user-login

合并分支

快进合并 (Fast-forward)

当目标分支没有新的提交时,Git 会进行快进合并:

bash
# 切换到功能分支开发
git checkout feature/user-login
echo "登录功能实现" > login.py
git add login.py
git commit -m "实现用户登录功能"

# 切换回主分支
git checkout main

# 快进合并
git merge feature/user-login

合并后的历史:

A---B---C---D  (main, feature/user-login)

三方合并 (Three-way merge)

当两个分支都有新提交时,Git 会创建合并提交:

bash
# 在主分支上做一些修改
git checkout main
echo "主分支的修改" >> README.md
git add README.md
git commit -m "更新 README"

# 在功能分支上做修改
git checkout feature/user-register
echo "注册功能实现" > register.py
git add register.py
git commit -m "实现用户注册功能"

# 切换回主分支并合并
git checkout main
git merge feature/user-register

合并后的历史:

A---B---C---D---F  (main)
     \         /
      E-------/     (feature/user-register)

合并冲突处理

当两个分支修改了同一文件的同一部分时,会产生冲突:

bash
# 创建冲突场景
git checkout main
echo "主分支的配置" > config.txt
git add config.txt
git commit -m "添加主分支配置"

git checkout feature/user-login
echo "功能分支的配置" > config.txt
git add config.txt
git commit -m "添加功能分支配置"

# 尝试合并(会产生冲突)
git checkout main
git merge feature/user-login

冲突文件内容:

<<<<<<< HEAD
主分支的配置
=======
功能分支的配置
>>>>>>> feature/user-login

解决冲突:

bash
# 编辑文件解决冲突
echo "合并后的配置" > config.txt

# 标记冲突已解决
git add config.txt

# 完成合并
git commit -m "合并 feature/user-login 分支"

删除分支

删除本地分支

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

# 强制删除分支(即使未合并)
git branch -D feature/experimental

# 删除多个分支
git branch -d feature/login feature/register

删除远程分支

bash
# 删除远程分支
git push origin --delete feature/user-login

# 或使用简写
git push origin :feature/user-login

# 清理本地的远程分支引用
git remote prune origin

批量删除分支

bash
# 删除所有已合并的分支
git branch --merged | grep -v "\*\|main\|master" | xargs -n 1 git branch -d

# 删除包含特定模式的分支
git branch | grep "feature/" | xargs git branch -d

分支重命名

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

# 重命名其他分支
git branch -m old-name new-name

# 重命名远程分支(删除旧的,推送新的)
git push origin :old-name new-name
git push origin -u new-name

高级分支操作

分支比较

bash
# 比较两个分支
git diff main..feature/user-login

# 查看分支间的提交差异
git log main..feature/user-login

# 查看分支的独有提交
git log --oneline --graph main feature/user-login

# 查看文件在不同分支的差异
git diff main:file.txt feature:file.txt

分支追踪

bash
# 设置本地分支追踪远程分支
git branch --set-upstream-to=origin/main main

# 推送并设置追踪
git push -u origin feature/new-feature

# 查看追踪关系
git branch -vv

孤立分支

bash
# 创建没有历史的孤立分支
git checkout --orphan gh-pages

# 清空工作区
git rm -rf .

# 创建新内容
echo "<h1>GitHub Pages</h1>" > index.html
git add index.html
git commit -m "初始化 GitHub Pages"

分支工作流模式

Git Flow 模式

bash
# 主要分支
main/master     # 生产分支
develop         # 开发分支

# 辅助分支
feature/*       # 功能分支
release/*       # 发布分支
hotfix/*        # 热修复分支

实际操作:

bash
# 创建开发分支
git checkout -b develop main

# 创建功能分支
git checkout -b feature/user-auth develop

# 开发完成后合并回 develop
git checkout develop
git merge --no-ff feature/user-auth
git branch -d feature/user-auth

# 准备发布
git checkout -b release/1.0.0 develop

# 发布完成后合并到 main 和 develop
git checkout main
git merge --no-ff release/1.0.0
git tag v1.0.0

git checkout develop
git merge --no-ff release/1.0.0
git branch -d release/1.0.0

GitHub Flow 模式

bash
# 简化的工作流
# 1. 从 main 创建功能分支
git checkout -b feature/new-feature main

# 2. 开发并提交
git add .
git commit -m "实现新功能"

# 3. 推送分支
git push origin feature/new-feature

# 4. 创建 Pull Request
# 5. 代码审查和合并
# 6. 删除功能分支

分支管理最佳实践

1. 分支命名规范

bash
# 使用有意义的前缀
feature/user-authentication
bugfix/login-validation
hotfix/security-vulnerability
release/v2.1.0
experiment/performance-optimization

# 使用短横线分隔单词
feature/user-profile-page  # ✅
feature/user_profile_page  # ❌
feature/userprofilepage    # ❌

2. 保持分支简洁

bash
# ✅ 好的做法:一个分支一个功能
git checkout -b feature/add-login-button
# 只实现登录按钮相关的代码

# ❌ 避免:一个分支多个不相关功能
git checkout -b feature/login-and-register-and-profile

3. 及时清理分支

bash
# 定期清理已合并的分支
git branch --merged | grep -v "main" | xargs git branch -d

# 清理远程分支引用
git remote prune origin

# 查看陈旧的分支
git for-each-ref --format='%(refname:short) %(committerdate)' refs/heads | sort -k2

4. 使用合适的合并策略

bash
# 功能分支合并:保留分支历史
git merge --no-ff feature/user-login

# 小修改:快进合并
git merge feature/typo-fix

# 保持线性历史:变基合并
git rebase main
git checkout main
git merge feature/clean-feature

分支故障排除

问题1:分支切换失败

bash
# 问题:有未提交的修改
# 解决方案1:暂存修改
git stash
git checkout target-branch
git stash pop

# 解决方案2:提交修改
git add .
git commit -m "临时提交"
git checkout target-branch

问题2:误删分支

bash
# 查找被删除分支的最后提交
git reflog

# 恢复分支
git checkout -b recovered-branch commit_hash

问题3:合并冲突

bash
# 查看冲突文件
git status

# 使用合并工具
git mergetool

# 手动解决后标记为已解决
git add conflicted_file.txt
git commit

# 取消合并
git merge --abort

问题4:分支历史混乱

bash
# 使用 rebase 整理历史
git rebase -i HEAD~3

# 查看分支图
git log --graph --oneline --all

# 重置分支到特定提交
git reset --hard commit_hash

实用工具和技巧

分支别名

bash
# 设置有用的别名
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.sw switch
git config --global alias.mg merge

# 复杂别名
git config --global alias.lg "log --graph --oneline --all"
git config --global alias.cleanup "!git branch --merged | grep -v '\\*\\|main\\|master' | xargs -n 1 git branch -d"

分支脚本

bash
#!/bin/bash
# 创建功能分支的脚本
create_feature_branch() {
    if [ -z "$1" ]; then
        echo "用法: create_feature_branch <feature-name>"
        return 1
    fi
    
    git checkout main
    git pull origin main
    git checkout -b "feature/$1"
    echo "创建功能分支: feature/$1"
}

# 使用方法
create_feature_branch user-authentication

总结

Git 分支管理的核心要点:

基本操作

bash
git branch              # 查看分支
git checkout -b name    # 创建并切换分支
git merge branch        # 合并分支
git branch -d name      # 删除分支

最佳实践

  • ✅ 使用有意义的分支名称
  • ✅ 保持分支功能单一
  • ✅ 及时合并和清理分支
  • ✅ 选择合适的合并策略
  • ✅ 处理好合并冲突

工作流选择

  • 简单项目:GitHub Flow
  • 复杂项目:Git Flow
  • 持续集成:Feature Branch Workflow

掌握分支管理后,你就能够:

  • 🔄 并行开发多个功能
  • 🧪 安全地进行实验
  • 👥 与团队高效协作
  • 🚀 管理复杂的项目历史

在下一章中,我们将学习如何查看和理解 Git 历史。

本站内容仅供学习和研究使用。