EP04. “分支(Branch)、合并(Merge)与解决冲突”
🔒 登录后可标记已读- 想试一个新设计,又怕改坏正在运作的网站?开一个分支去试,试失败了整条分支丢掉就好,
main完全不受影响 - 分支在 Git 里非常「便宜」:开一条新分支几乎不花时间和空间,所以习惯是每做一件事就开一条分支
- 现在切换分支用
git switch,比旧的git checkout更直白、不容易误操作 - 两条分支改到同一个文件的同一行时会出现冲突(conflict),看懂那几个
<<<<<<<符号就不可怕
重点内容
分支是什么
gitGraph
commit id: "初始版本"
commit id: "关于我们页面"
branch new-header
checkout new-header
commit id: "新版页首"
commit id: "页首手机版"
checkout main
commit id: "修正错字"
merge new-header
main:主线,通常代表「正在运作、可以上线」的版本- 功能分支(例如
new-header):从main分出去,专心做一件事,做好再合并回来 - HEAD:指向你「现在所在」的分支,
git status第一行On branch main就是 HEAD 的位置
分支常用指令
| 指令 | 用途 |
|---|---|
git branch | 列出本地所有分支,* 标记目前所在分支 |
git branch new-header | 建立新分支(但不会切过去) |
git switch new-header | 切换到该分支 |
git switch -c new-header | 建立并切换,最常用 |
git switch main | 切回主线 |
git branch -d new-header | 删除已合并的分支 |
git branch -D new-header | 强制删除还没合并的分支(改动会丢失) |
git checkout -b new-header | 旧写法,等于 git switch -c,网上旧教程常见 |
📌 切换分支前先 commit(或 stash)手上的改动,不然 Git 可能拒绝切换,或把没存的改动带到另一条分支。
合并:git merge
规则:先切到「要接收改动」的分支,再 merge 另一条进来。
git switch main # 先回到要接收改动的 main
git merge new-header # 把 new-header 的改动并进 main
git branch -d new-header # 合并完,功能分支可以删了
| 合并类型 | 什么时候发生 | 结果 |
|---|---|---|
| Fast-forward | 分出去之后 main 没有新 commit | main 直接往前移,不会多出合并 commit |
| 三方合并(3-way merge) | 两边都有新 commit | Git 自动产生一个「合并 commit」 |
解决合并冲突
两条分支都改了同一个文件的同一段,Git 不知道该听谁的,就会停下来:
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
打开 index.html,会看到 Git 插入的标记:
<<<<<<< HEAD
<p>联络电话:03-1234 5678</p>
=======
<p>联络电话:012-345 6789</p>
>>>>>>> new-header
| 标记 | 意思 |
|---|---|
<<<<<<< HEAD 到 ======= | 目前分支(main)的版本 |
======= 到 >>>>>>> new-header | 要合并进来的分支的版本 |
解决步骤:
- 决定要留哪个版本(或两个都留、或改成新的写法)
- 删掉全部
<<<<<<<、=======、>>>>>>>标记行 - 存档后
git add index.html标记为已解决 git commit完成合并
💡 VS Code 打开冲突文件时,上方会出现 Accept Current Change / Accept Incoming Change / Accept Both Changes 按钮,点一下就帮你处理标记,比手动删方便。
⚠️ 不知道怎么处理、想放弃这次合并:git merge --abort,会回到合并前的状态。
分支命名建议
| 用途 | 例子 |
|---|---|
| 新功能 | feature/whatsapp-button |
| 修 bug | fix/mobile-menu |
| 临时实验 | test/new-font |
- 全小写、用
-连接,不要有空格 - 看名字就知道这条分支在做什么
学完你会
- ✅ 用
git switch -c开新分支、git switch切换 - ✅ 用
git merge把功能分支合并回main - ✅ 看懂冲突标记并手动解决
常见错误
- ❌ 直接在
main上做实验性改动:改坏了整条主线都受影响,要先开分支。 - ❌ 在功能分支上执行
git merge main以为是把功能并进 main:方向反了,要先git switch main再 merge 功能分支。 - ❌ 解决冲突时忘了删
<<<<<<<标记:标记会跟着 commit 进去,网站上直接显示出这些符号。 - ❌ 用
-D删分支前没确认:还没合并的改动会一起丢掉。 - ❌ 一条分支做了一个月才合并:跟
main差太远,冲突会很多,分支要短、要常合并。
Sources
官方文档: