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 分支为例:

  1. 找出 dev 分支和 master 分支的最近一次公共 commit 点(及分支切离点或最新合并点)
  2. 将 dev 最新一次 commit 代码和 master 最新一次 commit 代码在工作区进行合并,有冲突的话需要解决冲突,然后提交后生成一个新的 commit
  3. 将以上两个分支 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 [删除分支名称]
  • 即使删除分支存存在修改内容未与其它分支合并,也可以删除

link

link

当你接到一个修复紧急 bug 的任务时候,一般都是先创建一个新的 bug 分支来修复它,然后合并,最后删除

posted @ 2023-11-15 10:39  讨厌敲代码的老郭  阅读(118)  评论(0编辑  收藏  举报