zoukankan      html  css  js  c++  java
  • 小团队git开发模式

    实验室要使用Git进行代码管理,但是git非常复杂,各种开发模式也是层出不穷。作为新手的偶们很是发囧啊!!网上搜了一下,发现很多并不适合我们小团队运作(它本身就是为Linux内核管理而开发的分布式代码管理工具)。关于分布式和集中式(svn)代码管理的区别大家可以自己去搜搜,这里就不多说了。

            网上找到的git的中文资料,大部分是讲git的命令的使用,对于git的工作流程和如何实现团队合作的介绍少之又少,特别是对于团队代码库管理者的文档,几乎没有。即便有也是上来就讲各种分支xxxx的,有点晕。这里将介绍一种最简单,最原始的如何使用git进行团队合作开发。

    模式简介

          下图就是简单小组的合作模式图:

     

     这种模式的开发流程如下:

    1、由其中一个开发者这服务器上建立一个数据库。 所有开发者都可以向数据库提交和下载东西,这里必须规定一定的时间间隔(一周或者一天)必须提交一次,不然以后解决冲突时是个大问题。 如果每个人的开发耦合度很高,我们可在服务器上建立分支,然后每人每次提交到自己的分支上,过一段时间之后(不能太久)有一个人去合并分支。然后所有 人更新自己的数据库的master分支,使之跟服务器上的master分支同步。
    2、这样服务器会有非常多的版本信息,集合了每个人的版本信息。过了一段时间之后,例如有里程碑的出现。再由一个人把所有改动打补丁到最终服务器上。这样最终服务器的版本信息就会很精练。
    3、当我们的服务器无限膨胀到一定程度的时候我们可以把它删除,然后用最终服务器上的一个版本作为起始版本。

    下面我们开始实践了

     1. git服务器的搭建

           如果使用git的人数较少,可以使用下面的步骤快速部署一个git服务器环境:

           http://www.haijd.NET/article/index.PHP?action=read&id=840

    最简单不加任何安全控制时,就是在服务器上安装一个.git,如下:

    $ cd /opt/git
    $ mkdir project.git
    $ cd project.git
    $ git –bare init

           其中,搭建服务器后,开发人员就可以把它加为远程仓库,推送一个分支,从而把第一个版本的工程上传到仓库里了。值得注意的是,每次添加一个新项目都需要通过 shell 登入主机并创建一个纯仓库。我们不妨以 wst 作为 git 服务器用户和仓库所在的主机名。那么以下这些命令都是可用的:

    # 在一个开发人员的电脑上

     $ cd myproject

     $ git init

     $ git add .                #这里选择你需要添加的文件

     $ git commit -m ‘initial commit’

     $ git remote add origin wst@192.168.88.46:/home/wst/wanghanbo/wireshark.git 

     $ git push origin master

    这样git服务器就有了第一个初始代码版本。

    2.开发人员提取代码

            下面各位其他的参与开发人员先安装git,再设置用户名与邮箱:

      git config --global user.name"My Name"

      git config --global user.email"my@email.co

             然后从代码库clone出代码:

    $ git clone

    wst@192.168.88.46:/home/wst/wanghanbo/wireshark.git

    这样,每位参与的组员也有了与代码库版本一致的第一份代码。

    3.开发中的操作

            现在,我们要开始进行开发了。可以参考

            http://blog.enjoyrails.com/2008/12/31/git%E4%B8%80%E5%88%86%E9%92%9F%E6%95%99%E7%A8%8B/

      首先我们来看如何更新本地代码到最新版本:

     第一种方法用fetch(需要merge才能合到本地代码中)

    git fetch origin master :temp
    git merge temp                                #合并更新到temp分支的代码到本地代码库的master分支中

    更新代码方式的另一种方法(git pull是git fetch和git merge命令的一个组合)

    git pull  origin master  

      解决代码的冲突问题

    注:当merge命令自身无法解决冲突的时候,它会将工作树置于一种特殊的状态,并且给用户提供冲突信息,以期用户可以自己解决这些问题。当然在这个时候,未发生冲突的代码已经被git merge登记在了index file里了。如果你这个时候使用git diff,显示出来的只是发生冲突的代码信息。

    在你解决了冲突之前,发生冲突的文件会一直在index file中被标记出来。这个时候,如果你使用git commit提交的话,git会提示:filename.txt needs merge。在发生冲突的时候,如果你使用git status命令,那么会显示出发生冲突的具体信息。

    解决玩冲突问题后,需要commit一下:

    git commit                                         #将已经解决冲突的代码提交到本地代码库
    git branch -d temp                              #删除temp分支

      新建分支并进行本地开发:

    git branch development                      #搞个development分支给自己开发

    git checkout development                  #切换至development分支进行开发

    开发xxxx过程,确认功能开发完毕,可以继承到完整系统中时运行:

    git checkout master                          #切换至master分支

    git merge development                      #合并development及master分支

      修改代码后,查看已修改的内容:

    查看修改的内容

    git diff --cached

    将新增加文件加入到git中

    git add file1 file2 file3

    可以设置忽略的条件:

    最简单的方法在项目根目录与.git目录同一位置创建一个文件: .gitignore

    1. #  
    2. # NOTE! Don't add files that are generated in specific  
    3. # subdirectories here. Add them in the ".gitignore" file  
    4. # in that subdirectory instead.  
    5. #  
    6. # NOTE! Please use 'git ls-files -i --exclude-standard'  
    7. # command after changing this file, to see if there are  
    8. # any tracked files which get ignored after the change.  
    9. #  
    10. # Normal rules  
    11. #  
    12. .*  
    13. *.o  
    14. *.o.*  
    15. *.a  
    16. *.s  
    17. *.ko  
    18. *.so  
    19. *.so.dbg  
    20. *.mod.c  
    21. *.i  
    22. *.lst  
    23. *.symtypes  
    24. *.order  
    25. modules.builtin  
    26. *.elf  
    27. *.bin  
    28. *.gz  
    29. *.bz2  
    30. *.lzma  
    31. *.lzo  
    32. *.patch  
    33. *.gcno  
    34.   
    35. #  
    36. # Top-level generic files  
    37. #  
    38. /tags  
    39. /TAGS  
    40. /linux  
    41. /vmlinux  
    42. /vmlinuz  
    43. /System.map  
    44. /Module.markers  
    45. /Module.symvers  
    46.   
    47. #  
    48. # git files that we don't want to ignore even it they are dot-files  
    49. #  
    50. !.gitignore  
    51. !.mailmap  
    52.   
    53. #  
    54. # Generated include files  
    55. #  
    56. include/config  
    57. include/linux/version.h  
    58. include/generated  
    59.   
    60. # stgit generated dirs  
    61. patches-*  
    62.   
    63. # quilt's files  
    64. patches  
    65. series  
    66.   
    67. # cscope files  
    68. cscope.*  
    69. ncscope.*  
    70.   
    71. # gnu global files  
    72. GPATH  
    73. GRTAGS  
    74. GSYMS  
    75. GTAGS  
    76.    
    77. *.orig  
    78. *~  
    79. #*#  
    #
    # NOTE! Don't add files that are generated in specific
    # subdirectories here. Add them in the ".gitignore" file
    # in that subdirectory instead.
    #
    # NOTE! Please use 'git ls-files -i --exclude-standard'
    # command after changing this file, to see if there are
    # any tracked files which get ignored after the change.
    #
    # Normal rules
    #
    .*
    *.o
    *.o.*
    *.a
    *.s
    *.ko
    *.so
    *.so.dbg
    *.mod.c
    *.i
    *.lst
    *.symtypes
    *.order
    modules.builtin
    *.elf
    *.bin
    *.gz
    *.bz2
    *.lzma
    *.lzo
    *.patch
    *.gcno
     
    #
    # Top-level generic files
    #
    /tags
    /TAGS
    /linux
    /vmlinux
    /vmlinuz
    /System.map
    /Module.markers
    /Module.symvers
     
    #
    # git files that we don't want to ignore even it they are dot-files
    #
    !.gitignore
    !.mailmap
     
    #
    # Generated include files
    #
    include/config
    include/linux/version.h
    include/generated
     
    # stgit generated dirs
    patches-*
     
    # quilt's files
    patches
    series
     
    # cscope files
    cscope.*
    ncscope.*
     
    # gnu global files
    GPATH
    GRTAGS
    GSYMS
    GTAGS
     
    *.orig
    *~
    #*#
    可以参见:

    http://www.code007.org/?p=291

    http://www.cnblogs.com/wucg/archive/2011/08/16/2141647.html

    从git中删除文件:

    git rm file1
    git rm -r dir1
    
    提交修改到本地代码库
    git commit -m 'this is memo'
    

    如果想省掉提交之前的 git add 命令,可以直接用

    git commit -a -m 'this is memo'

    commit和commit -a的区别, commit -a相当于:1.自动地add所有改动的代码,使得所有的开发代码都列于index file中;2.自动地删除那些在index file中但不在工作树中的文件;3.执行commit命令来提交给本地的代码库。

      提交所有修改到远程服务器

               先检出服务器的代码,与当前代码比对,修改冲突。

    git fetch  origin master :temp                           #跟git代码库fetch到一个temp分支
    git merge temp                                                 #保证代码是最新的。

    解决玩冲突问题后,需要commit一下:

    git commit                                         #将已经解决冲突的代码提交到本地代码库
    git branch -d temp                              #删除temp分支


    解决冲突后

    提交给远程的git服务器后,其它团队成员才能更新到这些修改(因为我们还是采用的集中式的管理,每个开发人员都是从git服务器中检出更新)

    git push origin master

      想要恢复到某个版本的代码或者撤销某个操作

    回滚代码:

    git revert HEAD

    你也可以revert更早的commit

    例如:git revert HEAD^

    想要恢复到某个版本的代码就用这个git reset命令:

    git reset

    恢复到之前的版本
    ----mixed 是 git-reset 的默认选项,它的作用是重置索引内容,将其定位到指定的项目版本,而不改变你的工作树中的所有内容,只是提示你有哪些文件还未更新。
    --soft 选项既不触动索引的位置,也不改变工作树中的任何内容。该选项会保留你在工作树中的所有更新并使之处于待提交状态。相当于再--mixed基础上加上git add .
    --hard 把整个目录还原到一个版本,包括所有文件。

    详细内容参看:http://blog.sina.com.cn/s/blog_68af3f090100rp5r.html 

    目前先进行到这里,最终的代码服务器,俺们暂时放一边。当然如果您想要实现它,可以另外建一个xx.git.在将代码库再前面工程师一样倒过去即可~~~休息,休息一下~~

  • 相关阅读:
    linux 学习随笔-shell基础知识
    linux 学习随笔-压缩和解压缩
    解析xml的4种方法详解
    集合工具类
    Map概述
    List集合概述
    Java集合框架
    Spring JdbcTemplate详解
    关于c3p0数据库连接池的简单使用
    Java通过JDBC封装通用DAO层
  • 原文地址:https://www.cnblogs.com/changyiqiang/p/6276909.html
Copyright © 2011-2022 走看看