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)
- 将修改后的文件添加至暂存区
git add <文件名>
- 将文件提交至本地库
git commit [-m '捎带信息']
注:这里git commit后不能加文件名。
五、利用分支debug
情景设定:
假设当前正在某一分支进行项目开发,此时另一分支发生bug,但是手头上的工作还没完成,无法提交,但是修复bug的任务非常紧急,怎么办呢?
1、现场保护
git stash
将未提交的修改(即工作区修改但未add的文件)先缓存起来(缓存结构为栈,先入后出)。
2、创建分支并在分支进行debug
git swtich -c hot_fix
git switch original_branch
git merge hot_fix
3、恢复现场
git stash pop
如果当时只保存了一个现场,那么调用一次pop即可将缓存内容恢复至工作区,同时将该缓存删除。
否则,需要先查看缓存,再恢复当前分支对应的那个。
git stash list
查看所有的缓存。
git stash apply <缓存名>
默认的缓存名为stash@{...} 。
这种恢复方式不会删除缓存,因此需要再次手动删除:
git stash drop <缓存名>
六、惯用分支名
主分支只存在一条,是所有用户可见的正式版本。 主分支作为稳定的唯一代码库,不做任何开发使用。 master 分支一般由develop 以及hotfix 分支合并,任何时间都不能直接修改该分支的代码。
简称dev 分支,一般只存在一条,维护了当前开发中代码的主线,始终保持代码新于master 以及bug修复后的代码。 持续集成、最新隔夜版本的生成等都是基于这个分支。由于当前版本迭代较快,开发分支只提供拉取,不进行实际开发。
一般开发新功能的feature 分支都是基于develop 分支创建的。
功能分支存在多个,用于开发各种新功能,需要从develop拉取。开发feature完成后,develop 分支再将其合并。为了降低对其他feature 的影响,一般在提测(提交测试)前merge回develop 分支。
分支命名: 以feature_ 开头。
临时性的bug修复分支(fixbug),用于修复线上问题。 从master拉取,修复并测试完成merge回master和develop。 分支命名:以hotfix_ 开头。
预发布分支从develop 分支拉取,测试完成后与master 和develop 分支进行合并。
|