项目实际开发中,我们往往会有多个项目分支,例如用于测试开发的dev分支,用于项目正式发布的分支release
我们可以通过联网仓库的网页,进行项目分支的创建与修改也可以通过Git命令进行
另外,一般多分支结构中不同命名的分支有相关的含义(并不是死规定,但是是一种开发范式)
主分支(Main Branch):
通常被称为"main"、“master"或"mainline”,是主要的稳定分支,用于存放部署到生产环境的代码。
开发分支(Development Branch):
通常被称为"develop",是用于集成团队成员的开发工作的分支。所有特性分支和bug修复分支通常都会合并到该分支。
特性分支(Feature Branch):
通常以"feature/“为前缀,然后接上描述性名称,例如"feature/new-login-page”。用于单独开发某个新功能或需求的分支,一旦完成开发,通常会合并回开发分支。
修复分支(Bug Fix Branch):
通常以"bugfix/“为前缀,然后接上描述性名称,例如"bugfix/issue-123”。用于解决特定bug或问题的分支,修复完成后会合并回开发分支。
发布分支(Release Branch):
通常以"release/“为前缀,然后接上版本号或描述性名称,例如"release/v1.2.0”。用于准备发布新版本的代码,包括进行测试、修复bug等。发布完成后,会合并回主分支和开发分支。
预发布分支(Pre-release or Staging Branch):
通常以"pre-release/"或"staging/"为前缀,用于在测试环境中进行最终验证和准备部署到生产环境的代码。
持续集成分支(CI Branch):
用于持续集成和自动化测试的分支,通常以"ci/"或"continuous-integration/"为前缀。
备份分支(Backup Branch):
用于备份重要的里程碑或稳定版本的分支,通常以"backup/"为前缀。
这里是以Gitee为例进行项目分支创建
Git中对于分支的操作,核心命令就是下面四个:
git branch <branch_name> # 一般用于创建和查看分支
git checkout <branch_name> # 切换分支
git switch <branch_name> # Git2.23+新特性,用于和checkout功能分离
git merge <branch_name> # 分支合并功能
还有用于远程服务器推送的命令
git push # 推送仓库到远程服务器
查看分支分为两种
# 语法格式
git branch # 查看本地所有分支,当前处于的分支会有颜色和*标记
# 语法格式
git branch -r # 查看远程分支
# 语法格式
git branch -a # 查看所有分支(本地+远程)
# 其中remotes开头的代表远程分支
远程分支注意事项:很多人认为查看远程分支就相当于程序帮你去请求了当前远程仓库的内容,所有发现直接git branch -r看不到新内容
其实不是这样的,-r 参数只是在你pull(将远程仓库同步本地)之后,帮你把你本地没有commit的和刚刚pull下来的做出对比
所以如果真的要直接看新的分支,应该先pull,在branch -r 下面是示例
# 示例
git pull # 将远程仓库同步到本地(也就是更改本地当前文件)
git branch -r # 这时候,我们才能看到远程分支的内容
完整例子
现在我用户1修改了远程仓库的内容和分支,创建了dev分支,但是我作为用户2,并没有同步
此时,我的项目分支如下
我(没有pull之前的项目分支)
$ git branch -a # 查看所有分支
* master
remotes/origin/HEAD -> origin/master # remotes开头是远程的,此时远程我已经创建了dev,但是并没显示
remotes/origin/master
# 此时只有一个master分支,是因为我现在没有和服务器同步,这个-r其实是我最开始同步分支的时候显示的远程分支
我(pull之后的项目分支)
$ git pull # 我把远程的同步下来
$ git branch -a # 再次查看所有分支
* master # 代表本地的master分支
remotes/origin/HEAD -> origin/master
remotes/origin/dev # 此时,才会显示远程分支里面的dev
remotes/origin/master
分支创建有两种方式,一个是直接branch,一个是checkout,checkout可以创建后直接切换到新建分支(其实就是branch+checkout了一下)
# 语法格式
git branch <分支名称>
# eg:
git branch dev # 新建dev分支
# 语法格式
git checkout -b <分支名称>
git switch -c <分支名称> # 新语法Git2.23+支持
# eg:
git checkout -b dev # 新建dev并切换到dev分支
# 或者
git switch -c dev # 新建dev并切换到dev分支
git branch # 可以看到*标记当前分支是dev
在Git2.23以后版本,增加了switch语句,用于分离checkout的功能
# 语法格式
git checkout <分支名称>
git switch <分支名称>
合并分支用于将一个分支的更改合并到当前分支。
简单来讲,就是你比如现在在开发分支dev进行工作,这时候,你觉得开发的差不多的,可以发布了
那现在,是不是需要把dev和master主分支,进行合并。合并完你正式版就和dev一样更新了新功能了。
合并分支步骤:
# 语法格式
git checkout <需要合并到哪个分支> # 切换到需要合并的分支
git merge <需要合并哪个分支>
# eg:
# 我现在要把dev开发分支开发完的数据合并到master主分支
git checkout master # 先切换到master
git merge # 把dev分支合并进来
合并分支,是由Git自己去识别哪些内容该合并,哪些不需要合并
比如你现在开发分支开发了新功能文件,主分支并没有这个功能文件,那Git就自动帮忙合并过来了
但是如果你开发分支对1.txt的第一行修改了一下,结果你主分支也修改了1.txt第一行,那Git到底该怎么合并对吧?
举个例子:
原本在master的main.py文件:
print('我是入口程序代码:')
此时,dev的main.py也是和上面相同的。
接下来重点来了,我现在dev版本我修改了main.py,我master分支也修改了main.py
dev修改:
print('我是DEV版本入口程序代码:')
master修改:
print('我是入口程序代码-Master版:')
虽然说,这两个修改的不是相同地方,但是是同一行啊,Git怎么给你合并呢???
这时候就产生了冲突,Git没法解决,所以给你把main文件变成了这样:
Git显示冲突
这里面每一个符号有不同的含义
HEAD:代表冲突开始的地方
=======:这个标记将master
分支的修改和dev
分支的修改分隔开。
<<<<<<< HEAD
print('我是入口程序代码-Master版:')
=======
print('我是DEV版本入口程序代码:')
>>>>>>> dev
这时候,我们就需要手动进行解决冲突,你手动修改代码后,然后再进行add和commit,就可以重新提交,或者合并。
产生冲突的几种情况:
解决冲突的基本步骤如下:
<<<<<<<
、=======
和>>>>>>>
,用于标记冲突的代码段。git add
命令标记文件为已解决状态。git commit
命令来提交解决冲突后的代码。比如一些分支dev2.0 开发版本2.0现在你想淘汰了,就可以删除这个分支。
或者说,现在dev2.0和dev3.0现在要取消,全部合并dev开发板,那么现在需要合并2.0和3.0在进行删除
删除分支分为两种方式
两种删除方式的主要区别如下:
合并状态检查:
数据恢复:
普通分支删除在删除之前,会对删除分支进行验证,
# 语法格式
git branch -d <分支名称>
git branch --delete <分支名称> # 完整语法
# eg:
git branch -d dev2.0 # 删除2.0分支
# 语法格式
git branch -D <分支名称> (强制删除是大写D,并且永久删除不可恢复,慎用!)
git branch --delete --force # 完整语法
# 语法格式
git push <远程仓库名称> <分支名称> # 如果不填写就推送整个仓库
# 查看远程仓库信息
git remote -v # 查看当前本地仓库与远程仓库建立的连接
h -d dev2.0 # 删除2.0分支
### 2.5.2 强制删除分支
```shell
# 语法格式
git branch -D <分支名称> (强制删除是大写D,并且永久删除不可恢复,慎用!)
git branch --delete --force # 完整语法
# 语法格式
git push <远程仓库名称> <分支名称> # 如果不填写就推送整个仓库
# 查看远程仓库信息
git remote -v # 查看当前本地仓库与远程仓库建立的连接
Git免密码提交-ssh密钥的生成与配置 | 一个计算机如何生成多个ssh密钥 | ssh相关疑问解答