小团队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.在将代码库再前面工程师一样倒过去即可~~~休息,休息一下~~

posted on 2017-01-12 09:53  巫山老妖  阅读(260)  评论(0编辑  收藏  举报