zoukankan      html  css  js  c++  java
  • git如何使用

      Git是分布式的,但多数时候仍然要使用中央仓库作为所有开发者的交互中心,和svn一样,开发人员仍要在本地写代码并提交到中央服务器。Git相较于svn最大的优势就在于其强大的分支系统,而git的工作流程配合其强大的分支系统,可以说几乎完美的契合了敏捷开发的要求。任何事情都一样,有一个明确的管理规范,做事情才能有条理,git使用这个事情,Vincent Driessen同学提出了这么一套理论:http://nvie.com/posts/a-successful-git-branching-model,文章的翻译版本:http://www.cnblogs.com/yaks/p/5666400.html。

      几个常用分支约定:

    •  Master分支:主干分支,一般用作生产分支
    •  Develop分支:开发分支,开发人员日常交互所用分支
    •  Release分支:发布分支,一般是打包给测试人员的分支
    •  Feature分支:功能分支,开发人员在本地为某个功能而建立的分支
    •  Hotfix分支:热修复分支,生产出现问题,临时修复bug所用的分支

      各个分支如何协同工作:

      Master是线上版本,所有的提交都应该打tag,并记录修改内容;Release、develop跟feature分支:

      

      Develop分支是从master分支检出的,开发人员自己本地具体的feature分支是开发人员在自己本地建立的(过程2跟3),命名一般是自己名字或者功能名字之类,如果该功能跟其它开发人员无关,一般不建议推送服务器(开发人员多的时候,看上去太乱)。开发人员完成功能(也可能没完成功能,每天下班提交代码),提交到develop分支(过程4),有功能开发完毕,需要打包给测试人员,我们需要从develop分支检出一个分支release(过程5),其它功能仍然正常提交develop分支(过程6,开发分支仍然正常往下走),release分支进行测试,有bug直接在release进行修改,测试通过后,将改动合并到develop分支(过程8),如果该功能需要上线,则合并到master分支,上线。

      疑问1、为什么要在本地建一个feature分支?

      因为在开发一个新功能时,我们肯定不想把原来的代码给搞乱了,所以我们搞一个新的分支,开发完成后合并到开发分支。如果你觉得就喜欢在develop分支进行开发,保证不会因为搞乱代码之类的造成一些困扰,没问题,可以不要feature分支。

      疑问2、为啥打包的时候要独立出一个release分支,在原来的develop分支上打包进行测试不行么?

      不是说不行,是不好,比如说第一次打包develop0.1给测试人员,第二天经过测试后发现了几个bug,然后开发人员进行修复后提交到develop,重新打包develop0.2给测试人员,注意,这里提交代码的时候,可能其它的开发人员也提交了代码到develop分支,这些代码有可能对develop0.1测试的几个问题有影响!因此为了避免这种情况,单独打一个release分支出来,维持不变,develop继续提交。因此:一旦打了Release分支之后不要从Develop分支上合并新的改动到Release分支

      热修复分支用于线上发布版本的快速bug修复。它直接从master分支检出,修复测试完成后合并到master跟develop分支(过程9跟10)。为了bug修复使用专门分支,让团队可以处理掉问题而不用打断其它工作或者是等待下一个发布循环。

      具体使用(以eclipse的egit为例):

      1、上传项目到git

      Eclipsegit插件egit为例,项目右键---->share project---->勾选use or create repository in parent folder of project---->点击project下的复选框,然后点击create repository---->finish,然后项目右键---->team---->commit---->填写提交信息---->commit and push,url一栏填写资源库的url,插件会自动补齐host跟repository path,下方填写账号密码用于验证,然后finish就可以了。

      2、添加忽略文件

      跟svn一样,有一些配置文件之类的是我们不想提交到中央服务器的,因为每个人的配置都会不一样。添加忽略文件为:文件右键---->team---->ignore,会在本地生成一个名称为.ignore的文件,也可以手动修改该文件,把要忽略的文件路径添加进来。

      

      3、分支的新建、切换、删除

      在项目上右键---->team---->switch to可以进行新建分支或者切换分支,点击new branch进行新建分支,点击列表中的分支名称进行切换分支,切换后会看到项目名后的分支名称变化(图中蓝色框部分),删除分支在项目右键---->team---->advanced---->delete branch(只能删除非当前分支,需要切换到其它分支删除本分支)。

      

      4、本地的功能开发开发,分支合并,冲突解决以及提交

      两个用户同时检出dev分支,并以此为基础分别在本地新建分支feature1_branch,feature2_branch,项目有两个java文件,内容分别为:

    package test.gittest;
    public class A {
        public static void main(String[] args){
            System.out.println("aaaaaaaaaaaaa");
            System.out.println("aaaaaaaaaaaaa");
            System.out.println("aaaaaaaaaaaaa");
            System.out.println("aaaaaaaaaaaaa");
        }
    } 
    package test.gittest;
    public class App {
        public static void main( String[] args ){
            System.out.println( "Hello World!" );
        }
    }

      假设feature1_branch只改动了A.java,改动后内容如下(修改,新增各一行): 

    package test.gittest;
    public class A {
        public static void main(String[] args){
            System.out.println("aaaaaaaaaaaaa");
            System.out.println("aaaaaaaaaaaaa");
            System.out.println("aaaaaaaaaaaaa");
            System.out.println("aaaaaaaaaaaaa_feature1_branch修改");
            System.out.println("feature1_branch新增");
        }
    }

      feature1_branch在本分支本地提交,然后切换到dev分支,然后项目右键---->team---->merge,选择feature1_branch,可直接将代码merge到dev分支。然后项目右键team---->synchronize workspace进行本地跟中央库代码同步,双击,可以看到本地文件跟中央库文件的差别:

      

      没有冲突,点击上方的push图标,可以将本地修改push到远程仓库,或者项目右键---->team---->commit,选择commit and push推送远程。

      Feature2_branch改动A.java跟App.java如下:

    package test.gittest;
    public class A {
        public static void main(String[] args){
            System.out.println("aaaaaaaaaaaaa");
            System.out.println("aaaaaaaaaaaaa");
            System.out.println("aaaaaaaaaaaaa");
            System.out.println("aaaaaaaaaaaaa_feature2_branch修改");
            System.out.println("feature2_branch新增");
        }
    }
    package test.gittest;
    public class App {
        public static void main( String[] args ){
            System.out.println( "Hello World!" );
            System.out.println("feature2_branch新增2");
        }
    }

      同feature1_branch,右键跟中央库进行同步对比,结果如下:

      问题出现了,有冲突!

      1错误做法,错误做法,错误做法:先merge后synchronize

      类似于svn的做法,直接在本页面进行合并,并提交。找到feature1_branch的开发人员,沟通后合并代码,假设沟通后决定此例中第7行代码应该为System.out.println("aaaaaaaaaaaaa_feature1_branch修改_feature2_branch修改");第8行两者均需保留,则可以直接在此页面的左侧完成此修改,并直接右键commit and push或者直接点上方的push按钮推送到中央服务器。这种做法极不推荐,可以认为这种操作时不对的。这会覆盖掉服务器的上次提交,虽然本地代码提交了,服务器的代码也是正常的,但会导致他人更新时的一些冲突:feature1_branch的用户pull时报错:

      

      2、 正确做法:先synchronize后merge

      本地feature2_branch开发完成并本地commit后,切换到dev分支,先不要merge新的feature2_branch的内容到dev分支,先将dev跟远程synchronize一下看是否有差别,若有,进行pull,然后再把feature2_branch的改动merge进去。(同样,feature1_branchmerge前同样应该先synchronize)

      注意:在merge页面,merge options选择第三个,否则无法填写提交的备注信息。

      

      由于feature1_branch的内容先提交到dev分支,因此要先pull一下,再merge本地的feature2_branch,merge后会有冲突,提示如下:

      

      这时候右键---->team---->merge tools由灰色变成了亮色,点击merge tools进行合并:

      

      merge tools 提供的图形界面,可以比较方便的进行对比并修改代码,这是egit比git bash等命令行为数不多的优点之一。

      合并完后,右键文件---->add index---->项目右键---->team---->commit。不点add to index,不会纳入git管理,提交的时候列表中看不到这个文件。

      这种方式的提交,他人在更新代码的时候不会有冲突,会直接pull到正常的代码,无需本地合并。

      这个地方,跟svn的使用习惯略有不同(个人感觉是这样,不知大家怎么用svn),svn是synchronize,然后可以直接在synchronize这个视图进行代码合并,合并完成后把有冲突的标记为合并,然后就可以commit了,egit的话,经过尝试,这么搞不可以,它的synchronize视图功能比较弱,我们只是用来看一下是否有更新,有的话pull下来,然后本地merge即可,剩下的跟synchronize视图无关了。

      注意:1、提交后如果所建的分支feature1_branch,feature2_branch无用,最好删掉分支,保持服务分支的整洁。

           2、git提供了丰富的操作命令,我们也可以通过在命令行完成以上操作,且更加便捷(只有merge冲突的时候不够直观),但相对命令较多,不利于新手使用。建议可以采用gui跟命令相结合的方式来学习使用git;intellij idea也自带了git插件,并同时支持命令行操作(eclipse只能自己打开文件夹然后使用命令行操作),想要尝试的可以试一下。

  • 相关阅读:
    (33)ElasticSearch文档的核心元数据解析
    (32)ElasticSearch的容错机制
    (31)ElasticSearch水平扩容的过程
    (30)ElasticSearch两个节点环境中创建index解析
    (29)ElasticSearch分片和副本机制以及单节点环境中创建index解析
    UVA
    HDU
    ZOJ
    BZOJ1499: 瑰丽华尔兹(单调队列)
    UVALive
  • 原文地址:https://www.cnblogs.com/nevermorewang/p/6401428.html
Copyright © 2011-2022 走看看