08月15, 2019

# 手把手跟我做Git系列(五)-- 分支管理

一、什么是分支?

分支可以简单的理解为分叉,在主干上长出一条枝干出来,主干分支通常叫做mastermaster分支其实和以后我们自己创建的分支没有什么区别,只不过master分支是git在初始化的时候自动就创建出来了的。在主分支上可以开很多分支出来,不同的人在不同的分支上做开发,最后合并到主分支,这样不会相互影响。

这么说可能比较的抽象,结合着具体场景解释就是:比如我们在写代码的时候,已经做完了一系列的开发了。相当于已经可以形成一个比较稳定完整的版本。这个时候项目需求又发生了变化,这就需要改动之前的代码。这个时候就会有纠结点改动之前的代码势必会影响之前的版本稳定最好的方式就是,稳定的版本继续运行,不去改变它,我们在继续开发新需求的版本,当新需求的版本测试到位之后,再替换之前的版本

如果没有版本控制会怎么做呢?只能是之前开发的一个版本不去动,然后我们再起一个新的工程,然后在新工程上进行迭代。迭代好之后,再用新工程的版本去替代原来工程的版本。如果某一天又想换回来又用原来的工程替换新的工程就行了

其实使用了版本控制,就是想要解决这种麻烦的事情。让我们便于在各个版本之间切换。这种切换,在git中使用的就是分支

分支的整个过程,其实就是一个工作流的过程,在Github官网,解释的已经很清楚了

二、分支管理的操作

1、查看分支命令

git branch

执行结果: -w817

执行结果表示现在只有一个master的主分支

2、创建分支

git branch 分支名

执行结果:

-w819

3、切换分支

git checkout 分支名

执行结果: -w827

4、创建并切换分支

上面的创建和切换分支,分别进行了两个步骤,可以将这两个步骤合并了一个步骤执行

git branch -b 分支名

-w828

动画演示上面代码的执行过程:

git_branch

5、merge进行分支合并

(1)、在dev分支提交新的修改

git_branch2 -w769

(2)、观察不同分支的不同代码

git_branch3

(3)、切换master主分支合并dev分支

分支快速合并
git merge 分支名

效果动画: git_branch4

稍微需要留意的是,现在的主分支masterdev分支的合并,属于快速合并,简单来说,就是直接将master的指针移动到了dev分支指向的内容上。

快速合并动画演示: git_branch5

分支no-ff合并

命令格式:

git merge --no-ff [-m '注释']

同样的流程,我们在bugfix分支再进行一次操作,看一下区别:

首先,bugfix分支与master分支同步 -w773

bugfix分支上提交修改 git_branch6 -w699

上面代码的动画执行步骤,应该是下面这个样子: git_branch7

使用 --no-ff 参数进行merge合并 git_branch8

观察动画演示和之前快速合并的区别: git_branch9

从动画,以及最后合并之后显示的内容可以看出,快速合并其实只是将master的指针直接移动到了分支所新创建的版本上,而加上--no-ff参数之后,master分支会自己再创建一个新的版本

6、rebase进行分支合并

除了可以使用merge进行分支合并之外,还可以使用rebase进行分支合并,与merge合并最大的不同是,rebase会将合入分支上超前的节点在待合入分支上重新提交一遍,从而形成一条线性提交的线。用代码进行测试

(1)、切换到dev分支,合并master分支内容,并进行两次提交

-w1225

(2)、使用rebase进行合并

命令格式:

git rebase 分支名

-w800

从这里可能不能太看出区别,可以使用下面的命令,进行观察

git log --graph --pretty=oneline --abbrev-commit

这段代码的意思是使用简单的图像化方式显示提交日志

-w748

* 号显示的分叉可以看出,之前使用merge的合并,其实都保留的有分支提交的分叉记录,而使用rebase合并,并没有保存之前的分支的分叉提交,相当于,master主分支把最后这两个在dev分支上的提交又再次进行了提交,这样让这个版本记录看起来更加整洁。

下面是动画演示上面代码的过程: git_branch10

7、删除分支

使用命令:

git branch -d 分支名

-w822

8、分支远程推送

git push origin 分支名

-w569

其实和推送主分支没啥区别,到github网站上看一下 -w1030

分支冲突

分支冲突,和之前的版本冲突其实是一个道理,只不过之前是由于从远程pull下来的代码和本地版本不一致导致的冲突。而分支冲突,是由于两个分支之间修改了同一文件,而导致的分支之间的版本不一致所出现的冲突。其实归根结底,就是操作同一文件所产生的冲突。

和版本冲突一样,如果出现了冲突,在merge时,就会出现下面的代码

在符号
<<<<<<< HEAD

=======
中间的代码,是我们自己本地版本的代码

在符号
=======

>>>>>>> origin/master
中间的代码,是远程仓库拉取下来的代码

解决办法也一样,经过商量以后,删除多余的内容,保留需要的内容,再重新提交就可以了。 下面是具体产生冲突的场景:

比如,master分支与dev分支都修改了users.html页面,同时都进行了版本提交,当master分支合并dev分支的时候就会出现冲突

dev分支users.html:

......
<style>
    body{
        background-color: #FFB6C1;
    }
</style>
</head>
<body>
    <h2>用户列表</h2>
</body>
......

master分支users.html:

......
<style>
    body{
        background-color: #008c8c;
        font-size: 14px;
    }
</style>
</head>
<body>
    <h2>用户详情列表</h2>
</body>
......

执行合并

-w537

master分支合并之后是下面这个样子 -w1174

经过讨论,保留了master分支对样式的修改,以及dev分支页面内容的修改 -w950

解决冲突之后,文件的状态: -w1232

最后再重新提交一下就可以了

本文链接:http://www.yanhongzhi.com/post/git-5.html

-- EOF --

Comments