1.分支管理概述

系统上线了,但是产品经理又提了新的需求,评估一下工期要两个月,但是同时系统正在上线运行,时不时还要修改bug,如何管理几个版本?

版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。有人把 Git 的分支模型称为"必杀技特性",而正是因为它,将 Git 从版本控制系统家族里区分出来。
GIT专题(五)-GIT分支管理_工作区

2.1.创建合并分支

在我们每次的提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD指针严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。
一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:
GIT专题(五)-GIT分支管理_工作区_02
每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。
当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:
GIT专题(五)-GIT分支管理_分支合并_03
GIT专题(五)-GIT分支管理_工作区_04

你看,Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!

不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:
GIT专题(五)-GIT分支管理_git_05
假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:
GIT专题(五)-GIT分支管理_工作区_06
所以Git合并分支也很快!就改改指针,工作区内容也不变!

合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:
GIT专题(五)-GIT分支管理_分支合并_07

3.使用GitBash实现分支管理

3.1.查看当前分支

  • git branch
    列出分支,没有参数时,git branch 会列出你在本地的分支
    GIT专题(五)-GIT分支管理_git_08

3.2.创建新的分支

GIT专题(五)-GIT分支管理_分支合并_09
创建分支:git branch bugbran
GIT专题(五)-GIT分支管理_git_10

3.3.切换分支

GIT专题(五)-GIT分支管理_分支合并_11

  • git checkout 分支名字
    GIT专题(五)-GIT分支管理_分支合并_12

3.4.分支合并到主分支(先切换到主分支,然后合并)

GIT专题(五)-GIT分支管理_git_13
GIT专题(五)-GIT分支管理_git_14
GIT专题(五)-GIT分支管理_分支合并_15

3.5.冲突

冲突一般指同一个文件同一位置的代码,在两种版本合并时版本管理软件无法判断到底应该保留哪个版本,因此会提示该文件发生冲突,需要程序员来手工判断解决冲突。
GIT专题(五)-GIT分支管理_工作区_16

  • 合并时冲突
    GIT专题(五)-GIT分支管理_工作区_17
  • 解决方案:
    此时通过git diff 可以找到发生冲突的文件及冲突的内容。
    GIT专题(五)-GIT分支管理_git_18
    然后修改冲突文件的内容,再次git add 和git commit 提交后,后缀MERGING消失,说明冲突解决完成。

3.6 删除分支

git branch -d (branchname) 删除的时候会提示 是否删除还没被合并的分支??

注意不能删除当前所在分支,需要转到别的分支上。
如果要删除的分支已经成功合并到当前分支,删除分支的操作会直接成功。
如果要删除的分支没有合并到当前所在分支,则会出现提示,如果确定无须合并而要直接删除,则执行命令:

git branch -D (branchname) 强制删除分支不提示

4.使用TortoiseGit实现分支管理

使用TortoiseGit管理分支就很简单了。

4.1.创建分支

在本地仓库文件夹中点击右键,然后从菜单中选择“创建分支”:
GIT专题(五)-GIT分支管理_分支合并_19GIT专题(五)-GIT分支管理_分支合并_20
GIT专题(五)-GIT分支管理_工作区_21
如果想创建完毕后直接切换到新分支可以勾选“切换到新分支”选项或者从菜单中选择“切换/检出”来切换分支:
GIT专题(五)-GIT分支管理_git_22

4.2.合并分支

分支切换到dev后就可以对工作区的文件进行修改,然后提交到dev分支原理的master分支不受影响。例如我们修改mytest.txt中的内容,然后提交到dev分支。
GIT专题(五)-GIT分支管理_工作区_23
GIT专题(五)-GIT分支管理_工作区_24
切换到master分支后还是原理的内容:
GIT专题(五)-GIT分支管理_分支合并_25
GIT专题(五)-GIT分支管理_git_26
GIT专题(五)-GIT分支管理_分支合并_27
将dev分支的内容合并到master分支,当前分支为master。从右键菜单中选择“合并”:
GIT专题(五)-GIT分支管理_git_28
GIT专题(五)-GIT分支管理_工作区_29
再查看内容就已经更新了:
GIT专题(五)-GIT分支管理_git_30

4.3.解决冲突

两个分支中编辑的内容都是相互独立互不干扰的,那么如果在两个分支中都对同一个文件进行编辑,然后再合并,就有可能会出现冲突。
例如在master分支中对mytest.txt进行编辑:
GIT专题(五)-GIT分支管理_工作区_31
切换到dev分支,对mytest.txt进行编辑:
GIT专题(五)-GIT分支管理_分支合并_32
最后进行分支合并,例如将dev分支合并到master分支。需要先切换到master分支然后进行分支合并。
GIT专题(五)-GIT分支管理_git_33
GIT专题(五)-GIT分支管理_工作区_34
出现版本冲突。
GIT专题(五)-GIT分支管理_git_35
GIT专题(五)-GIT分支管理_git_36
冲突需要手动解决。
GIT专题(五)-GIT分支管理_git_37
在冲突文件上单机右键选择“解决冲突”菜单项:
GIT专题(五)-GIT分支管理_工作区_38
GIT专题(五)-GIT分支管理_工作区_39
GIT专题(五)-GIT分支管理_git_40
把冲突解决完毕的文件提交到版本库就可以了。