Git与版本控制 --- ###版本控制 > 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。 虽然基于Git的工作流可能并不是一个非常好的实践,但是在这里我们以这个工作流做为实践来开展我们的项目。如下图所示是一个基于Git的项目流: ![基于Git的工作流](assets/article/chapter3/gitflow.png) 我们日常会工作在"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,你需要设置署名和邮箱: ``` $ git config --global user.name "用户名" $ git config --global user.email "电子邮箱" ``` 将代码仓库clone到本地,其实就是将代码复制到你的机器里,并交由Git来管理: ``` $ git clone git@github.com:someone/symfony-docs-chs.git ``` 你可以修改复制到本地的代码了(symfony-docs-chs项目里都是rst格式的文档)。当你觉得完成了一定的工作量,想做个阶段性的提交: 向这个本地的代码仓库添加当前目录的所有改动: ``` $ git add . ``` 或者只是添加某个文件: ``` $ git add -p ``` 我们可以输入 ``` $ git status ``` 来看现在的状态,如下图是添加之前的: ![Before add](assets/article/chapter3/before-add.png) 下面是添加之后 的 ![After add](assets/article/chapter3/after-add.png) 可以看到状态的变化是从黄色到绿色,即unstage到add。 在完成添加之后,我们就可以写入相应的提交信息——如这次修改添加了什么内容 、这次修改修复了什么问题等等。在我们的工作流程里,我们使用Jira这样的工具来管理我们的项目,也会在我们的Commit Message里写上作者的名字,如下: ``` $ git commit -m "[GROWTH-001] Phodal: add first commit & example" ``` 在这里的``GROWTH-001``就相当于是我们的任务号,Phodal则对应于用户名,后面的提交信息也会写明这个任务是干嘛的。 由于有测试的存在,在完成提交之后,我们就需要运行相应的测试来保证我们没有破坏原来的功能。因此,我们就可以PUSH我们的代码到服务器端: ``` $ git push ``` 这样其他人就可以看到我们修改的代码。