← 返回目录

Git 与版本控制

第 50 / 119 卷日期:

源。并且对于我们的产品环境的服务器来说,我们还需要指定好这个软件源才能安装这个包。

以Ubuntu为例,Ubuntu里的许多应用程序软件包,是放在网络里的服务器上,这些服务器网站,就称作 “源”,从源里可以很方便地获取软件包。

因而在这一步中,我们所需要做的事便是将我们打包完的软件上传到相应的服务器上。

Git 与版本控制

版本控制

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

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

我们日常会工作在 “develop” 分支(那条线)上,通常来说每个迭代我们会发布一个新的版本,而这个新的版本将会直接上线到产品环境。那么上线到产品环境的这个版

本就需要打一个版本号——这样不仅可以方便跟踪我们的系统,而且当出错的时候我们也可以直接回滚到上一个版本。如果在上线的时候有些Bug不得不去修复,并且由于上

线的新功能很重要,我们就需要一些 Hotfix。而从整个过程来看,版本控制起了一个非常大的作用。

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

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

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

Git

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

图 89-1
图 89-1

图 44: 基于 Git 的工作流

  1. 在自己的机器上创建分支,修改代码。
  2. 在单机上自己创建的分支上提交代码。
  3. 在单机上合并分支。
  4. 新建一个分支,把服务器上最新版的代码 fetch 下来,然后跟自己的主分支合并。
  5. 生成补丁(patch),把补丁发送给主开发者。
  6. 看主开发者的反馈,如果主开发者发现两个一般开发者之间有冲突(他们之间可

以合作解决的冲突),就会要求他们先解决冲突,然后再由其中一个人提交。如果主开发者可以自己解决,或者没有冲突,就通过。

  1. 一般开发者之间解决冲突的方法,开发者之间可以使用 pull 命令解决冲突,解决

完冲突之后再向主开发者提交补丁。

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

  1. 查看邮件或者通过其它方式查看一般开发者的提交状态。
  2. 打上补丁,解决冲突(可以自己解决,也可以要求开发者之间解决以后再重新提

交,如果是开源项目,还要决定哪些补丁有用,哪些不用)。

  1. 向公共服务器提交结果,然后通知所有开发人员。

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

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

图 91-1
图 91-1

图 45: Before add

下面是添加之后的

图 91-2
图 91-2

图 46: After add

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

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

我们的项目,也会在我们的 Commit Message 里写上作者的名字,如下:

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

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

全站分卷索引 · 119 卷
  1. 1Growth: 全栈增长工程师指南
  2. 2软件开发的核心难题:沟通
  3. 3大公司的专家与小公司的全栈
  4. 4全栈工程师的未来:无栈
  5. 5基础知识篇
  6. 6工具只是辅助
  7. 7语言也是一种工具
  8. 8提高效率的工具
  9. 9IDE
  10. 10终端或命令提示符
  11. 11包管理
  12. 12环境搭建
  13. 13Windows
  14. 14GNU/Linux
  15. 15学好一门语言的艺术
  16. 16输出是最好的输入
  17. 17如何应用一门新的技术
  18. 18Web 编程基础
  19. 19从 HTML 到页面显示
  20. 20HTML
  21. 21中文?
  22. 22其他 HTML 标记
  23. 23小结
  24. 24CSS
  25. 25简介
  26. 26样式与目标
  27. 27更有趣的 CSS
  28. 28JavaScript
  29. 29JavaScriptFul
  30. 30面向对象
  31. 31其他
  32. 32前端与后台
  33. 33后台语言选择
  34. 34PHP
  35. 35Model
  36. 36View
  37. 37Controller
  38. 38后台即服务
  39. 39后台即服务
  40. 40数据库
  41. 41搜索引擎
  42. 42前端框架选择
  43. 43前台与后台交互
  44. 44JSON
  45. 45WebSocket
  46. 46编码过程
  47. 47Web 应用的构建系统
  48. 48Web 应用的构建过程
  49. 49Web 应用的构建实战
  50. 50Git 与版本控制
  51. 51Tasking
  52. 52Tasking 开发任务
  53. 53写代码只是在码字
  54. 54内置索引与外置引擎
  55. 55内置索引与外置引擎
  56. 56如何测试
  57. 57测试替身
  58. 58Mock
  59. 59测试先行
  60. 60可读的代码
  61. 61命名
  62. 62函数长度
  63. 63代码重构
  64. 64提炼函数
  65. 65内联函数
  66. 66查询取代临时变量
  67. 67重构到设计模式
  68. 68上线
  69. 69隔离硬件:虚拟机
  70. 70隔离操作系统:容器虚拟化
  71. 71隔离底层:Servlet 容器
  72. 72隔离依赖版本:虚拟环境
  73. 73隔离语言:DSL
  74. 74GNU/Linux
  75. 75HTTP 服务器
  76. 76数据库端缓存
  77. 77前端缓存
  78. 78运行机制
  79. 79自动化部署
  80. 80依赖与包仓库
  81. 81构建软件包
  82. 82数据分析
  83. 83想法-构建
  84. 84产品-衡量
  85. 85数据分析
  86. 86分析数据
  87. 87用户数据分析:Google Analytics
  88. 88流量获取
  89. 89移动应用
  90. 90网站性能
  91. 91SEO
  92. 92什么样的网站需要 SEO?
  93. 93内容
  94. 94UX 入门
  95. 95什么是简单?
  96. 96进阶
  97. 97认知设计
  98. 98持续交付
  99. 99持续集成系统
  100. 100持续交付
  101. 101持续部署
  102. 102持续阅读
  103. 103遗留系统与修改代码
  104. 104遗留代码
  105. 105修改遗留代码
  106. 106速度优化
  107. 107模块重构
  108. 108Retro
  109. 109三个维度
  110. 110架构模式
  111. 111预设计式架构
  112. 112演进式架构:拥抱变化
  113. 113意图导向
  114. 114重构
  115. 115模式与演进
  116. 116相关阅读资料
  117. 117架构解耦
  118. 118CQRS
  119. 119CQRS 结合微服务