Skip to content

#90DaysOfDevOps - 概述: Git - 版本控制 - 第三十五天

概述: Git - 版本控制

在我们开始git之前,我们需要了解什么是版本控制,为什么需要它?在Git部分的开头,我们将介绍版本控制以及git的基础。

什么是版本控制?

Git不是唯一的版本控制系统,所以我们会讨论关于版本控制的工具和现成的方法。

版本控制最显著、最大的好处是可以记录一个项目的历史。我们可以通过git log回看整个仓库,我们会看到有很多的提交(commits)和评论(comments),还有项目中发生了什么。不要急,我们会在后边谈到相关的命令(commands)。可以思考一下,如果这是一个实际的软件项目,有着大量的源代码,很多人在不同的时间对我们的软件进行提交,不同的作者、审核人都在这里进行记录。所以我们可以知道什么时候、发生了什么、谁发起的、谁审阅的。

首先,版本控制是很妙的,它就像是在你进行修改之前对现有的版本进行了复制。也类似你为了以防万一,把没用的代码注释掉一样。

我已经在很多地方使用到了版本控制,不单单是源代码方面,也包括一些分享项目(像这个 90DaysOfDevOps)。所以为什么不回滚和记录所有发生的事呢。

然而,一个重要声明:版本控制不是备份!

版本控制的另一个好处是可以管理一个项目的多个版本。这里举个例子,我们有一个免费的应用可以在所有系统上运行,还有一个付费的应用也可以在所偶系统上运行。主要的代码在两个应用中共享使用。我们可以复制黏贴我们的代码,每一次对不同应用的提交。但这样会导致混乱,特别是当你与多个人改变开发产品时,同时也可能发生一些错误。

下面我们想对一个高级应用程序(premium app)添加新功能,先称之为高级提交(premium commits),其中的自由编辑(free edition)包含了常规的提交。

版本控制通过分支(branching)来实现这点。

分支(branching)允许一个应用程序有两个代码流(code streams),就像我们上面提到的。但我们仍然想让新的功能加入到我们的源代码中。合并(merging)就是用来做这件事的。

这个看起来简单,但合并可以是复杂的,因为你可能在自由编辑(free edition)上与团队一起工作,同时你和另一个团队在付费版本(premium paid for version)上工作。如果同时更改代码,会对所有代码产生影响。可能一个变量被更新导致有些东西出错。然后你会得到一个冲突(conflict),它会破坏项目中的功能。版本控制不能修复冲突,但版本控制使它们被易于管理。

主要的原因是,如果你还不太了解版本控制,一般的,它有协作的功能。与开发者共享代码的能力,正如我之前提到的,我们为了各种原因去寻找有用的案例、使用源代码。它可能是你与同事制作的演讲,或是一个90DaysOfDevOps的挑战,你拥有一个社区,可以检查内容是否正确,或是跟进整个项目。

如果没有版本控制,软件开发团队还如何处理这些?当我在一步步制作项目时,我发现这将是困难的。我希望它们能够被拆分进不同的功能模块中。在还没发布时,其中一点点的疑问可能导致各部分的问题一起出现。

通过使用版本控制,我们只有一个目标。我们可能在不同模块上进行工作,但这能让大家更好地进行合作。

还有一个需要提到的是,不单是开发者可以从版本控制中获益,团队中的所有成员都可以查看。但对工具应该有了解和利用,项目管理工具可以是类似的,用于追踪工作进程。我们可能会有一个构建平台(build machine),例如Jenkins 我们将会在另一个章节谈到。一个创建和打包的系统,自动化部署测试和评估。

什么是Git?

Git是一个追踪代码或文件改变的工具,或者我们也可以说它是一个开源的分布式版本控制系统。

Git可以有多种方式在我们的系统中使用,对于我来说最常见的是命令行。我们也有图像交互工具,例如Visual Studio Code就有git操作,我们可以使用它。

在开始安装Git之前,我们要看看宏观的概述。

我们之前创建了一个文件夹。

要将版本控制应用在这个文件夹中,我们第一步需要使用git init来初始化。可以想象这个命令将我们的目录变成了一个仓库(repository),并放入了电脑某处的数据库中。

现在我们可以创建一些文件、文件夹和源代码,或者它们已经在这里了。我们使用git add .命令来将目录中所有文件和文件夹放入一个快照(snapshot),到此我们还没有提交(commit)任何东西到数据库中。我们只是将所有的文件使用.来进行了添加。

然后我们想进一步并提交文件,使用git commit -m "My First Commit"。我们可以描述提交的原因,这是一个好的行为,后续我们才能知道每次提交都发生了什么。

现在我们可以用git log来看看项目的历史记录里发生了什么。

如果我们在这里创建一个新的文件samplecode.ps1,那么状态提示将发生改变。我们也可以用git status来检查我们仓库的状态。它会提示我们没有提交任何的东西,可以添加一个新的文件samplecode.ps1。如果我们后续输入相同的命令git status,你会看到将会被提交的文件。

使用git add samplecode.ps1来添加新的文件,然后再次输入git status。我们看到这个文件已经准备好被提交了。

下面输入git commit -m "My Second Commit"

这次的git status再次告诉我们所有东西都是最新的。

后续我们可以使用git log来查看最新的和第一个提交。

如果我们想每次提交中的改变内容,比如哪些文件被添加或修改了,我们可以使用git diff b8f8 709a

这样会显示发生了什么改变。在我们的例子中,我们添加了一个新的文件。

我们会在后续进一步学习相关用法,至此我们可以在提交中穿梭了,就像是时间旅行一样!通过利用我们的提交序号(commit number),git checkout 709a可以跳回到之前的版本并保留我们新建的文件。

但同时,我们要继续前进。相同的,我们可以使用提交序号或直接使用git switch -来撤销我们的操作。

总结:

  • 追踪一个项目的历史记录
  • 管理一个项目的多个版本
  • 与开发者、更广范围的团队和工具分享源代码
  • 协调团队合作
  • 和时间旅行的可能!

这似乎是跳跃的,但希望你能有所收获,了解版本控制的命令的功能和宏观思路。

后续,我们会安装git并在你本地的机器上设置,进一步了解有关的使用案例和命令。

相关资料

第三十六天见!