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的一个指针。
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策略合并分支
分支合并的时候涉及到解决冲突的问题,下面是几种常见的冲突解决策略。
对于没有分叉的两个分支默认会采用这种策略,合并时仅会将分支指针移动到对应的commit节点。
常用的合并策略,对于有分叉的分支,会递归查找到两个分支共同的祖先节点,然后从祖先节点开始进行三向合并。
这两种合并策略顾名思义是分别取对方或者己方的变更进行合并,而忽略另一方的变更。
当需要合并多个分支的变更时采用这种策略,可以将多个分支的变更合并为一个。
除了上述比较常见的合并策略,还有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分支的代码。
本文作者:谭三皮
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!