图解Git对于分支的操作

699 阅读4分钟

一般情况下我们的git仓库会有多个分支,主分支就是master,在我看来大多数时候其余分支是用于保护主分支不被无意破坏。

1,什么是分支

我们知道,git每执行一次commit命令,就会把当前文件状态保存为快照存在仓库中。

分支就是为了将修改记录的整体流程分叉保存,每个分支不受其他分支的影响。

例如某个仓库进行了3次commit操作,可能如下图所示:

原仓库

图中黑色矩形框代表我们每一次进行的commit生成的快照,蓝色圆角矩形框代表分支,紫色椭圆框代表头指针

可见这个仓库只有一个master分支,头指针指向我们当前正在操作的分支。

2,新建分支

有两个命令实现新建分支。

新建分支但仍然使用当前分支:

git branch 新分支名

新建分支并切换到新分支:

git checkout -b 新分支名

例如新建分支dev

git branch dev

那么上述仓库就会变成这样:

新建dev分支

新分支一般会以当前最新快照为起点建立。

3,切换分支

上述的checkout -b 分支名可以直接新建分支并切换至新分支,当然直接切换分支也很简单:

git checkout 分支名

使用checkout命令即可。

还是上述仓库,切换到dev分支:

切换到dev

这样当前分支切换到了dev

接下来我们进行开发并做了一次提交,又会变成什么样呢?如下图:

在dev上更改并提交

4,融合分支

可以使用下列命令将指定分支融合至当前分支

git merge 指定融合分支

我们在dev分支开发完毕了一个版本,想将其融合到master,那就先切换至master分支再使用merge命令进行融合:

git checkout master
git merge dev

上述仓库融合后如下:

融合dev至master

假设你的仓库有对应的远程仓库,将dev融合到master之后,还需要将master也推送上去哦!

git push xxx master

xxx表示你的远程仓库别名。

5,查看当前仓库分支

这个就简单了。

查看当前仓库本地分支:

git branch

查看当前仓库远程分支:

git branch -r

查看当前仓库所有分支(本地+远程):

git branch -a

6,将本地分支和远程分支建立追踪关系

我们git clone下来的仓库默认只克隆了其中的master分支。不过要对远程仓库已有的dev分支进行开发怎么办呢?方法其实很多,下面来一一说明。

(1) 克隆时指定分支

git clone命令后面加上-b参数指定分支即可,例如克隆某仓库dev分支:

git clone -b dev 仓库地址

(2) 新建本地分支dev并和远程仓库的dev分支建立追踪关系

例如我刚克隆下来的一个仓库,首先查看所有分支:

git branch -a

image.png

可见本地只有一个master分支,但是远程分支除了master还有一个dev分支。

通过git branch命令新建本地dev分支并和远程dev分支建立追踪关系:

git branch dev
git branch --set-upstream-to=remotes/origin/dev dev

重点是这个命令将本地分支和远程分支建立追踪关系:

git branch --set-upstream-to=远程分支名 本地分支名

然后再使用checkout命令切换至dev分支即可开始开发,然后git push xxx devdev分支变动提交至远程仓库,xxx更换为自己的仓库别名。

其实还有一个更加简单的方法,使用checkout命令即可新建一个本地分支并切换至新建的分支,同时将这个分支和指定远程分支建立追踪关系:

git checkout -b 本地分支名 远程分支名

例如上述仓库一克隆下来我们其实只要执行这一句:

git checkout -b dev remotes/origin/dev

这个命令会直接实现在本地建立了dev分支并切换上去,并和远程dev分支建立追踪关系,一步到位。

可见git branch --set-upstream-to=命令用于手动建立现有本地分支和远程分支追踪关系,而git checkout -b命令则是新建、切换、追踪一步到位。这两个命令大家视情况使用。

还有一种情况是,本地新建了一个dev分支,但是远程仓库没有这个dev分支,怎么办呢?其实直接把dev分支push上去即可,本地推送的分支若远程仓库中不存在,远程仓库会自动创建

7,删除分支

删除分支其实很简单,不过是很危险的操作,请谨慎使用!

删除本地分支:

git branch -d 分支名

删除远程分支:

git branch -dr 远程分支名