编辑
2022-10-10
开发
00
请注意,本文编写于 955 天前,最后修改于 706 天前,其中某些信息可能已经过时。

目录

Git的本质
什么是分支
分支的基本操作
查看
创建
切换
合并
合并策略
Fast-forward
Recursive
Ours、Theirs
Octopus
删除
协作开发中的分支管理策略
参考文章

Git的本质

Git是分布式的版本控制软件,所以在本地会保存所有的变更记录和文件内容。这些信息全部存储在工作目录的.git目录下,默认是隐藏的。在.git/objects目录下存储着所有的文件、目录树、commit、tag的信息。这些信息组成一颗默克尔树,也称哈希树。Git使用SHA-1算法进行哈希计算,所以每个文件的名称加上上层目录名构成了一个40字符的唯一哈希值。

根据默克尔树的特点,如果根节点的哈希值发生变更,就代表了子树的变更。同时叶子节点的内容发生变更,上层的所有的父节点的哈希值也就发生了变更,新的commit就产生了。

什么是分支

Git所有的信息都是通过哈希树组织起来的,而分支就是指向某个树节点(即commit)的指针,存储在.git/refs/heads目录下。

通过查看分支文件的内容,我们可以看到文件内存储了一个commit的id

shell
$ cat .git/refs/heads/dev c8eb1d081aad9f5ab3df19c103ed51e68edebe8c $ git log commit c8eb1d081aad9f5ab3df19c103ed51e68edebe8c (HEAD -> dev, master) Author: Denton Liu <liutan2008@hotmail.com> Date: Sun Oct 9 16:44:37 2022 +0800 add c.txt

了解了上述内容,我们就可以清楚,创建分支实际上就是创建指定commit的一个指针。

undomerge-revert2.png

分支的基本操作

查看

shell
$ git branch # 查看本地分支 $ git branch -a # 查看所有分支

创建

shell
$ git checkout -b dev # 创建并切换至dev分支 $ git branch dev # 基于当前分支创建dev分支 $ git branch dev tag-11 # 基于tag创建dev分支 $ git branch dev master # 基于分支创建dev分支

切换

shell
$ git checkout dev # 切换到dev分支

合并

shell
$ get merge dev # 合并dev分支的变更到当前分支 $ get merge feature-1 feature-2 feature-3 # 合并多个分支的变更到当前分支 $ git merge -s ours dev # 使用Ours合并策略合并分支变更 $ git merge --no-ff dev # 不使用默认的Fast-forward策略合并分支

分支合并的时候涉及到解决冲突的问题,下面是几种常见的冲突解决策略。

合并策略

Fast-forward

对于没有分叉的两个分支默认会采用这种策略,合并时仅会将分支指针移动到对应的commit节点。

Recursive

常用的合并策略,对于有分叉的分支,会递归查找到两个分支共同的祖先节点,然后从祖先节点开始进行三向合并。

Ours、Theirs

这两种合并策略顾名思义是分别取对方或者己方的变更进行合并,而忽略另一方的变更。

Octopus

当需要合并多个分支的变更时采用这种策略,可以将多个分支的变更合并为一个。

除了上述比较常见的合并策略,还有ort,resolve,subtree策略。上述策略的详细介绍参考 https://www.lzane.com/tech/git-merge/

删除

shell
$ git branch -d dev # 删除本地dev分支 $ git branch -D dev # 强行删除本地dev分支 $ git push origin :dev # 删除远程dev分支 $ git push origin --delete dev # 删除远程dev分支 $ git remote prune origin # 清理本地的远程分支

协作开发中的分支管理策略

一般情况下每个项目应该有两个长期分支:master和develop。 master分支的代码随时可发布的,所有的版本发布都在master分支进行。 develop分支用于日常开发的代码提交,一般是项目最新的代码。

除了长期分支,项目还可以按照情况建立几个临时分支,比如feature、release和hotfix分支。

feature是为某个功能建立的分支,一般命名为feature-*。在功能开发完毕后代码会并入develop分支,随后分支被删除。

release分支是为了版本预发布而创建,一般命名为release-*。在正式发布之前,基于develop分支创建release分支,用于预发布的测试验收。验收通过后,release分支的变更并入master分支进行版本发布。之后同时将变更并入develop分支,然后删除分支。

hotfix分支在版本发布后创建,命名为hotfix-*。版本上线后发现的紧急bug需要修复,这时候可以基于master分支创建hotfix分支,在问题修复后将变更并入master分支进行版本发布,随后将分支变更并入develop分支,然后删除分支。

实际项目中,项目环境一般有四个:开发环境、测试环境、stage环境和生产环境。测试环境部署develop分支的代码,stage环境部署release和hotfix分支的代码,生产环境部署master分支的代码。

参考文章

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:谭三皮

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!