Git|03 Git的分支与合并

Git|03 Git的分支与合并
hezh一、分支
(一)创建分支
1 | |
- 创建 dev01 分支并设置
git push -u origin dev01与远端链接,远端将出现新分支。
(二)删除分支
1 | |
二、合并
(一)实际经验
- 项目开发一般不会直接在主分支(main/master)上进行,而是检出新分支(dev/develop),在新分支上开发,最后合并到主分支,保证了主分支的稳定与安全。
- 大型项目可能还会在 dev 分支上继续检出新的细小分支,并以如下特定的马甲来命名:
- feat/xxx:新功能/新特性分支
- fix/xxx:bug修复分支
- hotfix/xxx:紧急修复分支
- chore/xxx:杂项分支
- 各细小分支对应到个人/部门负责,最后小分支合并到开发分支,开发分支合并到主分支。这仅是习惯,有些会省掉 dev,直接在 main 检出小分支,如 clash-verge-rev 的分支安排:
- 没有仓库权限的人通过 PR 向仓库推送合并请求,由管理员/所有者检查是否合并
(二)合并
1. 快进模式
-
命令:
git merge <分支名> -
分支 B 合并到分支 A,则需要切回分支 A ,执行
git merge B -
若 B 分支大于 A,则会触发快进模式(Fast-forward);分支和master做了不同操作,合并
-
触发开进模式的条件:
- 当前分支是目标分支的祖先
- 两个分支没有发生分叉
-
这种情况下如果 main 合并 dev01,会进行快进模式,把 main 分支指针快进到 dev01 当前指向的提交。
因为 HEAD 是当前检出的分支指针,如果当前在 main:
- 初始状态
1 | |
-
执行 git merge dev01
-
快进之后
-
同时 HEAD --> main
1 | |
简单演示
-
在 dev01 分支的 file04.txt 文件写一句话,并提交
-
切回 main 分支,file04.txt 无内容,即“一种干净无提交”的状态,dev01 包含 main 的内容,符合快进
-
快进后,dev01 在 file04.txt 上的改动被合并进 main 的空白 file04.txt 文件,并且快照信息(commit-message)也合并
2. 普通合并
两个分支有发生分叉,即有不同的新提交,不能使用快进模式,例如如下情况:
1 | |
这时候在 main 上执行 git merge dev,Git 不能只移动 main 指针,因为 main 自己也有新的提交 E、F。
于是 Git 会创建一个新的合并提交:
1 | |
M 就是合并后的快照(merge-commit)
3. 合并 & 绝决合并冲突
若两个分支对同一部分内容做了彼此不兼容的修改,会产生合并冲突,需手动解决合并冲突
简单演示
- 在 dev01 分支的 file03.txt 文件写上一点东西并 commit:
1 | |
- 回到 main 分支,也在 file03.txt 写上一点东西并commit:
1 | |
- 在 main 合并 dev01:
- 发现会有冲突,冲突部分用特殊符号标记,冲突部分以等号相隔
1 | |
- 需要手动删除这些符号并解决冲突,可以保留当前更改也就是 main 的修改;也可以保留传入修改,也就是 dev01 的改动;也可以自己融合两个分支的修改;也可以什么都不保留,写其他
- 最后 commit 就完成了一次冲突的解决过程,左侧的 git 树会有一条合并线
4. 协作中的合并冲突
情景:A、B用户修改了同一个文件,且修改了同一行位置的代码,此时会发生合并冲突。
A 用户在本地修改代码后优先推送到远程仓库,此时 B 用户在本地修订代码,提交到本地仓库后,也需要推送到远程仓库,但此时 B 用户晚于 A 用户,故 B 需要先拉取远程仓库的提交(即 A 的提交),经过合并后才能推送到远端分支。总的来说就是先 pull 再 push。
远程分支也是分支,所以合并时冲突的解决方式也和解决本地分支冲突相同相同。















