目录
  1. 1. 分支
    1. 1.1. 什么是分支?
    2. 1.2. 为什么在git中使用分支
    3. 1.3. 理解分支
    4. 1.4. 管理分支
    5. 1.5. 分支式工作流程
      1. 1.5.1. 长期分支
      2. 1.5.2. 特性分支
      3. 1.5.3. 远程分支
    6. 1.6. 衍合
学习Git-金丹

分支

什么是分支?

在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 #将远程仓库与本地同步
  • 推送
    如果要想和其他人分享某个分支(test)
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合并
  • 注意
    永远不要衍合那些已经推送到公共仓库的更新
文章作者: rack-leen
文章链接: http://yoursite.com/2019/05/01/Git/%E5%AD%A6%E4%B9%A0Git/%E5%AD%A6%E4%B9%A0Git-%E9%87%91%E4%B8%B9/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 rack-leen's blog
打赏
  • 微信
  • 支付宝

评论