Git 与版本控制

版本控制

版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。

虽然基于 Git 的工作流可能并不是一个非常好的实践,但是在这里我们以这个工作流做为实践来开展我们的项目。如下图所示是一个基于 Git 的项目流:

基于 Git 的工作流

我们日常会工作在 “develop” 分支(那条线)上,通常来说每个迭代我们会发布一个新的版本,而这个新的版本将会直接上线到产品环境。那么上线到产品环境的这个版本就需要打一个版本号——这样不仅可以方便跟踪我们的系统,而且当出错的时候我们也可以直接回滚到上一个版本。如果在上线的时候有些 Bug 不得不去修复,并且由于上线的新功能很重要,我们就需要一些 Hotfix。而从整个过程来看,版本控制起了一个非常大的作用。

不仅仅如此,版本控制的最大重要是在开发的过程中扮演的角色。通过版本管理系统,我们可以:

  1. 将某个文件回溯到之前的状态。
  2. 将项目回退到过去某个时间点。
  3. 在修改 Bug 时,可以查看修改历史,查出修改原因
  4. 只要版本控制系统还在,你可以任意修改项目中的文件,并且还可以轻松恢复。

常用的版本管理系统有 Git、SVN,但是从近年来看 Git 似乎更受市场欢迎。

Git

从一般开发者的角度来看,Git 有以下功能:

  1. 从服务器上克隆数据库(包括代码和版本信息)到单机上。
  2. 在自己的机器上创建分支,修改代码。
  3. 在单机上自己创建的分支上提交代码。
  4. 在单机上合并分支。
  5. 新建一个分支,把服务器上最新版的代码 fetch 下来,然后跟自己的主分支合并。
  6. 生成补丁(patch),把补丁发送给主开发者。
  7. 看主开发者的反馈,如果主开发者发现两个一般开发者之间有冲突(他们之间可以合作解决的冲突),就会要求他们先解决冲突,然后再由其中一个人提交。如果主开发者可以自己解决,或者没有冲突,就通过。
  8. 一般开发者之间解决冲突的方法,开发者之间可以使用 pull 命令解决冲突,解决完冲突之后再向主开发者提交补丁。

从主开发者的角度(假设主开发者不用开发代码)看,Git 有以下功能:

  1. 查看邮件或者通过其它方式查看一般开发者的提交状态。
  2. 打上补丁,解决冲突(可以自己解决,也可以要求开发者之间解决以后再重新提交,如果是开源项目,还要决定哪些补丁有用,哪些不用)。
  3. 向公共服务器提交结果,然后通知所有开发人员。

Git 初入

如果是第一次使用 Git,你需要设置署名和邮箱:

  1. $ git config --global user.name "用户名"
  2. $ git config --global user.email "电子邮箱"

你可以在 GitHub 新建免费的公开仓库或在 Coding.net 新建免费的私有仓库。

按照 GitHub 的文档Coding.net 的文档 配置 SSH Key,然后将代码仓库 clone 到本地,其实就是将代码复制到你的机器里,并交由 Git 来管理:

  1. $ git clone git@github.com:username/repository.git
  2. $ git clone git@git.coding.net:username/repository.git

或使用 HTTPS 地址进行 clone:

  1. $ git clone https://username:password@github.com/username/repository.git
  2. $ git clone https://username:password@git.coding.net/username/repository.git

你可以修改复制到本地的代码了( symfony-docs-chs 项目里都是 rst 格式的文档)。当你觉得完成了一定的工作量,想做个阶段性的提交:

向这个本地的代码仓库添加当前目录的所有改动:

  1. $ git add .

或者只是添加某个文件:

  1. $ git add -p

我们可以输入

  1. $ git status

来看现在的状态,如下图是添加之前的:

Before add

下面是添加之后 的

After add

可以看到状态的变化是从黄色到绿色,即 unstage 到 add。

在完成添加之后,我们就可以写入相应的提交信息——如这次修改添加了什么内容 、这次修改修复了什么问题等等。在我们的工作流程里,我们使用 Jira 这样的工具来管理我们的项目,也会在我们的 Commit Message 里写上作者的名字,如下:

  1. $ git commit -m "[GROWTH-001] Phodal: add first commit & example"

在这里的GROWTH-001就相当于是我们的任务号,Phodal 则对应于用户名,后面的提交信息也会写明这个任务是干嘛的。

由于有测试的存在,在完成提交之后,我们就需要运行相应的测试来保证我们没有破坏原来的功能。因此,我们就可以PUSH我们的代码到服务器端:

  1. $ git push

这样其他人就可以看到我们修改的代码。