(1) 你的团队的源代码控制在哪里?用的是什么系统?
我们的项目在GitHub上托管,采用git方式进行版本控制。
(2) 一个代码文件被签出之后,另一个人可以签出这个文件,并修改么?
a) 有几种设计,各有什么优缺点?
我们团队的在处理文件的锁定问题上是不加锁的,也就是说我们的成员可以*迁入迁出。为了最大化效率,我们没有对文件迁入迁出进行过多的限制。
将文件在迁入迁出时加锁,显然可以保证源代码修改的同步性,减少不必要的冲突和错误,但是这样的缺点是显而易见的,由于缺乏了并行性,项目开发的效率就被极大地降低了,极端情况下很有可能因为一个人的失误,导致全队项目的搁浅。
反之,我们采用*迁入迁出的方式,则与前者的优缺点互反了。
(3) 如何看到这个文件和之前版本的差异?
在Github中,可以通过可视化的界面来看到每次修改的代码文件与修改的具体位置,修改的具体内容。一次commit可以和Issue相关联,以表明这个Issue是由本次commit修复的,只需要在git commit的时候使用时加入commit日志信息即可。
(4) 如果某个文件在你签出之后已经被别人修改,那么你如何合并不同的修改(merge)?
我们使用Git来帮助我们完成了这件事。在一般情况下,git pull后git会自动合并Git修改的部分,自动的Merge。但是,也存在无法自动合并的情况。远程数据库和本地数据库的同一个地方都发生了修改的情况下,因为Git无法自动判断要选用哪一个修改,所以就会发生冲突。但是,Git会在发生冲突的地方打个标记。比如这样式的:
<<<<<<< HEAD
test in Local
=======
test in Remote
>>>>>>> 17c805…(Commit的Hash值)
==分割线上方是本地数据库的内容
==分割线下方是远程数据库的某次产生冲突的commit所修改的内容。
这时候我们需要识别哪些都可以保留,哪些保留远程数据库的内容,哪些保留本地数据库的内容。在将文件冲突的内容合并后,删除掉<<<<< 和=====,>>>>>这样的东西,重新add,commit,push,即完成了一次手工合并。
(5) 你有20个文件都是关于同一个功能的修改,你要如何保证这些文件都同时签入成功(修改的原子性)
在Git中,所有在本地仓库中修改的文件都要统一经过commit为新的本地版本后,再push至远程分支。这保障了本地修改提交的原子性,同时git服务器远程提供的修改操作也具有原子性。这样就保障了整体修改的原子性。
(6) 你的PC 上有关于三个bug 的修改, 但是都没有完成,这时你要紧急修改第四个bug,如何把本地修改放一边,保证在干净的环境中修改第四个bug, 并签入修改?
先备份本地的工程,然后在本地新建一个分支,在新的分支上进行bug的修复。当前分支的内容就被保存在原地。过程如图所示:
(7) 如何给你的源代码建立分支?
下面这幅图,显示我们创建分支的过程:
以Git为例:
1)查看分支
- git branch 查看本地仓库
- git branch -r 查看远程仓库
2)创建分支
- git checkout -b feature-A
也可是使用两条命令达到同样的效果
- git branch feature-A
- git checkout feature-A
3)切换分支
- git checkout master 切换到master分支
- git checkout - 切换回上一个分支
4)获取仓库代码
- git pull origin master
5)修改代码提交到feature-A分支上
- git add . 添加文件
- git commit -m 'add branch' 提交代码
- git push -u origin feature-A 推送至远程仓库master以外的分支
6)合并代码到master分支
假设分支feature-A已经实现完成,想要将它合并到主干分支master中。首先切换到master分支
- git checkout master
- git merge --no-ff feature-A
(8) 一个源文件,如何知道它的每一行都是什么时候签入的?
以Github为例,执行git blame命令,即可显示每一行都是什么时候签入;
我们组的是一个包传进来的,所以没有具体的一行的显示。
(9) 如何给一个系统的所有源文件都打上标签,这样别人可以同步所有有这个标签的文件版本?
给系统的源文件打上标签可以方便项目协作者知道哪个项目文件是已经被更新过上传上去的。为系统源文件添加标签可以通过Github来实现:
首先要发布一个release版本,在下面的界面点击Create a new release,编辑想要release的文件信息,并上传文件
我上传了一个MainActivity.java文件,版本号设置为v1.0.0,发布版本的名字为AnimalWorld1.0.0,并且勾选了This is a pre-release
点击Publish release按钮后,创建标签成功,结果如下:
(10) 你的团队是否能部署自动构建的任务
- (自动同步所有文件,自动构建,自动运行单元测试,碰到错误能自动发邮件给团队)
我们尝试着给项目增加了部署自动构建的任务
首先先下载Jenkins,网址:https://jenkins.io/download/
运行压缩包中的msi文件,直接根据提示进行安装
安装好后,在浏览器上打开http://localhost:8080/,jenkins网址,获取并输入管理员密码,密码可在界面上的路径中获取
输入密码后点击继续可能界面会报错显示“Not Found",此时在浏览器的网址输入框中输入"http://localhost:8080/"即可,加载出如下界面
点击安装推荐的插件,开始安装所需要的插件
安装成功后,输入自己的账户信息
配置好用户账户信息后,配置实例,然后可以开始使用Jenkins
然后添加凭据,在global处点击添加凭据,然后选择ssh密钥方式,填写git的ssh密钥和密码,添加好的界面如下图所示
在系统配置界面中,找到全局管理一栏,勾选环境变量,然后输入键和值如下图所示,然后进行保存
保存好后点击创建一个新任务,选择创建第一个*风格的任务
分别在General、源码管理、构建中进行如下设置:
这样自动构建任务就完成了,如果任务执行了一次,则会有工作空间产生。
总结:通过上述问题的回答、思考和操作,我们虽然用了github和git代码管理平台,但是我们发现自己用的仍然还是比较初级的。这个代码管理平台如果能够使用好应该还是很方便的,但是在学习和探索的过程中还是感觉有些复杂。