摘要
本文通过时序图和分支树展示了Git分支协作与冲突解决的完整流程。首先演示了两个开发者基于同一远程仓库并行工作的场景:开发者A创建功能分支并提交,开发者B修复bug并推送。随后展示了无冲突合并与冲突合并两种情况,重点说明了冲突产生的原因(同一文件的同一行被不同分支修改)及解决步骤(手动编辑冲突文件→标记已解决→提交合并结果)。文章还通过实例操作详细演示了初始化仓库、创建分支、修改文件、合并冲突等Git命令的具体使用过程,帮助读者理解Git分支管理的核心概念和操作流程
一、分支模型与协作流程图
以下时序图展示了两个开发者基于同一远程仓库并行工作,以及分支合并与冲突解决的完整流程。
开发者B 本地仓库B 远程仓库(origin) 本地仓库A 开发者A 开发者B 本地仓库B 远程仓库(origin) 本地仓库A 开发者A 初始状态:远程已有 master 分支 开发者A:创建功能分支并提交 开发者B:基于 master 修复 bug 合并 feature-login 到 master(无冲突) 合并 bugfix-payment 到 master(产生冲突) 开发者A 拉取最新 master(含冲突解决后的版本) git clone origin git clone origin git branch feature-login git checkout feature-login 修改代码 → add → commit git push origin feature-login git checkout master git pull origin master git branch bugfix-payment 修改代码 → add → commit git push origin bugfix-payment git checkout master git pull origin master git merge feature-login git push origin master git checkout master git pull origin master 提示有冲突(CONFLICT) 手动编辑冲突文件 git add <file> git commit -m "merge bugfix-payment" git push origin master git pull origin master 自动合并成功(无新冲突)
二、分支树:先理解提交历史的结构
Git 的提交历史构成一棵树。每次 commit 产生一个节点,分支是指向某个节点的指针。
main feature-login init feature add master add merge feature
为什么需要分支?
- 并行开发:多个功能同时进行,互不干扰。
- 隔离风险:实验性改动放在单独分支,失败直接删除。
- 版本维护:为不同版本(v1.0、v2.0)创建长期分支。
三、实例操作
以下操作均在一个新目录中进行,使用命令行。
3.1 初始化并创建第一个文件
bash
mkdir git-branch-demo
cd git-branch-demo
git init

创建 hello.txt,内容:
Line 1: Hello Git

bash
git add hello.txt
git commit -m "第一次提交:添加 hello.txt"

完整过程:

3.2 创建并切换到新分支
bash
git checkout -b feature-login
验证:
bash
git branch -v

3.3 在新分支上修改并提交
编辑 hello.txt,增加一行:
Line 1: Hello Git
Line 2: Added by feature-login
bash
git add hello.txt
git commit -m "feature-login: 增加第二行"

此时分支树分叉。
main feature-login init (8ca80d7) feature-login: 增加第二行
3.4 切换回主分支并修改同一文件
bash
git checkout main
此时 hello.txt 是初始版本。编辑它:
Line 1: Hello Git
Line 2: Added by main


bash
git add hello.txt
git commit -m "master: 增加第二行(不同内容)"

现在两个分支在**同一文件的同一位置(第二行)**分别做了不同修改 → 后续合并必然冲突。
main feature-login init feature add master add
四、合并冲突:产生原因与解决方法
4.1 为什么会产生冲突?
Git 合并时,会找到两个分支的最近公共祖先(merge base) ,然后执行三方合并:
公共祖先 commit
master commit
feature commit
merge
结果
- 如果 Base → master 与 Base → feature 的修改不重叠(修改了不同文件,或同一文件的不同行),Git 能自动合并。
- 如果重叠 (修改了同一文件的同一行或相邻行),Git 无法判断保留哪个版本,于是产生冲突,需要人工介入。
本例中,两个分支都是在第二行增加内容,但内容不同,因此 Git 报冲突。
4.2 执行合并(产生冲突)
在 main 分支上:
bash
git merge feature-login
输出:
Auto-merging hello.txt
CONFLICT (content): Merge conflict in hello.txt
Automatic merge failed; fix conflicts and then commit the result.
此时状态为 (master|MERGING)。


此时的分支树:
main feature-login init feature add master add merge conflict resolved
4.3 解决冲突(三步骤)
打开 hello.txt,内容变为:
Line 1: Hello Git
<<<<<<< HEAD
Line 2: Added by master
=======
Line 2: Added by feature-login
>>>>>>> feature-login

步骤1:手动编辑,删除 <<<<<<<、=======、>>>>>>> 标记,保留需要的内容。例如合并两句:
Line 1: Hello Git
Line 2: Added by master and feature-login

步骤2:标记为已解决:
bash
git add hello.txt
步骤3:完成合并提交:
bash
git commit -m "合并 feature-login,解决第二行冲突"
注意:此处的 git commit 不能带文件名 ,因为合并提交可能涉及多个文件。

五、正常合并(无冲突)
如果两个分支修改了不同文件,或者同一文件的不同行,合并将自动完成,无需人工干预。
示例场景:
feature 分支修改了 a.txt 的内容。

master 分支修改了 b.txt 的内容。

执行 git merge feature 后,Git 直接成功,并自动生成一个合并提交(非 fast-forward 时)。
bash
git merge feature

六、远程分支协作常用命令
| 操作 | 命令 |
|---|---|
| 推送本地分支到远程 | git push origin <branch> |
| 拉取远程分支更新 | git pull origin <branch> |
| 查看所有远程分支 | git branch -r |
| 删除远程分支 | git push origin --delete <branch> |
| 克隆远程仓库 | git clone <url> |
邀请成员协作:在 Gitee 仓库中添加协作者,对方克隆后即可推送。
七、小结
| 概念 | 说明 |
|---|---|
| 分支树 | 提交历史形成的图结构,分支是指针 |
| 三方合并 | 基于公共祖先比较两个分支的差异 |
| 冲突原因 | 两个分支修改了同一文件的同一区域 |
| 解决冲突 | 手动编辑 → git add → git commit(无文件名) |
| 正常合并 | 修改不重叠时自动完成 |