这是软件工程实践课程第三次团队博客作业,题目要求:

  参考以下网站中对团队项目源代码管理的十个问题的解析,根据自己项目的实际情况,给出十个问题的答案,并整理成团队博客发表在组长的个人博客上。http://www.cnblogs.com/xinz/p/5044037.html

  先大概讲一下我们的进度,在任务分配上,由Q和Z来创建数据库,现在数据库建表工作已经完成,完善了之前一次缺少管理员部分的不足,从原本的宠物表,顾客表,领养表和寄养表的基础上添加了管理员、商品、订单、护理和预订的表格。

 

 

H、E和C主要负责原型设计,使用Axure创建团队项目,Axure在解决冲突问题上的方式是每一个界面只允许一个人签出,避免了同一个界面修改产生的冲突问题,至于代码部分,我们使用Android Studio进行安卓开发,对于安卓的开发,我们并不是太过熟练,所以暂时由我来编写部分代码,等到他们的任务完成后再分配。

  接下来是对下面问题的回答与解决方法:

  1.你的团队的源代码控制在哪里?用的是什么系统?

  我们的任务分成好几个方面,对于代码的编写上,现在由我进行编写,为了减少冲突,我们将把每个界面分开完成,通过界面跳转进行合并,可以选择使用QQ或者微信的方式直接传递源代码。还没有使用过Git来完成团队项目,在移动开发和综合实践课都要求学习了版本控制中心GIt的使用,对Git有了一定的了解,我希望能够通过Git来进行团队项目的开发,现阶段采用QQ或微信的方式直接传递源代码,毕竟比较直接,不过这种方式相当于大家自己开发自己的项目,每个人完成自己的界面。对于代码托管中心的选择,github和Gitee是不错的选择,我们可能更倾向于Gitee,毕竟Gitee较之Github有很多的优点,最重要的是Gitee是中文的。

 

不过Gitee的免费团队项目上限是5人,想到我们组员对敲代码不太感冒,就分配了其他任务给他们。

  这是通过QQ的方式接受数据库建表数据

 

 

 

  2.一个代码文件被签出之后,另一个人可以签出这个文件,并修改么?

  我们打算的是尽量减少这个问题,所以分配不同的界面,最后进行汇总,如果使用GIt的方式,可以创建分支,这样可以同时进行修改,最后再合并,而原型设计软件Axure不允许一个界面被签出后另一个人再签出修改,相当于上锁了,进入只读模式。考虑两种签出方式,签出后上锁和所有人自由签出。参考博客:https://www.cnblogs.com/greyzeng/p/5178001.html

  签出文件后,此文件就加锁,别人无法签出:

  这种情况,可以保证每个人获取的文件版本是最新的,也不会产生修改冲突。但是这种方式花费的时间相对要长一些,因为其他人要等签出这个文件的人签入完毕以后才能签出下来进行修改。

  所有人都可以自由签出文件:

  所有人都可以自由签出文件,这种情况大家各自修改自己需要修改的模块,但是到合并代码的时候,需要人工Merge,这种方式风险会大一些,特别是同一个人修改一个文件涉及到相同函数的修改。

  我认为签出上锁的方式效率很低,在上一个学期的Axure使用上,就出现了很多问题,进度十分缓慢,如果有人签出忘记签入,那么项目完成时间将被大大拖延,而Axure还出现签入不了的现象,让我们头皮发麻。而自由签出文件会出现很多问题,虽然方便大家各自修改自己需要修改的模块,但是如果两个人修改同一个文件,那么文件的更新可能会冲掉一个人的内容,而修改同一个文件的相同函数上就问题更大了,这个在Git上可以通过创建分支合并的方式减少冲突,不得不说Git是个很好的团队开发的版本控制软件。

 

 

  摘自我的Git使用说明的博客https://www.cnblogs.com/BFXR/p/10891666.html

  这里很明显的可以看出Git的便捷之处,可以看出不同开发者修改的内容都被保存,便于团队代码的修改工作。

  3.有几种设计,各有什么优缺点?

  这个问题貌似在前面的问题中进行了回答,主要是自由签入签出,签出上锁还有我们的各自完成各自的部分,通过QQ或微信的方式进行汇总,最后进行界面的跳转。第三种主要针对于小型项目,大型项目不可取,合理使用Git可以提高我们团队开发的效率,减少签入签出的冲突问题,减少签出上锁后等待的时间,加快效率,不过像我们开发的项目完全可以采用QQ或微信的方式进行代码文件传输,毕竟使用Git,大家还要学习Git的使用,Github或Gitee的使用。自由签入签出较之签出上锁,如果自由签入签出只修改自己的内容,那么自由签入签出效率高,但是自由签入签出容易发生冲突,所以签出上锁比较安全。

  4.如何看到这个文件和之前版本的差异?

  在代码托管中心一般都会有记录,而Git会记录每一次的修改记录,可以进行版本的回退和前进。

  

  避免出现上次的图片过多问题,放个博客链接好了:https://www.cnblogs.com/BFXR/p/10891666.html 这是上次作业的Git的介绍,在里面讲述了查看历史记录的方式和前进回退的方法,可以说Git是个很强大的版本控制软件。

  在Gitee中,都有记录每个人的记录,可以知道谁修改了什么,谁添加了什么,便于团队项目的开发。Github这个开源平台,每个开发者都可以对开源项目进行代码的贡献,是个十分便利的平台。

  Gitee上的动态记录,十分的便捷。

 

  5.如果某个文件在你签出之后已经被别人修改,那么你如何合并不同的修改(merge)?

  Git可以方便地对有简单不同的修改进行合并,但对于有逻辑冲突的部分将会给出conflict的提示,这时需要手工修改。

  针对文件的不同状态(modified、untrack、conflict等)给出不同的颜色提示。

  6.你有20个文件都是关于同一个功能的修改,你要如何保证这些文件都同时签入成功(修改的原子性)

  git作为一个成熟的源代码版本管理系统本身就可以保证在签入时的原子性,所以在我们的项目开发流程中没有遇到部分修改可以上传而某些部分的修改不能上传的混乱状态。

  

  5和6的问题在上述的Git中都有解决方法,可以说Linus简直就是个天才,开发出这么好用的软件。

  摘自博客:https://www.cnblogs.com/shenbaishan/p/6086985.html

  在Git中,所有在本地仓库中修改的文件都要统一经过commit为新的本地版本后,再push至远程分支。这保障了本地修改提交的原子性,同时git服务器远程提供的修改操作也具有原子性。这样就保障了整体修改的原子性。

  

  还是这张图,如果修改的是同一处,只需要把所有人的修改都存储下来,进行人工手动合并就能够解决冲突的问题,而没有产生冲突的情况下,保存所有的修改,即使出现问题也可以进行版本的回退前进,方便尝试不同的方法。

  7.你的PC 上有关于三个bug 的修改, 但是都没有完成,这时你要紧急修改第四个bug,如何把本地修改放一边,保证在干净的环境中修改第四个bug, 并签入修改?

  资料1:先备份本地修改的整个工程,然后把工程还原成(Revert)成基线版本,然后进行修改bug并签入,最后通过Beyond Compare工具来对比本地备份的版本和最新的版本,并merge。

   Last Known Good (最后稳定的好版本) 版本可以理解为基线版本,通常情况下,每次正式上线的版本都会打基线,即备份这个版本的源代码和发布包

  

  既然需要一个干净的环境,那么就可以新创建一个本地仓库,从远程仓库clone到新的本地仓库中,进行修改。

  8.如何给你的源代码建立分支?

  

 

   通过git merge branchname进行创建分支,我觉得可以给没有成员创建一个分支,不过这样子合并起来比较麻烦,如果每个人负责一块,如果要修改别人的内容,那么创建分支修改,会减少合并的问题。

  9.一个源文件,如何知道它的每一行都是什么时候签入的?

  找了一个例子更好的说明,https://www.cnblogs.com/greyzeng/p/5178001.html

  以Github为例:

  执行git blame命令,即可显示每一行都是什么时候签入的,为了什么目的签入的,签入人是谁

  或者在Github页面

  Git中可以很详细的看到每一步的修改,不过内容太多会不好查询。

 

   在Gitee中,可以看到每个人的动态,每人每天把完成的部分签入就可以看到大家的进展。

  10.如何给一个系统的所有源文件都打上标签,这样别人可以同步所有有这个标签的文件版本?

  还没有用到这个功能,git可以给文件打上标签,使用git tag 命令 https://jingyan.baidu.com/article/00a07f381b3ae682d028dc26.html百度经验

创建标签

  • 创建轻量标签

$ git tag v0.2.0 -light

解释:创建轻量标签不需要传递参数,直接指定标签名称即可。

  • 创建附注标签

$ git tag -a v0.1.0 -m "release 0.1.0 version"

解释:创建附注标签时,参数-a即annotated的缩写,指定标签类型,后附标签名。参数m指定标签说明,说明信息会保存在标签对象中。

查看标签

  • 列出当前仓库的所有标签

$ git tag

  • 列出符合模式的标签

$ git tag -l 'v0.1.*'

  • 查看标签版本信息

$ git show v0.1.0

切换标签

  • 切换标签与切换分支命令相同

$ git checkout [tagname]

解释:切换标签后处于一个空的分支上,即”You are in ‘detached HEAD’ state.”

删除标签

  • 误打或需要修改标签时,需要先将标签删除,再打新标签

$ git tag -d v0.1.2

解释:参数-d即delete的缩写,意为删除其后指定的标签。

补打标签

  • 给指定的commit打标签

$ git tag -a v0.1.0 49e0cd22f6bd9510fe65084e023d9c4316b446a6

解释:打标签不必要在HEAD之上,也可在之前的版本上打,这需要你知道某个提交对象的校验和,通过git log命令获取。

发布标签

  • v0.1.0标签提交到git服务器

$ git push origin v0.1.0

解释:通常的git push不会将标签对象提交到git服务器,我们需要进行显式的操作。

  • 将本地所有标签一次性提交到git服务器

$ git push origin –tags

  11.你的团队是否能部署自动构建的任务

  (自动同步所有文件,自动构建,自动运行单元测试,碰到错误能自动发邮件给团队)

git机制简要介绍

git使用的是代码仓库,git服务端有仓库,称为远端仓库,我们clone下来的,本地也有一个仓库称为本地仓库。我们commit的时候是把代码提交到了本地仓库,push时,是把代码提交到了远端仓库。pull的时候是把代码从远端仓库下载到本地仓库。

代码仓库对代码的存储使用了版本指针,每个提交的版本都对应一个HEAD指针,当前版本指针随着代码的提交而一直改变。

自动部署原理

说说现在代码的分布情况,开发者电脑上的本地仓库,git服务器上的远端仓库,web服务器上的另一个本地仓库,我们浏览器访问的就是这里的代码。

要实现自动部署,就是要当开发者从本地仓库提交代码到远端仓库的时候,自动把代码部署到web服务器的本地仓库,实现开发者本地仓库和web服务器的本地仓库的同步。

实现自动部署

按照上面说的,就是要在开发者提交的时候,自动触发脚本,脚本去实现web端代码的部署.

这里就得讲一下githook机制,当git服务器接到各种事件时触发,这里使用的hook

post-receive

这个hookgit服务器受到push请求,并且接受完代码提交时触发。

具体代码体现:

git远端仓库的hooks目录下新建post-receive文件:

  我的团队采用在签入之前在自己的PC上运行,看是否会出现问题,没有问题后签入。自动化测试工具,这学期学了使用JUnit、JMeter的使用,在项目实现上存在问题,大概率放弃测试部分,采用人工测试,实现大部分功能。

  根据组员收集的资料和我自己使用Git的感受,尽可能完善的回答了上述的问题。

  团队任务接近尾声,可以说团队开发需要分配好任务,作为PM,在这方面处理的不是很好,团队的代码实现上存在着一定的问题,最后,希望我们能够把我们的App实现。