Git 分支操作与冲突处理

253 阅读3分钟

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

合并类型:

  1. 快进合并(Fast-Forward)
    • 条件:目标分支没有新提交
    • 效果:直接移动分支指针,不会生成合并提交
  2. 三方合并(Three-Way Merge)
    • 条件:目标分支有新提交
    • 效果:生成一个新的合并提交(Merge Commit)

强制生成合并提交(禁用快进):

git merge --no-ff <branch>

三、变基(Rebase)

将当前分支的提交“移植”到目标分支的最新提交之后,形成线性历史。

命令:

# 1. 切换到要变基的分支
git switch feature/login

# 2. 执行变基(将feature/login的提交应用到main之后)
git rebase main

变基流程:

  1. 找到两个分支的共同祖先
  2. 提取当前分支的差异提交
  3. 将这些提交按顺序应用到目标分支

交互式变基(修改提交历史):

git rebase -i main  # 可编辑/合并/删除提交

四、合并(Merge)与变基(Rebase)的区别

特性合并(Merge)变基(Rebase)
历史记录保留原始分支结构,有合并提交线性历史,无合并提交
提交哈希保留原始提交的哈希值生成全新的提交哈希
适用场景公共分支(如main)私有分支整理历史
冲突处理一次解决所有冲突可能需多次解决冲突(按提交顺序)
风险历史更真实,但较杂乱重写历史,禁止在公共分支使用

黄金准则:

不要对已推送到远程仓库的分支执行变基!
仅限本地未推送分支使用变基。


五、冲突处理详解

当Git无法自动合并更改时(如多人修改同一文件的相同位置),会发生冲突。

冲突解决步骤:
  1. 识别冲突文件
    执行合并/变基后,Git会标记冲突文件:

    CONFLICT (content): Merge conflict in <file.txt>
    
  2. 查看冲突标记
    打开文件,冲突区域会被标记为:

    <<<<<<< HEAD
    当前分支的代码(如main分支)
    =======
    要合并分支的代码(如feature/login)
    >>>>>>> feature/login
    
  3. 手动解决冲突

    • 删除所有冲突标记(<<<<<<<, =======, >>>>>>>
    • 保留需要的代码(或修改成新版本)
    • 保存文件
  4. 标记为已解决

    git add <resolved-file>  # 例如 git add file.txt
    
  5. 完成操作

    • 合并场景:
      git commit -m "Merge feature/login and resolve conflicts"
      
    • 变基场景:
      git rebase --continue  # 继续变基流程
      # 若需跳过当前提交(慎用):
      # git rebase --skip
      # 若放弃变基:
      # git rebase --abort
      
可视化工具辅助:
git mergetool  # 使用配置的图形工具(如vimdiff, VSCode, Meld)

六、最佳实践总结

  1. 分支策略:

    • main/master:稳定生产分支
    • develop:集成测试分支
    • feature/*:功能开发分支
    • hotfix/*:紧急修复分支
  2. 操作建议:

    • 公共分支(如 main)只使用 合并
    • 私有功能分支使用 变基 保持历史整洁
    • 频繁拉取远程更新:git pull --rebase
  3. 冲突预防:

    • 小步提交,避免巨型提交
    • 团队约定代码规范(如文件独占编辑权)
    • 频繁同步分支: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