核心原则是:让分支的“生命周期”尽可能短,并保持与主分支的持续同步。
以下是最佳实践和详细操作步骤,遵循这些可以极大程度地减少合并时的痛苦。
一、最佳实践(预防冲突的根本)
-
基于最新的主分支创建功能分支
- 命令:
# 1. 首先确保本地 main 分支是最新的 git checkout main git pull origin main # 2. 基于最新的 main 创建并切换到新功能分支 git checkout -b feature/your-awesome-feature - 为什么? 这确保了你的起点是所有已知代码,而不是一个陈旧的版本,从源头上减少了未来合并的差异。
- 命令:
-
保持功能分支与主分支的同步(定期变基)
- 这是最关键的一步。在开发过程中,主分支(main)可能已经有了其他人的更新。你需要定期把这些更新“拉”到你的功能分支上,而不是等到最后才处理。
- 命令:
# 在 feature 分支上操作 git fetch origin main # 获取远端 main 分支的最新 commit,但不合并 git rebase origin/main # 将你的 commits “变基”到最新的 main 之上 # 如果发生冲突,Git 会提示你。解决冲突后: git add . # 标记冲突已解决 git rebase --continue # 继续变基过程 - 为什么用
rebase而不是merge?rebase会将你的提交“重新播放”在主线的最新节点上,使得历史记录是一条直线,非常整洁,没有多余的合并提交。- 相比之下,如果频繁使用
git merge origin/main,会在你的功能分支里产生大量“合并提交”,使历史记录变得复杂混乱。
- 注意:
rebase会重写历史,所以只对你本地、尚未推送到远端的个人分支使用。
-
提交原子化,注释清晰
- 每次提交(Commit)只做一件小事(例如:完成一个函数、修复一个bug、添加一个文档)。清晰的提交信息有助于回顾代码和定位问题。
-
推送到远程备份并协作
- 定期将你的功能分支推送到远程仓库,既是备份,也方便同事查看。
- 命令:
git push -u origin feature/your-awesome-feature # 第一次推送时用 -u 设置上游 git push # 之后推送直接用
二、合并功能分支到主分支(解决冲突的最后一步)
当你完成开发,并且测试通过后,就可以合并了。通常有两种方式:
方式一:使用 Merge Request / Pull Request (推荐)
这是团队协作的标准流程,提供了代码审查的机会,是保证代码质量的重要环节。
- 确保你的分支是最新的:再次执行上面的
git fetch和git rebase origin/main操作,解决可能出现的所有冲突。这是你的责任。 - 推送到远程分支:
git push origin feature/your-awesome-feature - 在 GitLab/GitHub 等平台创建 Merge Request (MR) 或 Pull Request (PR)。
- 请求同事进行代码审查。同事可能会提出修改意见。
- 根据审查意见,在本地分支修改并再次提交推送。PR/MR 会自动更新。
- 审查通过后,由你或项目负责人点击“合并”。平台通常会提供三种合并方式:
- Create a merge commit:生成一个合并提交,历史记录清晰显示分支的合并点。这是最常用、最安全的方式。
- Squash and merge:将你分支上的所有提交“压扁”成一个新的提交,再合并到 main。适合琐碎的提交历史。
- Rebase and merge:将你的提交变基后直接线性地添加到 main 分支的头部。历史最干净,但要求分支本身很整洁。
方式二:本地合并后推送(小型项目或单人使用)
- 切到 main 分支并更新:
git checkout main git pull origin main - 合并功能分支:
git merge feature/your-awesome-feature - 解决冲突(如果提示有):
- Git 会标记出冲突的文件。用编辑器打开文件,找到
<<<<<<<,=======,>>>>>>>标记的地方,手动修改代码来解决冲突。 - 解决后,添加文件并提交:
git add . git commit -m "merge feature/your-awesome-feature"
- Git 会标记出冲突的文件。用编辑器打开文件,找到
- 推送到远程:
git push origin main - 删除无用分支(可选):
# 删除本地分支 git branch -d feature/your-awesome-feature # 删除远程分支 git push origin --delete feature/your-awesome-feature
总结:避免冲突的黄金法则
| 阶段 | 操作 | 目的 |
|---|---|---|
| 开始前 | git pull origin main -> 基于最新 main 切分支 |
从最新起点开始 |
| 开发中 | 定期 git fetch && git rebase origin/main |
持续集成最新变更,分散解决冲突 |
| 提交前 | 最终 rebase 一次,确保无冲突 | 为合并做最后准备 |
| 合并时 | 通过 Pull Request 进行代码审查 | 提高代码质量,再次检查冲突 |
| 合并后 | 删除已合并的功能分支 | 保持仓库整洁 |
记住,冲突并不可怕,它是多人协作的必然产物。通过频繁的 rebase 和早发现早解决的原则,你可以让冲突变得易于管理。