分支
什么是分支?
在git中,分支是指向单个commit(提交)的一个指针。git项目中,有个默认主分支master和其他的develop分支。master分支表示这个项目的稳定发布版本,而develop则是这个项目的贡献者们提交给项目的未发布的开发者版本。只有被认可后,develop中的分支可以合并到主分支master中,成为项目需要发布的一部分。到最终项目发布,需要的就是主分支master中的代码。
为什么在git中使用分支
git中的分支实际上仅是一个包含所指向对象校验和的文件,创建和撤销非常廉价。
理解分支
- 首先,假设在工作目录中有三个文件,我们需要将其暂存提交
1 2
| git add README test.rb LICENSE2 git commit -m 'initial commit of my project'
|
一次提交后仓库里的数据如下图所示:
![一次提交后仓库里的数据]()
两次提交后,仓库历史会变成如图所示:
![多次提交后的 Git 对象数据]()
Git中的分支,其实是指向commit对象的可变指针,git会使用master作为分支的默认名字,每次提交,master分支指针都会自动指向最新的提交对象。
![指向提交数据历史的分支]](指向提交数据历史的分支.png)
- 其次,创建分支
git保存有一个名为HEAD的指针,它是指向你正在工作中的本地分支
1 2 3 4 5 6 7 8 9
| git branch testing #创建一个分支 git checkout testing #进入创建的这个分支中工作,使其成为工作目录,指针HEAD则指向当前这个分支 #在test.rb分支中修改 vim test.rb git commit -a -m 'made a change' #此时,分支testing向前移动,而master分支仍然指向原来的commit对象 git checkout master #回到master分支,工作目录成为master,HEAD指针从新指向master分支 #在master分支中修改 vim test.rb git commit -a -m 'made a change' #此时,分支master向前移动,指针HEAD指向当前这个分支
|
- 然后,分支合并
创建分支都是为了主分支不被干扰,重启一个模块,测试成功后放入主分支中,成为主分支的一部分
1 2 3 4
| git checkout master #切换到主分支 git merge testing #将testing分支合并到主分支,此时,master分支和testing分支指向同一位置 #这时,完成了对主分支的更新 git branch -d testing #testing分支这时已经没有用,可以删除掉了
|
管理分支
1 2 3 4
| git branch #给出所有分支清单 git branch -v #查看各分支最后一次commit的情况 git branch --merged #筛选出已经合并的分支 已被并入的分支可以直接删除 git branch --no-merged #查看未合并的分支 删除分支会导致失败(可以使用git branch -D强制删除)
|
分支式工作流程
长期分支
可以创建多个等级的分支,每个等级的分支有不同的工作。这可以想象成流水线工作。
![流水线]()
比如,最高等级是master,作为主干分支,是最稳定的发布版本,也是最老旧的版本,它作为项目发布的分支。
第二等级是develop等级的分支,所有开发者的分支都合并到这个分支,作为测试分支,如果测试通过则合并到master分支中。
下一个等级的则是建议更新,它包含还没有成熟到可以进入master分支的内容,当其中的内容已经开发完成,只需要放入develop中进行测试,测试成功则进入master中。
特性分支
一个特性是指一个短期的,用来实现单一特性或者与其相关工作的分支。你可以把做出的改变保持在特性分支中几分钟,几天,等他们成熟后再合并。
远程分支
远程分支是对远程仓库的索引。远程分支就像书签,提醒你上次连接远程仓库时上面各分支的位置。
在本地工作的同时有人向远程仓库推送内容让提交历史发生分歧,我们可以运用git fetch origin来进行同步,将指针移动远程仓库中新的位置。
1 2
| git remote add origin http://xxxxxx #将远程仓库加入本地仓库,并命名别名 git fetch origin #将远程仓库与本地同步
|
1 2 3 4 5 6 7
| git push origin test #将本地的分支推送到远程仓库origin中,与人分享分支而一起开发 git push origin test:test #也可以取出我的test本地分支推送到远程的test分支 git push origin test:master #也可以取出我的test本地分支推送到远程的master分支 #协作者从服务器上获取数据时,会得到新的一个test分支,但是自己无法编辑与开发 git fetch origin git merge origin/test #这样才能将别人的分支合并到自己的当前分支 git checkout -b test origin/test #如果自己想要修改这个分支,可以自己在远程分支的基础上分化出一个新的test分支来开发,这回切换到新建的本地test分支(称为跟踪分支),与远程内容同步,你可以继续开发
|
- 跟踪分支
从远程分支检出的本地分支,称为跟踪分支,跟踪分支是一种和远程分支有直接联系的本地分支。
- 删除远程分支
1
| git push origin :test #直接删除远程分支,在这里提取空白然后把它直接变成远程分支
|
衍合
把一个分支整合到另一个分支的方法有merge(合并)和rebase(衍合)。
rebase可以把在一个分支里提交的改变在另一个分支里重放一遍。rebase能产生一个更为整洁的提交历史
1 2 3 4 5 6 7 8 9
| git checkout test #检出到test中 git rebase master #让test与master衍合,回到两个分支的共同祖先,提取所在分支每次提交时产生的差异,把差异分别保存到临时文件里,然后从当前分支转换到你需要衍合入的分支,依序使用每一个差异补丁文件 git rebase --onto master server client #检出client分支,找出client分支和server分支的共同祖先之后的变化,然后把他们在master重演一遍。 #与下面的过程表示的意思一样 git checkout master #检出到master git merge client #将client合并 git rebase master server #将server衍合 git checkout master #检出到master git merge server #将server合并
|