Git 分支操作与冲突处理完整教程
一、切换分支
切换分支是Git中最基础的操作,用于在不同开发线之间切换。
命令:
# 切换到已存在的分支
git checkout <branch-name>
# 或使用更语义化的命令(Git 2.23+)
git switch <branch-name>
创建并切换分支:
# 创建新分支并立即切换
git checkout -b <new-branch>
# 或
git switch -c <new-branch>
示例:
git switch main # 切换到main分支
git switch -c feature/login # 创建并切换到feature/login分支
二、合并分支(Merge)
将指定分支的更改整合到当前分支。
命令:
# 1. 确保当前在目标分支(如main)
git switch main
# 2. 执行合并
git merge <source-branch> # 例如 git merge feature/login
合并类型:
- 快进合并(Fast-Forward)
- 条件:目标分支没有新提交
- 效果:直接移动分支指针,不会生成合并提交
- 三方合并(Three-Way Merge)
- 条件:目标分支有新提交
- 效果:生成一个新的合并提交(Merge Commit)
强制生成合并提交(禁用快进):
git merge --no-ff <branch>
三、变基(Rebase)
将当前分支的提交“移植”到目标分支的最新提交之后,形成线性历史。
命令:
# 1. 切换到要变基的分支
git switch feature/login
# 2. 执行变基(将feature/login的提交应用到main之后)
git rebase main
变基流程:
- 找到两个分支的共同祖先
- 提取当前分支的差异提交
- 将这些提交按顺序应用到目标分支
交互式变基(修改提交历史):
git rebase -i main # 可编辑/合并/删除提交
四、合并(Merge)与变基(Rebase)的区别
| 特性 | 合并(Merge) | 变基(Rebase) |
|---|---|---|
| 历史记录 | 保留原始分支结构,有合并提交 | 线性历史,无合并提交 |
| 提交哈希 | 保留原始提交的哈希值 | 生成全新的提交哈希 |
| 适用场景 | 公共分支(如main) | 私有分支整理历史 |
| 冲突处理 | 一次解决所有冲突 | 可能需多次解决冲突(按提交顺序) |
| 风险 | 历史更真实,但较杂乱 | 重写历史,禁止在公共分支使用 |
黄金准则:
不要对已推送到远程仓库的分支执行变基!
仅限本地未推送分支使用变基。
五、冲突处理详解
当Git无法自动合并更改时(如多人修改同一文件的相同位置),会发生冲突。
冲突解决步骤:
-
识别冲突文件
执行合并/变基后,Git会标记冲突文件:CONFLICT (content): Merge conflict in <file.txt> -
查看冲突标记
打开文件,冲突区域会被标记为:<<<<<<< HEAD 当前分支的代码(如main分支) ======= 要合并分支的代码(如feature/login) >>>>>>> feature/login -
手动解决冲突
- 删除所有冲突标记(
<<<<<<<,=======,>>>>>>>) - 保留需要的代码(或修改成新版本)
- 保存文件
- 删除所有冲突标记(
-
标记为已解决
git add <resolved-file> # 例如 git add file.txt -
完成操作
- 合并场景:
git commit -m "Merge feature/login and resolve conflicts" - 变基场景:
git rebase --continue # 继续变基流程 # 若需跳过当前提交(慎用): # git rebase --skip # 若放弃变基: # git rebase --abort
- 合并场景:
可视化工具辅助:
git mergetool # 使用配置的图形工具(如vimdiff, VSCode, Meld)
六、最佳实践总结
-
分支策略:
main/master:稳定生产分支develop:集成测试分支feature/*:功能开发分支hotfix/*:紧急修复分支
-
操作建议:
- 公共分支(如
main)只使用合并 - 私有功能分支使用
变基保持历史整洁 - 频繁拉取远程更新:
git pull --rebase
- 公共分支(如
-
冲突预防:
- 小步提交,避免巨型提交
- 团队约定代码规范(如文件独占编辑权)
- 频繁同步分支:
git fetch && git rebase origin/main
示例工作流:
# 开发新功能
git switch -c feature/payment # 创建分支
# ...编写代码并提交...
# 同步主分支更新
git fetch origin
git rebase origin/main # 变基更新
# 解决可能的冲突(按上述步骤)
git add .
git rebase --continue
# 合并到主分支
git switch main
git merge --no-ff feature/payment
git push origin main