文章目录
Git并行开发「分支」
一、分支的概念
git会在本地库创建之初默认生成一个
master
分支,即主分支,专用于保存项目已完成的功能代码。
但是,一个项目往往是由多个模块组成的,在工作中这些模块分别交由不同的组、不同的组员完成。
为了在多人协作的时候避免相互干扰,提高协作开发的效率,Git引入分支的概念:
- 不同模块的负责人应当将自己的代码提交至各自的分支,进行更新迭代。
- 当模块完成时,再与主分支进行合并。
二、分支的创建与切换
git branch <分支名>
创建分支。
git branch -d/[-D]<分支名>
删除分支。
注:如果该分支还没有被合并,那么必须用
-D
选项进行强制删除。
git branch -a
查看当前有哪些分支。
git switch [-c]<分支名>
切换分支。
-c
表示:创建该分支并切换。
三、分支的合并
合并分支:将某一个分支的修改的内容合并到当前分支上。
分支的合并需要先切换到被合并的分支上。
比如,
hot_fix
分支要合并到
master
上,那么先切换到
master
分支,即
git checkout master
。
git merge <分支名>
将指定分支与当前分支合并。
git cherry-pick <提交哈希值>
将指定的某一次提交与当前分支合并。
git cherry-pick <分支名>
将某个分支最新的一次提交与当前分支合并。
区别
git merge
会将两个分支的所有文件进行合并git cherry-pick
只会将某一次提交涉及的部分文件与当前分支进行合并,适用于不同分支间只合并部分文件的场景。
四、合并的冲突及解决
合并冲突:当合并两个分支的同一个文件时,发现两个文件的某个相同的位置都作出了修改,并且内容不同,此时Git无法确定应当保留哪个结果,因此产生合并冲突。
1、制造冲突
master
分支和
branch_test
分支都有一个test.txt文件,内容如下:
hello
c++(original content)
接下来,
master
分支将test.txt文件修改为:
hello
java(modified by master)
branch_test
分支将test.txt文件修改为:
hello
python(modified by branch_test)
此时在
master
中执行
git merge branch_test
就会报错:
$ git merge branch_test
Auto-merging test1.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.
2、解决冲突
test.txt的第二行被两个分支修改,因此Git无法判断应当将哪一个分支作出的修改保留下来,因此文件中呈现以下内容:
hello
<<<<<<< HEAD
java(modified by master)=======
python(modified by branch_test)>>>>>>> branch_test
可见,Git将两个分支做出的修改全部保留下来,并且进行了标注。
因此,接下来我们要做的事就是:
- 将无用的标注部分删除
- 手动地选择保留哪个分支修改的内容
hello
python(modified by branch_test)# 保留branch_test修改的内容
- 将修改后的文件添加至暂存区
gitadd<文件名>
- 将文件提交至本地库
git commit [-m '捎带信息']
注:这里git commit后不能加文件名。
五、利用分支debug
情景设定:
假设当前正在某一分支进行项目开发,此时另一分支发生bug,但是手头上的工作还没完成,无法提交,但是修复bug的任务非常紧急,怎么办呢?
1、现场保护
git stash
将未提交的修改(即工作区修改但未add的文件)先缓存起来(缓存结构为栈,先入后出)。
2、创建分支并在分支进行debug
# 创建分支git swtich -c hot_fix
# debug,修改文件并提交# 切换为原分支git switch original_branch
# 合并git merge hot_fix
3、恢复现场
git stash pop
如果当时只保存了一个现场,那么调用一次pop即可将缓存内容恢复至工作区,同时将该缓存删除。
否则,需要先查看缓存,再恢复当前分支对应的那个。
git stash list
查看所有的缓存。
git stash apply <缓存名>
默认的缓存名为
stash@{...}
。
这种恢复方式不会删除缓存,因此需要再次手动删除:
git stash drop <缓存名>
六、惯用分支名
- master(主分支)
主分支只存在一条,是所有用户可见的正式版本。
主分支作为稳定的唯一代码库,不做任何开发使用。
master 分支一般由
develop
以及
hotfix
分支合并,任何时间都不能直接修改该分支的代码。
- develop(开发分支)
简称
dev
分支,一般只存在一条,维护了当前开发中代码的主线,**始终保持代码新于
master
以及bug修复后的代码。
持续集成、最新隔夜版本的生成等都是基于这个分支。由于当前版本迭代较快,开发分支只提供拉取,不进行实际开发**。
一般开发新功能的
feature
分支都是基于
develop
分支创建的。
- feature(功能分支)
功能分支存在多个,用于开发各种新功能,需要从develop拉取。开发feature完成后,
develop
分支再将其合并。为了降低对其他
feature
的影响,一般**在提测(提交测试)前merge回
develop
分支**。
分支命名: 以
feature_
开头。
- hotfix(修补bug分支)
临时性的bug修复分支(fixbug),用于修复线上问题。
从master拉取,修复并测试完成merge回master和develop。
分支命名:以
hotfix_
开头。
- release(预发布分支)
预发布分支**从
develop
分支拉取**,测试完成后与
master
和
develop
分支进行合并。
版权归原作者 白龙码~ 所有, 如有侵权,请联系我们删除。