一.理解分支
我们看下面这张图片:
在版本回退⾥,你已经知道,每次提交,Git都把它们串成⼀条时间线,这条时间线就可以理解为是⼀个分⽀。截⽌到⽬前,只有⼀条时间线,在Git⾥,这个分⽀叫主分⽀,即master分⽀
HEAD严格来说不是指向提交,⽽是指向master,master才是指向提交的,所以,HEAD指向的就是当前分⽀
二.创建分⽀
这里我们又要开始指令的学习了。
git branch 查看当前本地所有分⽀
如图:
git branch +name;//表示创建分支
我们这里就先创建dev1分支
注意:*表示为当前HEAD指向的分支
如图,我们可以发现master和dev1的指向相同,如图所示:
三.切换分⽀
git checkout +分支名;
下面我们切换到dev1分支:
*号在dev1上了,我们切换成功。
如图:
下面我们在dev1分支上新写一行内容,然后提交:
我们返回master分支,cat test文件:
发现没有新加的内容,如下图:
四.合并分⽀
为了在master主分⽀上能看到新的提交,就需要将 dev1 分⽀合并到 master 分⽀,操作如下:
我们用:
git merge +分支名//表示将分支合并到当前HEAD所在分支上
补充:
Fast-forward代表“快进模式”,也就是直接把master指向dev1的当前提交,所以合并速度⾮常快
五.删除分⽀
合并完成后,dev1分⽀对于我们来说就没⽤了,那么dev1分⽀就可以被删除掉
注意点:
1.如果当前正处于某分⽀下,就不能删除当前分⽀
2.如果该分支未进行过合并,不能用该指令删除
git branch -d +分支名;删除某分支
操作如下:
六.合并冲突
在实际分⽀合并的时候,并不是想合并就能合并成功的,有时候可能会遇到代码冲突的问题
补充知识;
git checkout -b +分支名;
//表示git branch +分支名 +git checkout +分支名
为了演示该操作,我们新建dev2分支,然后再dev2分支第一行后面+aaa,在master分支test文件第一行+bbb:
新建dev2分支,然后再dev2分支第一行后面+aaa:
在master分支test文件第一行+bbb:
现在情况如下图:
如果我们现在在master分支上合并:
就会出现以下错误
打开test文件,进行适当人为修改:
假如我们是要aaa,修改结果如下:
修改完成之后,我们需要再次提交即可,操作如下:
补充知识:
git log:
git log --graph --abbrev-commit;//表示视图查看修改情况
七.分⽀管理策略
通常合并分⽀时,如果可能,Git会采⽤ Fast forward 模式。还记得如果我们采⽤ Fast forward 模式之后,形成的合并结果是什么呢?
在Fast forward 模式下,删除分⽀后,查看分⽀历史时,会丢掉分⽀信息,看不出来最新提
交到底是merge进来的还是正常提交的。
但在合并冲突部分,我们也看到通过解决冲突问题,会再进⾏⼀次新的提交,该好处是,从分⽀历史上就可以看出分⽀信息。例如我们现在已经删除了在合并冲突部分创建的 dev2 分⽀,但依旧能看到master其实是由其他分⽀合并得到
Git⽀持我们强制禁⽤ Fast forward 模式,那么就会在merge时⽣成⼀个新的 commit ,这样,
从分⽀历史上就可以看出分⽀信息
指令:(举例)
git merge --no-ff -m "merge with no-ff" dev2
--no-ff 参数,表⽰禁⽤ Fast forward 模式。禁⽤ Fast forward 模式后合并会创建⼀个新的 commit ,所以加上 -m 参数,把描述写进去
所以在合并分⽀时,加上 --no-ff 参数就可以⽤普通模式合并,合并后的历史有分⽀,能看出来曾
经做过合并,⽽ fast forward 合并就看不出来曾经做过合并
八.分⽀策略
在实际开发中,我们应该按照⼏个基本原则进⾏分⽀管理:
1.master分⽀应该是⾮常稳定的,也就是仅⽤来发布新版本,平时不能在上⾯⼲活
2.dev分⽀是不稳定的,到某个时候,⽐如1.0版本发布时,再把dev分⽀合并到master上,在master分⽀发布1.0版本
九.bug分⽀
假如我们现在正在dev3分⽀上进⾏开发,开发到⼀半,突然发现 master 分⽀上⾯有bug,需要
解决。在Git中,每个bug都可以通过⼀个新的临时分⽀来修复,修复后,合并分⽀,然后将临时分⽀删除。
可现在 dev3的代码在⼯作区中开发了⼀半,还⽆法提交,怎么办?
git stash;
//将当前的⼯作区信息进⾏储藏,被储藏的内容可以在将来某个时间恢复出来
现在我们发现master分支存在问题,接下来我们要进行如下操作;
第一步:保存当前内容(注意:内容是在工作区未git add的)
第二步:回到master分支,然后新建修改分支,进行修改
第三步:将修改版本合并到master版本
第四步:回到dev3得到之前内容,继续工作
git stash list;
//查看stash中内容
git stash pop;
//恢复工作区
git stash apply stash@{0};
//恢复指定的stash
git stash apply;
//恢复工作区,但是stash中还有内容
git stash drop
//来删除stash中内容
第五步:dev3完成之后先将master合并到dev3上,在将dev3合并到master上(重点)
十.删除临时分⽀
指的是删除分支中的注意点2:该分支未进行过合并,不能用git branch -d删除
我们此时可以用-D强制删除
git branch -D +分支名
分支作用总结:
分⽀在实际中有什么⽤呢?假设你准备开发⼀个新功能,但是需要两周才能完成,第⼀周你写了50%的代码,如果⽴刻提交,由于代码还没写完,不完整的代码库会导致别⼈不能⼲活了。如果等代码全部写完再⼀次提交,⼜存在丢失每天进度的巨⼤⻛险。现在有了分⽀,就不⽤怕了。你创建了⼀个属于你⾃⼰的分⽀,别⼈看不到,还继续在原来的分⽀上正常⼯作,⽽你在⾃⼰的分⽀上⼲活,想提交就提交,直到开发完毕后,再⼀次性合并到原来的分⽀上,这样,既安全,⼜不影响别⼈⼯作。并且Git⽆论创建、切换和删除分⽀,Git在1秒钟之内就能完成!⽆论你的版本库是1个⽂件还是1万个⽂件
追后,感谢大家的支持 !!!