前言
分支的位置和查看
示意图
在Git空间示意图中可见,工作区(work directory)对应的版本库中(repository)保存着暂存区(Stage),而版本库中除了暂存区中之外,主要的功能就是保留着各分支信息;
每个版本库在创建的时候默认生成一个主分支,默认命名master;
命令行
使用命令查看branch相关的信息;
git branch #查看本地分支列表
git branch -v #查看本地分支列表以及分支相关的提交信息
git branch -vv #比-v增加了各分支对应的远程分支名称
git branch -r #查看远程分支
git branch -a #查看所有分支(本地+远程)
上述命令行查询列表中名称前有 * 号标示的为当前分支;
本地创建分支
命令行
git checkout -b newBranchName
如上述,创建并且切换到了本地分支testBranch;
通过对比可以发现,上述方法创建的本地分支版本跟执行创建分支命令时所在的分支版本一致;
即在A分支上执行创建分支,新创建的分支版本就是A分支的版本;
设置关联远程分支
有个注意点是,在本地创建分支时,新建的本地分支没有远程分支的关联信息,也就是默认的远程关联分支,会导致我们在执行push或者pull/fetch时出问题,如图所示:
此时需要手动关联远程分支
git branch --set-upstream localBranch origin/remoteBranch
特别注意
有个细节需要注意一下;就是push命令中的“-u”参数,
我们在创建本地主分支master时,使用这个参数,这个参数会自动帮我们关联上当时推送至的远程分支;
而上述案例中我们新创建的分支testbranch,未操作过推送,也就没有对应的远程分支;
这时会以下几个情况:
1、推送独立的远程分支;
2、关联现有的远程分支;
下面做个案例:
1、这是一个初始化本地库,提交了初始版本
显示目前仅有主分支master,并且主分支没有远程分之的关联;
2、然后关联远程库:
查看还是没有远程分支关联;
3、“-u”推送
可以看到,在进行“-u”推送之后,远程库新建了分支master并且本地有对应的关联关系;
4、本地新建分支testbranch1并执行普通推送:
如图所示,如果新建本地分支进行普通推送,会在远程创建对应名称的远程分支,但是本地分支还是没有远程分支的关联;
5、新建分支testbranch2,”-u”推送至独立的远程分支;
综上所述:
本地分支在执行过“git push -u origin branchname”之后会自动绑定远程分支关联关系;
如果仅执行“git push origin branchname”,虽然不影响远程分支的创建,但是不能正常的push/pull,需要手动设置关联;
.
同时,本地分支跟远程分支的对应模型是多对一的形式,本地分支可以灵活的切换远程分支的对应关系;
从远程创建本地分支
上述创建方法是根据本地版本为基础创建的本地分支;而实际使用当中我们可能经常需要使用某个远程版本,也就是克隆远程版本库;
创建本地库主分支
命令行
执行命令
git clone git@code.aliyun.com:mikelc7/aliuyunGitDemo.git
执行成功后在操作目录生成一个远程项目的目录;
然后查看分支情况:本地新建一个分支master,并且本地默认分支master默认与远程分支master关联;
修改README.md文件测试
操作正常,确认远程库:
操作无误;
创建指定远程分支的本地分支
命令行
git checkout -b local-branchname origin/remote_branchname
本地根据目前远程分之testbranch13的版本创建了本地分支localclonebranch;并且有相对应的关联关系;
创建远程分支
远程分支的创建有大概两种:
1、在远程库上直接操作创建分支;
2、在本地终端通过推送的形式创建远程分支;
以下记录的是如何通过本地终端创建远程分支:
在本地终端向远程库推送时,实际上是以分支为载体,也就是说每次推送都有是推送localBranch to remoteBranch,
此时,如果远程没有所指定的remoteBranch则会默认自动创建;
命令行
git push origin testBranch:remoteBranch
上述命令我们使用中如果没有冒号后面的remoteBranch参数,则按照本地分支的名称自动匹配远程分支;
查看当前所有分支;
新建并且将分支testbranch3推送至远程分支testbranch13上;
如上所示,远程分支成功创建;
创建远程分支并创建关联
如上所述,如果这么操作则需要手动添加关联;加上“-u”参数则会自动生成关联;
testbranch4 -> testbranch14
git push -u origin testBranch:remoteBranch
分支的切换
本地分支的切换
即本地库HEAD指针的切换;
用于切换当前操作分支
git checkout branchname
本地分支对应远程分支的切换
git branch --set-upstream debug origin/debug
分支的删除
删除本地分支
git branch -D localBranch
删除远程分支
git push remoteRepository --delete remoteBranch
或者
git push remoteRepository :remoteBranch
“origin”远程库解析
出现的命令行
在上述内容中出现多次关键字“origin”;
git remote add origin git@code.aliyun.com:mikelc7/aliyunGitDemo.git
git branch --set-upstream localBranch origin/remoteBranch
git checkout -b local-branchname origin/remote_branchname
git push origin testBranch:remoteBranch
关键字“origin”其实是我们对远程库设置的一个别名的概念;
而同一个本地库可以通过区分别名实现同时关联多个远程库,
上述的命令中:
git remote add origin git@code.aliyun.com:mikelc7/aliyunGitDemo.git
是在添加远程库链接”git@code.aliyun.com:mikelc7/aliyunGitDemo.git
“设置了别名“origin”;
git branch --set-upstream localBranch origin/remoteBranch
为localBranch设置的远程分支为远程库“origin”中的远程分支“remoteBranch”;
git checkout -b local-branchname origin/remote_branchname
意为以远程库“origin”的远程分支“remote_branchname”创建本地分支“local-branchname”;
git push origin testBranch:remoteBranch
而这条命令则显然是推送本地分支“testBranch”至远程库“origin”的远程分之“remoteBranch”上;
案例解析
初始状态:单个远程库
目前只关联了一个远程库“origin”(aliyunGitDemo.git),
且本地只有分支master对应其远程分之master(origin/master);
新增远程库并关联
添加远程库“git@code.aliyun.com:mikelc7/aliyunGitDemo2.git”并设置别名为“origin_2”;
查看远程库“origin_2”确认远程库链接正常(因为只初始化了库,并没有提交,所以远程库暂时没有分支信息)
新建本地分支并推送至新建远程库
新建本地分支
推送至新建远程库
由上图可见,以将本地分支dev推送至远程库“origin_2”的远程分支“master”上并进行了关联;
验证:推送内容
成功!
切换本地分支对应的远程库和远程分支
其实和上述的切换远程分支是一个命令:
git branch --set-upstream localBranch origin/remoteBranch
只不过我们要定义“origin”字段;
例如我们将下面本地分支master的远程切换为“origin_2/master”,即切换为远程库“origin_2”上的远程分支master;
验证:推送内容
验证成功!
后记
上述中的git push命令中写的有些多余;
因为我们在为本地分支设置upstream为指定目标远程分支之后在推送时可以直接使用“git push”命令进行推送,而不需要通过“git push originName localBranch:remoteBranch”格式的命令在每次推送时指定远程库和远程分支;