Git并行开发「分支」

Posted 白龙码~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git并行开发「分支」相关的知识,希望对你有一定的参考价值。

文章目录

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将两个分支做出的修改全部保留下来,并且进行了标注。

因此,接下来我们要做的事就是:

  1. 将无用的标注部分删除
  2. 手动地选择保留哪个分支修改的内容
hello
python(modified by branch_test) # 保留branch_test修改的内容
  1. 将修改后的文件添加至暂存区
git add <文件名>
  1. 将文件提交至本地库
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分支拉取,测试完成后与masterdevelop分支进行合并。

以上是关于Git并行开发「分支」的主要内容,如果未能解决你的问题,请参考以下文章

git初识

开发的必杀技:Git 的分支管理

Git分支的前世今生

Git分支管理——创建合并删除分支

Git分支管理——创建合并删除分支

Git 分支管理