03-分支操作
03-分支操作
分支管理
1. 什么是分支
在项目开发过程中,根据进度会进行多次提交。每次提交,git 都会生成一个提交记录,这些提交记录会串成一条时间线,这条时间线就可以看作是分支。在项目创建时,git 会自动生成一条分支,即主分支,默认分支名称 master。在版本控制过程中,通常使用多条分支同时推进多个任务,互不干扰。其中在分支查看时使用 HEAD 指向当前分支。
2. 分支的好处
- 同时并行推进多个功能开发,提高开发效率
- 各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。
3. 分支操作
3.1 创建分支
3.1.1 创建普通分支
使用命令:
$ git branch [分支名]
- 创建分支都是以当前所在分支为基础,并且新分支会复制当前分支的内容作为新分支起始内容,并沿用对应的历史提交记录
- 使用此命令并不会切换到新建分支
- 切换分支时,必须有父节点。所以在初始化项目时,主分支必须至少提交一次后才可以创建分支
3.1.2 创建空白分支
使用命令:
$ git checkout --orphan [分支名]
空白分支仍然会复制原始分支内容,但不沿用原分支提交历史。在空白分支进行新的提交为第一次提交。
若空白分支没有进行任何提交,在分支查看中是无法看到的
空白分支的意义:
- 项目资源存储
- ...
3.2 切换分支
3.2.1 普通切换分支
使用命令:
$ git checkout [分支名]
- 切换分支时,本地工作区,仓库都会相应切换到对应分支的内容
3.2.2 创建并切换分支
使用命令:
$ git checkout -b [分支名]
- 创建一个新分支,并切换到该分支
新建分支和切换分支的合并简写
使用命令:
$ git checkout -b [新分支名称] [起始分支]
- 在指定分支基础上创建新分支并切换到该分支
3.3 查看分支
3.3.1 查看本地分支
使用命令:
$ git branch
$ git branch -l
3.3.2 查看本地所有分支及最新的提交信息
使用命令:
$ git branch -v
最新提交信息为每一个分支最后一次提交历史的前 6 位 hash 值及相应的提交描述
3.3.3 查看单个分支提交历史
查看分支所有提交记录
$ git log [分支名称]
查看某分支从另一分支切换出来之后所有的提交记录
$ git log [基础分支]..[分支名称]
3.4 合并分支
分支合并时是以当前所在分支为基础,将其他分支向当前分支合并。所以在合并分支前注意先进行切换。
3.4.1 快进合并
快进合并(Fast-Forward)是 git 分支合并的默认方式。
使用命令:
$ git merge [被合并分支名称]
可以得出如下部分示例结果:
Updating [基础分支发生合并操作前最后一次提交 commit-id]
Fast-Forward
[发生变化的文件]
[发生变化的文件总概述]
合并原理
- 合并前提交记录进度图
↓ 合并前 HEAD 所在位置
base 分支:[base1] --> [base2]---------------------->
| ↑
git checkout -b branch ↓ | git merge branch
| |
branch 分支: └--------[branch1] --> [branch2]
合并时分支进度
- 合并后提交记录进度图
↓ 合并后 HEAD 所在位置
base 分支:[base1] --> [base2] --> [branch1] --> [branch2]
| ↑
| |
| |
branch 分支: └--------[branch1] --> [branch2]
快进合并就是将被合并分支的内容及提交记录都添加到合并分支中,在合并分支中沿用被合并分支内容,并且在合并分支上默认不会创建新的的提交,记录此次合并操作。
快进合并的前提
在基础支切换出其他分支后,又产生了自己分支的提交,就不能进行快进合并。
↓ 合并前 HEAD 所在位置
base 分支:[base1] --> [base2] -- [base3] ---------->
| ↑
git checkout -b branch ↓ X git merge branch
| |
branch 分支: └--------[branch1] --> [branch2]
合并时分支进度
合并分支的最终目的是将两条分支中的内容完整的合并在一起,快进合并的最后结果是从切换分支位置开始,沿用被合并分支的内容并推进至被合并分支的最新提交进度。那么合并分支在切换分支后的提交就有可能会丢失。
每次执行 git merge 命令时,git 都会先去尝试能不能使用 "Fast-forward" 的模式进行合并,如果能,就默认使用 "Fast-forward" 的模式进行合并,如果不能,就创建一个合并提交进行合并。
如果不进行快进合并或不想进行快进合并,可以使用以下命令:
- 明确指定不使用 "Fast-forward" 的模式进行合并
$ git merge --no-ff [被合并分支名称]
$ git merge --no-ff [被合并分支名称] -m [分支合并提交]
若能合并成功,则生成一条合并提交记录,根据是否填写提交记录,决定是否使用默认提交记录 "Merge branch 'BranchName'";若不能合并成功,则会在编辑器中展示合并代码冲突区域,待开发者解决冲突后,再进行一次手动合并提交。
- 只有在符 合"Fast-forward" 模式的前提下才能合并成功,在不符合 "Fast-forward" 模式的前提下,合并操作会自动终止
$ git merge --ff-only [被合并分支名称]
- 将被合并分支多次提交的内容直接存到工作区和暂存区,由开发者手动去提交,这样当前分支最终只会多出一条提交记录,不会掺杂被合并分支的提交历史
$ git merge --squash [被合并分支名称]
merge 合并的基本顺序
以 dev 分支合并到 master 分支为例:
- 找出 dev 分支和 master 分支的最近一次公共 commit 点(及分支切离点或最新合并点)
- 将 dev 最新一次 commit 代码和 master 最新一次 commit 代码在工作区进行合并,有冲突的话需要解决冲突,然后提交后生成一个新的 commit
- 将以上两个分支 dev 和 master 上的所有提交点(从最近一次公共 commit 点以后的)按照提交时间的先后顺序进行依次放到 master 分支上
3.4.2 合并冲突
当无法进行快进合并时仍要进行合并操作时,会出现合并冲突。
如果两个分支中的++同一个文件中的同一行的内容不一样++,当合并这两个分支时,就会出现冲突,因为 git 无法判断开发者想要以哪个内容为准,所以需要人为介入去确认。
人为介入确认内容的过程,就是解决冲突的过程。
出现冲突的位置会在编辑器中以如下方式提现:
以 VScode 编辑器为例
采用当前修改 | 采用传入的修改 | 保留双方修改 | 比较变更
<<<<<< HEAD (当前修改)
code...
=======
code...
>>>>>> [被合并分支名称] (传入的更改)
根据编辑器提示操作即可。待解决所有冲突后,需要自行手动补充提交,记录分支合并。
3.4.3 取消合并
使用命令:
$ git merge --abort
当合并失败出现冲突时,可以取消合并。
3.5 变基合并
$ git rebase
3.6 重命名分支
3.6.1 重命名当前分支
使用命令:
$ git branch -m [新分支名称]
3.6.2 重命名指定分支
使用命令:
$ git branch -m [原分支名称] [新分支名称]
3.7 删除分支
当分支合并后,就可以删除该分支。
3.7.1 删除分支内容
使用命令:
$ git rm -rf .
- 仅删除分支内容,仍保留当前分支
3.7.2 删除本地分支
使用命令:
$ git branch -d [删除分支名称]
- 无法删除当前分支,必须切换到其它分支才可以进行切换
- 若删除分支存存在修改内容未与其它分支合并,则无法删除
3.7.3 强制删除本地分支
使用命令:
$ git branch -D [删除分支名称]
- 即使删除分支存存在修改内容未与其它分支合并,也可以删除
当你接到一个修复紧急 bug 的任务时候,一般都是先创建一个新的 bug 分支来修复它,然后合并,最后删除