为什么需要合并分支?¶
想象你和同事一起开发一个项目,你负责“用户登录功能”,同事负责“购物车功能”。为了避免互相干扰,你们可以在Git中创建不同的分支来独立开发,完成后再把各自的工作合并到主项目(通常是master分支)中。合并分支就像是把两个人的“成果”整合到一起,让整个项目继续推进。
Fast-forward合并:最简单的“快进式”合并¶
什么是Fast-forward?¶
当你从主分支(比如master)创建一个新分支(如feature/login),并在新分支上完成修改后,主分支在此期间没有任何新提交。此时合并新分支到主分支时,Git会直接把主分支的指针“快进”到新分支的最新提交,就像时间线直接延伸,不会产生新的合并记录。
举个例子:
1. 初始状态:master分支只有1个提交(假设是基础代码)。
2. 创建并切换到feature/login分支,修改代码并提交(此时master分支未变)。
3. 切换回master分支,执行git merge feature/login,Git发现master和feature/login的历史是“线性”的(master在feature/login之前没有分叉),于是直接将master的指针移到feature/login的最新提交。
Fast-forward的特点:¶
- 没有新提交:合并后主分支历史中,
feature/login的提交会被直接“接上”,不会出现额外的“合并提交”。 - 操作简单:无需解决冲突(因为分支未分叉),直接快进完成合并。
普通合并:带新提交的“分叉式”合并¶
什么是普通合并?¶
如果在feature/login开发的同时,有人在master分支上也提交了新代码(比如修复了一个bug),此时master和feature/login的历史就会出现“分叉”。合并时,Git会创建一个新的合并提交,把两个分支的历史“粘”在一起,这个新提交会同时包含两个分支的修改内容。
举个例子:
1. 初始状态:master分支有提交A(基础代码)。
2. 创建feature/login分支,修改代码并提交(此时master仍为A)。
3. 切换回master分支,再提交一个新内容(如提交B)。
4. 切换回feature/login分支,修改代码并提交(此时master有A和B,feature/login有A和C)。
5. 切换回master分支,执行git merge feature/login,Git会创建一个新的合并提交D,包含A、B、C的内容,此时master的历史就变成了A→B→D。
普通合并的特点:¶
- 有新提交:合并后主分支会多出一个“合并提交”(显示
Merge branch 'feature/login')。 - 可能需要解决冲突:如果两个分支修改了同一文件的同一行,Git无法自动合并,会提示“冲突”,需要手动修改。
操作步骤:如何实现两种合并方式?¶
准备工作:创建仓库和基础分支¶
先初始化一个Git仓库,并创建基础master分支:
# 初始化仓库(如果没有)
mkdir my_project && cd my_project
git init
# 创建初始文件并提交到master
echo "Initial code" > README.md
git add README.md
git commit -m "Initial commit"
场景1:Fast-forward合并(分支未分叉)¶
这是最简单的合并方式,适合“独立开发后合并”的场景。
步骤1:创建并开发功能分支¶
# 创建并切换到feature/login分支
git checkout -b feature/login
# 修改代码(比如添加登录功能)
echo "Login page" >> README.md
git add README.md
git commit -m "Add login page"
此时,master分支仍为初始提交,feature/login有1个新提交。
步骤2:合并到master(Fast-forward)¶
# 切换回master分支
git checkout master
# 合并feature/login到master(此时master未分叉,触发Fast-forward)
git merge feature/login
此时执行git log,会发现master的提交直接包含了feature/login的内容,没有新的合并提交(Fast-forward生效)。
场景2:普通合并(分支已分叉)¶
这是多人协作中更常见的场景,适合“并行开发后合并”的情况。
步骤1:在master分支新增提交(模拟他人修改)¶
# 回到master分支,修改文件
git checkout master
echo "Fix bug in homepage" >> README.md
git add README.md
git commit -m "Fix homepage bug"
此时,master有2个提交:初始提交→Fix bug提交。
步骤2:在feature分支继续开发¶
# 切换回feature/login分支,继续修改
git checkout feature/login
echo "Add user profile" >> README.md
git add README.md
git commit -m "Add user profile"
此时,feature/login有2个提交:Add login→Add profile;master有2个提交:Initial→Fix bug,两者已分叉。
步骤3:合并到master(普通合并)¶
# 回到master分支,合并feature/login
git checkout master
git merge feature/login
此时Git会自动创建一个新的合并提交(显示为Merge branch 'feature/login'),解决分叉问题。如果修改的内容无冲突,合并完成;若有冲突,需要手动解决后再提交。
总结¶
| 合并类型 | 发生条件 | 合并结果 | 命令特点 |
|---|---|---|---|
| Fast-forward | 主分支无新提交,分支线性延伸 | 主分支指针直接快进,无新提交 | git merge 自动执行快进 |
| 普通合并 | 主分支有新提交,分支出现分叉 | 生成新的合并提交,历史有分叉记录 | git merge 需解决冲突或手动确认 |
关键点:¶
- Fast-forward是“理想状态”,适合独立开发后合并,操作简单。
- 普通合并是“现实状态”,处理并行开发,需注意冲突解决。
- 两种方式都用
git merge [分支名]命令,Git会根据分支历史自动选择合并类型。
通过这两种合并方式,你可以灵活整合不同分支的代码,让项目有序推进~