分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立即提交,由于代码还没写完,不完整的代码库会导制别人不能干活。如果等全部写无再一次提交,又存在丢失每天进进度的巨大风险。有了分支,就可以创建一个属于你自已的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活。
创建和合并分支
一开始的时候,master分支是一条经,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点。
当我们创建新的分支,例如dev时,Git新建一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上。
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
当Git无法自动合并会支时,就必须首先解决冲突。合并完成后,可以用git log --graph命令可以看到分支合并图。
分支策略
在实际开发中,我们应该按照几个基本原则进行分支管理。
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
干活都在dev分支上,每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以。
合并分支时,另上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出曾经做过合并,而fast forward合并就看不出来曾经做过合并。
Bug分支
当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,当前正在dev上进行的工作还没有提交。并不是你不想提交,而是工作只进行到一半,还没有办法提交,但是bug需要快速修复,怎么办?
Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作。现在,用git status查看工作区,就是干净的,因此可以放心创建分支来修复bug。
当完成bug修复后,可以恢复stash内容,有两种方法:
(1)用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除
(2)git stash pop,恢复的同时把stash内容也删了。
你可以多冷饮stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:
git stash apply stash@{0}
Feature分支
添加一个新功能时,肯定不希望因为一些实验性质的代码,把主分支搞乱,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。
多人协作
当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。要查看远程库的信息,用git remote, 或者,用git remote -v显示更详细的信息,如果没有推送权限,就看不到push的地址。
推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,需要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:
$ git push origin master
如果要推送其也分支,比如dev,就改成:
$ git push origin dev
但是,并不是一定要把本地分支远程推送,那么,哪些分支需要推送,哪些不需要呢?
(1)master分支是主分支,因此要时刻与远程同步。
(2)dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步
(3)bug分支只用于本地修复bug,就没必要推送到远程也,除非老板要看看你每周到底修复了几个bug
(4)feature分支是否推送到远程,取决于你是否和你的小伙伴合作在上面开发。
抓取分支
当你的小伙伴从远程库clone时,默认情况下,你的小伙伴只能看到本地的master分支。可以用git branch命令看看。
现在,你的小伙伴要在dev分支上开发,就必须创建远程origin的dev分支到本地
$ git checkout -b dev origin/dev
因此,多人协作的工作模式通常是这样:
(1)首先,可以试图用git push origin branch-name推送自己的修改。
(2)如果推送失败,则因为远程分支比你的本地更新,需要git pull试图合并
(3)如果合并有冲突,则解决冲突,并在本地提交。
(4)没有冲突或者解决冲突后,再用git push origin branch-name推送就能成功。
如果git pull提示“no tracking information”则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name orgin/branch-name
新建远程分支
1、新建一个本地分支
$ git checkout -b dbg_lichen_star
2、查看一下现在的分支状态
$ git branch
* dbg_lichen_star
master
星号(*)表示当前所在分支,现在的状态是成功创建的新的分支并且已经切换到新分支上。
把新建的本地分支push到远程服务器,远程分支与本地分支同名(当然可以随意起名)
$ git push origin dbg_lichen_star:dbg_lichen_star
最后欢迎大家访问我的个人网站:1024s