Git 分支合并与切换

Git 分支合并与切换

掌握Git分支创建、切换和合并的完整操作指南,包括各种合并策略和最佳实践

开始学习

分支操作

分支是Git最强大的功能之一,允许你在独立的开发线上工作。

分支可视化

main
feature/login
feature/payment
hotfix/urgent

查看分支

查看本地和远程分支:

# 查看本地分支
git branch

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

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

# 查看已合并的分支
git branch --merged

创建分支

创建新分支的不同方法:

# 基于当前分支创建新分支
git branch new-feature

# 基于特定分支创建新分支
git branch new-feature main

# 基于特定提交创建分支
git branch new-feature a1b2c3d

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

删除分支

安全删除分支的方法:

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

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

# 删除远程分支
git push origin --delete feature-branch

# 清理已删除的远程分支跟踪
git fetch -p

分支命名规范

推荐的分支命名约定:

  • feature/ - 新功能开发 (feature/user-auth)
  • bugfix/ - 错误修复 (bugfix/login-error)
  • hotfix/ - 紧急修复 (hotfix/security-patch)
  • release/ - 版本发布 (release/v1.2.0)
  • chore/ - 维护任务 (chore/update-deps)

使用一致的命名规范有助于团队协作和分支管理。

切换分支

基本切换命令

# 切换到现有分支
git checkout branch-name

# 创建并切换到新分支
git checkout -b new-branch

# 切换到上一个分支(快速切换)
git checkout -

# 切换到远程分支(创建本地跟踪分支)
git checkout -b local-name origin/remote-branch

新命令: Git 2.23+ 引入了 git switchgit restore 命令,专门用于分支切换和文件恢复,使命令语义更清晰。

使用 git switch 命令

# 切换到现有分支
git switch branch-name

# 创建并切换到新分支
git switch -c new-branch

# 基于特定分支创建新分支
git switch -c new-branch existing-branch

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

切换前的准备工作

在切换分支前,确保工作区是干净的:

# 检查当前状态
git status

# 如果有未提交的更改,可以:
# 1. 提交更改
git add .
git commit -m "保存工作"

# 2. 储藏更改
git stash

# 3. 丢弃更改(谨慎使用)
git reset --hard

注意: 如果工作区有未提交的更改,Git可能不允许切换分支,特别是当这些更改与目标分支的文件冲突时。使用 git stash 可以临时保存你的工作。

合并分支

基本合并操作

# 将 feature-branch 合并到当前分支
git merge feature-branch

# 合并时创建合并提交(即使可以快进)
git merge --no-ff feature-branch

# 合并但不自动提交
git merge --no-commit feature-branch

# 中止合并操作
git merge --abort

合并工作流程

1. 更新主分支

确保主分支是最新的

2. 切换到主分支

切换到要合并到的目标分支

3. 执行合并

将功能分支合并到主分支

4. 推送更改

将合并结果推送到远程仓库

合并类型

快进合并 (Fast-forward)

当目标分支是当前分支的直接上游时,Git只需将指针向前移动。

main
feature

合并后,main分支直接指向feature分支的最新提交。

三方合并 (Three-way Merge)

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

main
feature

合并后,创建一个新的合并提交(橙色),连接两个分支的历史。

合并策略与最佳实践

合并 vs 变基

方面 合并 (Merge) 变基 (Rebase)
历史记录 保留完整分支结构 线性、整洁的历史
适用场景 公共分支、团队协作 个人分支、功能分支
复杂性 相对简单 可能更复杂
风险 安全,不改变历史 重写历史,风险较高

合并最佳实践

  • 保持主分支稳定 - 只将经过测试的代码合并到主分支
  • 使用Pull Request - 通过代码审查确保代码质量
  • 频繁合并 - 避免长时间偏离主分支
  • 解决冲突及时 - 在功能分支上解决冲突,而不是主分支
  • 测试后再合并 - 确保代码通过所有测试
  • 使用描述性提交信息 - 清晰说明合并的内容和原因

黄金法则: 永远不要对已经推送到公共仓库的分支使用变基。变基会重写提交历史,给其他协作者带来问题。

合并选项

Git提供多种合并选项来处理特定情况:

# 优先使用当前分支的更改
git merge -X ours feature-branch

# 优先使用要合并分支的更改
git merge -X theirs feature-branch

# 禁止快进合并,总是创建合并提交
git merge --no-ff feature-branch

# 压缩合并(将多个提交合并为一个)
git merge --squash feature-branch
git commit -m "合并feature-branch的功能"

处理合并冲突

当合并产生冲突时的处理流程:

# 1. 查看冲突文件
git status

# 2. 手动解决冲突
# 编辑文件,删除冲突标记,保留需要的更改

# 3. 标记冲突已解决
git add resolved-file.txt

# 4. 完成合并
git commit

注意: 如果合并冲突太复杂或需要重新考虑,可以使用 git merge --abort 取消合并操作,回到合并前的状态。

实战示例

功能开发完整流程

1. 创建功能分支
# 从主分支创建功能分支
git checkout main
git pull origin main
git checkout -b feature/user-authentication
2. 在功能分支上开发
# 进行开发并提交更改
git add .
git commit -m "实现用户登录功能"

# 推送功能分支到远程
git push -u origin feature/user-authentication
3. 合并到主分支
# 切换回主分支并获取最新更改
git checkout main
git pull origin main

# 合并功能分支
git merge feature/user-authentication

# 推送更改到远程
git push origin main
4. 清理分支
# 删除本地功能分支
git branch -d feature/user-authentication

# 删除远程功能分支
git push origin --delete feature/user-authentication

高级场景示例

处理合并冲突
# 尝试合并时出现冲突
git merge feature-branch
# 输出: Auto-merging file.txt
# 输出: CONFLICT (content): Merge conflict in file.txt

# 查看冲突状态
git status

# 解决冲突后标记文件
git add file.txt

# 完成合并
git commit -m "合并feature-branch,解决冲突"
使用变基保持历史整洁
# 在功能分支上执行变基
git checkout feature-branch
git rebase main

# 解决可能的冲突
# ... 编辑文件解决冲突 ...
git add resolved-file.txt
git rebase --continue

# 切换回主分支并合并(快进)
git checkout main
git merge feature-branch

警告: 只对尚未推送到远程仓库的本地分支使用变基。对公共分支使用变基会重写历史,给其他协作者带来问题。

紧急修复流程
# 从主分支创建热修复分支
git checkout main
git checkout -b hotfix/critical-issue

# 进行修复并提交
git add .
git commit -m "修复严重问题"

# 合并到主分支和开发分支
git checkout main
git merge hotfix/critical-issue
git checkout develop
git merge hotfix/critical-issue

# 删除热修复分支
git branch -d hotfix/critical-issue

团队协作提示: 在团队环境中,建议使用Pull Request(GitHub)或Merge Request(GitLab)进行代码审查,而不是直接合并分支。这有助于确保代码质量和团队一致性。