A Version Controlled Project Workflow for Requirement, Coding and Continuous Integration

摘要

开发团队中,使用Word或者PDF文档,或者邮件来描述需求,可能导致同样内容的文档出现在不同成员的电脑上,进而可能导致 版本不一致。另外两次版本的需求更改,很难进行差异比较(Word和PDF文档不是简单的文本文件)。 一种解决方案是,使用文本文件(比如Markdown或者LaTeX)来描述需求,并将所有的文件纳入源代码管理。 所以,本文描述的这个工作流,将所有的文档纳入源代码管理。同时还将提到:

  • 使用Issue来跟踪需求、变更和问题解决
  • 产品、测试和开发等不同角色如何便捷的使用Bitbucket来提出并跟踪任务

环境准备

本文提到的“环境”,不是开发环境,而是对每个成员都是适用的基本工作环境。

本文提到的“源代码”,不仅仅是开发代码,而是团队运行过程中所有的文档,包括:

所有输出的成品,比如编译生成的PDF文件,不应该纳入源代码管理。

了解Atlassian

Atlassian的产品线比较全面, 我目前使用的三个是:

目前,每一个产品都有如下两个版本:

两个版本除了部署托管方式不同,页面和使用方式都非常类似。

所以,在同一个产品的不同版本之间相互迁移,不会造成用户体验的不习惯。

比如:

注册Bitbucket

首先注册一个bitbucket.org账号,bitbucket是一个在线的源代码管理系统,支持多个私有库, 默认每个库支持5位成员协同工作。

进入bitbucket页面之后,左侧导航栏常用的菜单为:

Bitbucket支持在线编辑和预览Markdown文档。

操作系统和Git环境

Git环境简介

当团队成员获得了某一个源代码仓库(repo)的访问权限之后,需要安装Git环境,用来提交和查看不是时期的源代码。

建议在Bash环境下使用Git。

Git的仓库(repo)有三类:

一般而言,Git环境的基本流程是:

  1. 克隆或更新本地库,将服务器上的变更,更新到本地

     git pull
    
  2. 修改、编辑源代码,标记变更的文件,并为本次变更添加一个描述

     git add file_changed.txt
     git commit -m '本次变更的描述信息'
    
  3. 可以重复上一个步骤,多次变更文件
  4. 一并提交本地的所有的更新到服务器上

     git push
    

编辑文本文档

Ubuntu系统下的建议

Windows系统下的建议

使用c9.io

https://c9.io

这是一个网页版的代码编辑器,在一些个人电脑环境有限的情况下,可以直接在网页里面写代码。

特色是:

移动端的访问

iOS上使用CodeBucket访问源代码库。

Android平台使用Bitbeaker

移动端通常可用于问题的讨论。

不同角色的工作流程

产品和需求的变更

需求最开始可以在问题(issue) 列表中讨论,逐步反映到需求文档中,具体而言:

  1. 新增一个问题(issue)
  2. 团队成员在每一个问题的评论中讨论
  3. 编写对应的需求文档,并在提交的时候,关联问题编号(使用英文字符井号#

    git commit -m '新增某某需求,参考问题 #1'
    

@mention

在issue的讨论中,可以使用@username提及某一个队员,一般来说,对方会收到一封邮件, 所以为了方便,请使用 简短 并且容易在键盘上打出来的username

另外,我建议:

Email Notification

除了用于登录、注册的邮箱外,如果你想及时地收到Notification(比如某人@了你), 可以在个人设置中,添加一个额外的邮箱地址。

附录

全局规则

文件命名

源代码存放的文件要求

源代码存放的文件,都要能够做比较(git diff)。

对于诸如,.pdf.exe.ppt等文件,是不适合做git diff的,因为如果 使用text文本编辑器打开这些文件,看到的都是二进制编码。

如下文件,需要通过源代码管理:

如下的文件,请不要放到源代码托管,

如下的文件,请不要放到源代码托管,

如下的文件,请不要放到源代码托管:

参考常用的gitignore文件:

https://github.com/github/gitignore

Markdown基本语法介绍

bitbucket中可以直接编辑和预览文件。 详细的语法说明,可以参考:https://bitbucket.org/tutorials/markdowndemo/overview

常用的语法有如下:

LaTeX基本语法介绍

常用的Git场景

本小节主要参考文献[Chacon and Straub, 2014] 1

下列的代码段中,以$打头的命令需要在bash中执行。其余的为命令执行的结果。

如何修改最近一次commit的备注2

  $ git commit --amend

想暂时回到某一个历史版本3

有的时候,突然发现了一个问题,但是明明记得之前某个时间段是正常的。 此时,需要回到之前的某一个版本(commit),尝试找到是哪一次提交引发了该问题。

  1. 列出最近的一系列提交

     $ git log --pretty=oneline -n 20 --graph --abbrev-commit
     * 9ecb341 fix markdown href syntax
     * 3f0828b fix markdown coding syntax
     * 72fc362 fix markdown syntax
     * 4175860 draft for vcs wrkflow
     * 94259e0 fix typo of lataxing
     * 8ecbced no center for equation
     * 794bcee blockquote equation
     * b0ca566 fix div in markdown
    
  2. 临时返回到之前的某一次提交

     $ git checkout 94259e0
    
  3. 使用二分查找,反复执行git checkout,直到定位到某两个相邻的版本,也即, 前一个版本还是正常的,后一个版本就出现了问题

  4. 比较这两个相邻版本的差异,分析问题

     $ git diff 4175860 94259e0
    
  5. 回撤这些临时版本

     $ git checkout master
    

如何在当前的版本上做一些实验性的修改,但不确定是否提交

充分利用Git的Branch特性,在当前的版本上创建一个分支,然后做实验性的修改。

    $ git branch experiment

确认了这些修改之后,可以将实验分支上的更改合并到当前位置

    $ git checkout master
    $ git merge master experiment

另外,关于分支合并,rebasemerge的区别可以参考这篇文章(这个区别一般 只有开发才会用到)。简单理解:

c9.io的基本环境配置

# create workspace
# private
# choose a EMPTY template

# generate SSH key for Git server,
# https://confluence.atlassian.com/x/YwV9E
ssh-keygen -t rsa -b 4096
vi ~/.ssh/id_rsa.pub
# start the ssh-agent in the background
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
# record SSH key into Github and Bitbucket
# clone Git repo into c9.io
# git clone git@bitbucket.org:username/repo.git

Bitbucket和Github在Acadamic License上的比较

在Acadamic License结束之后,Bitbucket依然允许5人小组的私有库,但是Github需要付费,才能继续使用私有库。

参考文献

  1. Chacon, S. and Straub, B. (2014). Pro Git, Second Edition.: NY. Apress.

  2. Git Basics - Undoing Things

  3. Temporarily switch to a different commit