2022-04-12 16:32:02 +07:00
---
2022-06-18 15:05:08 +07:00
title: '#90DaysOfDevOps - 概述: Git - 版本控制 - 第三十五天'
2022-04-12 16:32:02 +07:00
published: false
2022-06-18 15:05:08 +07:00
description: 90DaysOfDevOps - 概述: Git - 版本控制
2022-04-12 16:32:02 +07:00
tags: 'devops, 90daysofdevops, learning'
cover_image: null
canonical_url: null
id: 1049041
---
2022-06-18 15:05:08 +07:00
## 概述: Git - 版本控制
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
在我们开始git之前, 我们需要了解什么是版本控制, 为什么需要它? 在Git部分的开头, 我们将介绍版本控制以及git的基础。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
### 什么是版本控制?
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
Git不是唯一的版本控制系统, 所以我们会讨论关于版本控制的工具和现成的方法。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
版本控制最显著、最大的好处是可以记录一个项目的历史。我们可以通过`git log`回看整个仓库,我们会看到有很多的提交(commits)和评论(comments),还有项目中发生了什么。不要急,我们会在后边谈到相关的命令(commands)。可以思考一下,如果这是一个实际的软件项目,有着大量的源代码,很多人在不同的时间对我们的软件进行提交,不同的作者、审核人都在这里进行记录。所以我们可以知道什么时候、发生了什么、谁发起的、谁审阅的。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
![](../../Days/Images/Day35_Git1.png)
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
首先,版本控制是很妙的,它就像是在你进行修改之前对现有的版本进行了复制。也类似你为了以防万一,把没用的代码注释掉一样。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
![](../../Days/Images/Day35_Git2.png)
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
我已经在很多地方使用到了版本控制,不单单是源代码方面,也包括一些分享项目(像这个 90DaysOfDevOps)。所以为什么不回滚和记录所有发生的事呢。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
然而,一个重要声明:**版本控制不是备份!**
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
版本控制的另一个好处是可以管理一个项目的多个版本。这里举个例子,我们有一个免费的应用可以在所有系统上运行,还有一个付费的应用也可以在所偶系统上运行。主要的代码在两个应用中共享使用。我们可以复制黏贴我们的代码,每一次对不同应用的提交。但这样会导致混乱,特别是当你与多个人改变开发产品时,同时也可能发生一些错误。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
下面我们想对一个高级应用程序(premium app)添加新功能,先称之为高级提交(premium commits),其中的自由编辑(free edition)包含了常规的提交。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
版本控制通过分支(branching)来实现这点。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
![](../../Days/Images/Day35_Git3.png)
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
分支(branching)允许一个应用程序有两个代码流(code streams),就像我们上面提到的。但我们仍然想让新的功能加入到我们的源代码中。合并(merging)就是用来做这件事的。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
![](../../Days/Images/Day35_Git4.png)
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
这个看起来简单,但合并可以是复杂的,因为你可能在自由编辑(free edition)上与团队一起工作,同时你和另一个团队在付费版本(premium paid for version)上工作。如果同时更改代码,会对所有代码产生影响。可能一个变量被更新导致有些东西出错。然后你会得到一个冲突(conflict),它会破坏项目中的功能。版本控制不能修复冲突,但版本控制使它们被易于管理。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
主要的原因是, 如果你还不太了解版本控制, 一般的, 它有协作的功能。与开发者共享代码的能力, 正如我之前提到的, 我们为了各种原因去寻找有用的案例、使用源代码。它可能是你与同事制作的演讲, 或是一个90DaysOfDevOps的挑战, 你拥有一个社区, 可以检查内容是否正确, 或是跟进整个项目。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
如果没有版本控制,软件开发团队还如何处理这些?当我在一步步制作项目时,我发现这将是困难的。我希望它们能够被拆分进不同的功能模块中。在还没发布时,其中一点点的疑问可能导致各部分的问题一起出现。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
通过使用版本控制,我们只有一个目标。我们可能在不同模块上进行工作,但这能让大家更好地进行合作。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
![](../../Days/Images/Day35_Git5.png)
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
还有一个需要提到的是,不单是开发者可以从版本控制中获益,团队中的所有成员都可以查看。但对工具应该有了解和利用,项目管理工具可以是类似的,用于追踪工作进程。我们可能会有一个构建平台(build machine), 例如Jenkins 我们将会在另一个章节谈到。一个创建和打包的系统,自动化部署测试和评估。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
### 什么是Git?
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
Git是一个追踪代码或文件改变的工具, 或者我们也可以说它是一个开源的分布式版本控制系统。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
Git可以有多种方式在我们的系统中使用, 对于我来说最常见的是命令行。我们也有图像交互工具, 例如Visual Studio Code就有git操作, 我们可以使用它。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
在开始安装Git之前, 我们要看看宏观的概述。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
我们之前创建了一个文件夹。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
![](../../Days/Images/Day35_Git2.png)
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
要将版本控制应用在这个文件夹中,我们第一步需要使用`git init`来初始化。可以想象这个命令将我们的目录变成了一个仓库(repository),并放入了电脑某处的数据库中。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
![](../../Days/Images/Day35_Git6.png)
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
现在我们可以创建一些文件、文件夹和源代码,或者它们已经在这里了。我们使用`git add .`命令来将目录中所有文件和文件夹放入一个快照(snapshot),到此我们还没有提交(commit)任何东西到数据库中。我们只是将所有的文件使用`.`来进行了添加。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
![](../../Days/Images/Day35_Git7.png)
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
然后我们想进一步并提交文件,使用`git commit -m "My First Commit"`。我们可以描述提交的原因,这是一个好的行为,后续我们才能知道每次提交都发生了什么。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
![](../../Days/Images/Day35_Git8.png)
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
现在我们可以用`git log`来看看项目的历史记录里发生了什么。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
![](../../Days/Images/Day35_Git9.png)
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
如果我们在这里创建一个新的文件`samplecode.ps1`,那么状态提示将发生改变。我们也可以用`git status`来检查我们仓库的状态。它会提示我们没有提交任何的东西, 可以添加一个新的文件samplecode.ps1。如果我们后续输入相同的命令`git status`,你会看到将会被提交的文件。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
![](../../Days/Images/Day35_Git10.png)
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
使用`git add samplecode.ps1`来添加新的文件,然后再次输入`git status`。我们看到这个文件已经准备好被提交了。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
![](../../Days/Images/Day35_Git11.png)
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
下面输入`git commit -m "My Second Commit"`。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
![](../../Days/Images/Day35_Git12.png)
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
这次的`git status`再次告诉我们所有东西都是最新的。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
![](../../Days/Images/Day35_Git13.png)
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
后续我们可以使用`git log`来查看最新的和第一个提交。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
![](../../Days/Images/Day35_Git14.png)
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
如果我们想每次提交中的改变内容,比如哪些文件被添加或修改了,我们可以使用`git diff b8f8 709a`。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
![](../../Days/Images/Day35_Git15.png)
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
这样会显示发生了什么改变。在我们的例子中,我们添加了一个新的文件。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
![](../../Days/Images/Day35_Git16.png)
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
我们会在后续进一步学习相关用法,至此我们可以在提交中穿梭了,就像是时间旅行一样!通过利用我们的提交序号(commit number), `git checkout 709a`可以跳回到之前的版本并保留我们新建的文件。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
![](../../Days/Images/Day35_Git17.png)
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
但同时,我们要继续前进。相同的,我们可以使用提交序号或直接使用`git switch -`来撤销我们的操作。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
![](../../Days/Images/Day35_Git18.png)
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
总结:
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
- 追踪一个项目的历史记录
- 管理一个项目的多个版本
- 与开发者、更广范围的团队和工具分享源代码
- 协调团队合作
- 和时间旅行的可能!
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
这似乎是跳跃的,但希望你能有所收获,了解版本控制的命令的功能和宏观思路。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
后续, 我们会安装git并在你本地的机器上设置, 进一步了解有关的使用案例和命令。
2022-04-12 16:32:02 +07:00
2022-06-18 15:05:08 +07:00
## 相关资料
2022-04-12 16:32:02 +07:00
- [What is Version Control? ](https://www.youtube.com/watch?v=Yc8sCSeMhi4 )
- [Types of Version Control System ](https://www.youtube.com/watch?v=kr62e_n6QuQ )
- [Git Tutorial for Beginners ](https://www.youtube.com/watch?v=8JJ101D3knE&t=52s )
- [Git for Professionals Tutorial ](https://www.youtube.com/watch?v=Uszj_k0DGsg )
- [Git and GitHub for Beginners - Crash Course ](https://www.youtube.com/watch?v=RGOj5yH7evk&t=8s )
- [Complete Git and GitHub Tutorial ](https://www.youtube.com/watch?v=apGV9Kg7ics )
2022-06-18 15:05:08 +07:00
[第三十六天 ](day36.md )见!
2022-04-12 16:32:02 +07:00