分支管理是Git支持多人协作和版本控制的关键,参照廖雪峰对Git的介绍,对真实开发环境中Git的使用结合实践进行梳理。

摘自:廖雪峰的官方网站

在实际开发中,我们应该按照几个基本原则进行分支管理:

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;

你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

所以,团队合作的分支看起来就像这样:

在看具体实践前,需要了解一些理论概念,参考创建与合并分支

  (1)HEAD指针与分支间的关系:

    

  (2)分支合并的时候,默认采用Fast Forward模式,可称为“快进合并”,即将master直接指向dev的当前提交,如下图,但这种模式下,删除分支后,会丢掉分支信息:

    

    

  (3)no-ff模式,在合并的时候采用该模式,会新创建一个提交,并将master指向该最新提交。

    

1. 创建git工程

  (1)创建本地库:执行命令 git init ,创建 .git隐藏文件

  (2)本地库关联远程仓库:用github对工程进行托管,具体可参照添加远程库,为本地库添加远程仓库信息

  创建完成后,本地工程如下:

2. 开发过程

  假设有2名开发,bob和lilei。

  (1)创建开发分支dev

    git checkout -b dev,此时该分支还属于私人分支。

    git push origin dev:dev,远程仓库创建dev分支,并与本地关联。

    git checkout dev   切换分支(切之前,可以先执行 git pull  拉去分支信息)。

  (2)对index.html文件进行修改,bob添加“add by bob”,提交到远程仓库,具体指令参照Git常用命令

  (3)lilei拉取最新代码,并进行修改,在index.html中添加“add by lilei”

    ① git fetch origin dev    拉去dev分支最新代码

    ② git merge --no-ff -m '合并最新代码' dev      采用no-ff方式,将拉取的最新代码与本地合并,注意:不加 -m后边参数,会打开编辑器,输入注解

    ③ 在index.html中添加“add by lilei”,提交并push到远程仓库

    

  (4)bob拉取最新代码,并将dev分支合并到master分支

    ① git pull origin dev   直接pull,代替fetch+merge操作,默认采用Fast-Forward模式合并。(此处应该采用(3)先fetch,再merge,分支结构更明显)

      

    ② git checkout master   切到主分支

    ③  git merge --no-ff -m 'merge with no-ff' dev 或者 git merge dev,会对dev和master进行合并提交

      

    ④ git push origin  将合并后的主分支同步到远程仓库

3. 分支结构

  (1)采用no-ff模式

  执行命令: git log --graph --pretty=oneline --abbrev-commit  查看分支图形结构,如下:

  

  ① bob在dev的本地分支上修改文件,并提交到远程仓库。

  ② lilei本地拉取最新文件,并采用 no-ff方式进行合并(新创建一个提交,从而是dev分支的HEAD指针指向新提交)

  ③ lilei修改文件,并提交到远程仓库。bob直接pull拉取,默认采用Fast-Forward模式。

  ④ bob将dev合并到master分支,执行命令 git merge --no-ff -m 'merge with no-ff' dev

  在github上查看最后一次提交,其中本次提交有2个parent(4f368cc和5b53028),与上图对应,如下:

  

  (2)采用Fast Forward模式

  

  ① 第一种模式最后一次提交。

  ② bob将修改提交远程仓库。lilei从远程仓库直接pull拉取合并,采用Fast Forward方式,没有产生新的提交。

  ③ lilei将修改提交远程仓库。bob拉取远程仓库后合并(fetch+merge),采用Fast Forward模式,没产生新的提交。

  ④ 切换到master分支,执行 git merge dev  合并。

4. 合并冲突解决

  遇到冲突时,Git已经做了合并,但是没有自动地创建一个新的合并提交。 Git会暂停下来,等待你去解决合并产生的冲突,然后再对冲突的文件执行提交(add、commit、push)即可。

  具体做法参考:Git 分支 - 分支的新建与合并

Git分支创建与合并的更多相关文章

  1. git分支与主干合并操作

    git分支与主干合并操作1.主干合并分支在主干上合并分支 branch (master)git merge branch --squash 提交合并后的代码 (master)git commit -m ...

  2. 史上最直接小白式的Sourcetree的分支创建与合并

    一.Sourcetree简单介绍通过Git可以进行对项目的版本管理,但是如果直接使用Git的软件会比较麻烦,因为是通过一条一条命令进行操作的. Sourcetree则可以与Git结合,提供图形界面,使 ...

  3. GitHub 的分支创建与合并

    一个Git仓库可以维护很多开发分支.现在我们来创建一个新的叫"experimental"的分支: $ git branch experimental 如果你运行下面这条命令: $ ...

  4. Git 分支创建

    分支策略:git上始终保持两个分支,master分支与develop分支.master分支主要用于发布时使用,而develop分支主要用于开发使用. 创建master的分支developgit che ...

  5. git 分支建立及合并

    分支的新建与合并 让我们来看一个简单的分支新建与分支合并的例子,实际工作中你可能会用到类似的工作流. 你将经历如下步骤: 开发某个网站. 为实现某个新的需求,创建一个分支. 在这个分支上开展工作. 正 ...

  6. git分支创建与切换

    1. 场景描述 新版本迭代上线完成,为了保持当前版本稳定性及可回退等需求,需要切换新的分支用于下一版本的迭代开发. 2. 解决方案 2.1 切换前工作. 因发布上线当天有可能存在临时更改文件而未上传g ...

  7. Git分支管理及合并

    Git分支管理   建立分支 git branch [name]   切换到分支 git checkout [name]   查看有哪些分支 git branch   比较分支 git diff [b ...

  8. SVN分支创建与合并

    SVN分支 一个branch是某个development line(通常是主线也即trunk)的一个拷贝,branch存在的意义在于,在不干扰trunk的情况下,和trunk并行开发,待开发结束后合并 ...

  9. Git:创建与合并分支

    1.1创建dev分支,使用命令符 git branch 分支名称. 1.2将HEAD指针切换到dev分支,使用命名符git checkout 分支名称. 注:创建并且转移可以合并为一个步骤,使用命令符 ...

随机推荐

  1. 【一天一道LeetCode】#118. Pascal's Triangle

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given n ...

  2. Android项目-高考作文功能简介(一)

    前言 :  开发安卓也已2年多了近3年了, 在自己刚入行的时候就有自己独立开发一个App的想法. 后来自己做了<<高考作文>>这一App. 后面续续断断的维护者. 也因为功能简 ...

  3. 海量数据挖掘MMDS week5: 聚类clustering

    http://blog.csdn.net/pipisorry/article/details/49427989 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...

  4. 02_Weblogic课程之安装篇:RedHat下JDK安装,RedHat下Weblogic安装,目录结构,环境变量设置

     1  Weblogic的安装方式有三种: 一.GUI方式安装    (java –jar wls1035_generic.jar [-mode=gui])这是默认的 二.Console方式安装  ...

  5. 导航控制器&nbsp;UI_08(上)

    主要内容:UINavigationController 重要:属性传值(向后一个界面传值).代理传值(向前相邻的界面传值).单例传值(不相邻的界面向前传值) 1.UINavigationControl ...

  6. Zookeeper实现master选举

    使用场景         有一个向外提供的服务,服务必须7*24小时提供服务,不能有单点故障.所以采用集群的方式,采用master.slave的结构.一台主机多台备机.主机向外提供服务,备机负责监听主 ...

  7. (十二)UITableView的基本使用

    UITableView之所以支持滚动,是因为继承自UIScrollView.默认是垂直滚动,性能极佳. UITableView的两种样式: 1.UITableViewStylePlain       ...

  8. Makefile学习(三)[第二版]

    make常用内嵌函数 1.函数调用 $(function arguments) #$引用的结果就是函数生成的结果 2.Makefile下常用的函数 1)$(wildcard PATTERN) #匹配当 ...

  9. 【生活随笔】Introspection of my life in 2014

       2014年已过去两星期,有写年度总结的必要了.今天特意看了看去年1月5日写的2013年度总结,看看都有些什么变化.我发现每年作一次总结是很有必要的,无赖恰逢考试周,连元旦都不能好好过,更不用说写 ...

  10. how tomcat works读书笔记 七 日志记录器

    大家可以松一口气了,这个组件比较简单,这一节和前面几节想比,也简单的多. Logger接口 Tomcat中的日志记录器都必须实现org.apache.catalina.Logger接口. packag ...