版本控制(4)

学习目标

完成本单元后,您将能够:

  • 列出GitHub工作流程中的步骤。
  • 解释远程和本地工作环境之间的区别。
  • 完成创建新文件并更改现有文件的步骤。

Flow chart showing code, then collaborate, and then ship.

GitHub工作流程概述

GitHub流程是一个轻量级的工作流程,可让您安全地尝试新想法,而不必担心会影响项目。主要步骤是:

  1. 创建一个分支关闭master
  2. 提交
  3. 打开pull request
  4. 合作
    1. 做更多的承诺
    2. 与集成进行交互
  5. 合并master branch

创建一个分支

分支是Git中的一个关键概念。 Git中的所有东西都生活在一个分支上。默认情况下,项目的生产版本位于主分支中。

当您准备好尝试新功能或解决问题时,请创建项目的新分支。首先,分支看起来和主人一模一样,但是你所做的任何更改只会反映在你的分支中。

提交
在对项目中的文件进行更改时,将它们提交到您的功能分支。

打开合并请求并进行协作
打开拉取请求开始讨论您的更改。拉取请求意味着进一步完善代码的起点 – 不需要它是一个完美的艺术作品。

合并到主分支
一旦您的团队批准您的更改,请将功能分支中的拉取请求合并到主分支中。
所以这在理论上是很好的,但是让我们把它付诸实践吧。

安装Git

在我们完成本单元其余部分的Git示例之前,首先要做的就是在您的计算机上安装Git。这使您可以在本地使用存储库。访问Git网站并按照说明安装Git的正式版本。在安装过程中接受所有的默认设置。

注册一个GitHub客户并创建一个存储库

你要做的第一件事就是注册一个GitHub个人账户。这是GitHub的免费版本,可以让您按照以下步骤进行操作。

接下来创建一个工作库。

  1. 在标题中,单击并选择 New repository
  2. 输入存储库名称: best-repo-ever
  3. 选择项目是公共还是私人。 (我们现在推荐公众,公共仓库是免费的。)
  4. 选择 Initialize this repository with a README
  5. 点击Create repository

Screenshot of the repository creation screen.

在GitHub和本地工作

您可以直接在GitHub上对项目进行更改,但大多数人更喜欢在本地机器上工作,以便可以在自己喜欢的IDE或文本编辑器中进行更改。我们来回顾几个重要的术语:

  • Remote repository 是GitHub上仓库的副本。所有的协作者都将这些变化与这个同步,使之成为这个组织的真实来源。
  • Local repositories 是存储在用户计算机上的git存储库。如果本地目录链接到远程存储库,则本地存储库是远程存储库上所有内容的完整副本,包括其所有文件,分支和历史记录。

本地和远程存储库仅在Git中运行四个网络命令之一时进行交互:git clonegit fetchgit pull, and git push.

要在存储库上进行本地工作,首先需要在计算机上创建一个克隆。要克隆存储库,请按照下列步骤操作:

  1. 在GitHub中,点击你刚创建的版本库的代码标签
  2. 点击 Clone or download
  3. 将克隆网址复制到剪贴板
  4. 打开你的命令行应用程序。如果您在Mac或Linux上,则可以使用您的终端。如果你在Windows上,我们推荐你使用Git Bash,它随Git一起安装。
  5. 从GitHub中检索存储库的完整副本:git clone <CLONE-URL>。将<CLONE-URL>替换为上面复制的克隆URL。你应该看到这样的东西:
    Cloning into 'best-repo-ever'... 
    remote: Counting objects: 3, done. 
    remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 
    Unpacking objects: 100% (3/3), done.
  6. 克隆完成后,cd进入由克隆操作创建的新目录: cd best-repo-ever

注意:您也可以使用桌面应用程序(如GitHub桌面)与Git和GitHub进行交互。这些提供了与存储库更直观的交互,通常非常强大。

配置您的本地环境

在对代码进行更改之前,您需要设置一些基本配置。您通常只需要设置一次这些配置。 Git允许您在三个不同的级别设置配置选项。

git config --system 这些是系统范围的配置。它们适用于此计算机上的所有用户。
git config --global 这些是用户级配置。他们只适用于您的用户客户。
git config--local 这些是存储库级配置。它们只适用于设置它们的特定存储库。 git config的默认值是 --local.

Git会自动添加几个配置 – 输入git config –list来查看所有三个级别的配置设置。

Git使用您的用户名和电子邮件地址的配置设置为您创建的每个提交生成一个唯一的指纹。你不能创建提交没有这些设置,所以使用你的命令行应用程序自己设置它们:

$ git config --global user.name "First Last" 
$ git config --global user.email "you@email.com"
注意:您不会看到任何确认这个工作,但只要您没有看到错误,您就设置好了!

配置autocrlf
接下来,我们设置core.autocrlf(autocrlf代表自动回车换行符)。不同的系统处理换行符和换行符的方式不同。如果你打开在另一个操作系统上创建的文件,并且没有设置这个配置选项,Git会认为你根据你的操作系统处理行结束的方式对文件进行了修改。

对于Windows用户输入:

$ git config --global core.autocrlf true
对于Mac或Linux用户输入:
$ git config --global core.autocrlf input
使用GitHub跟踪文件

现在你已经有一个仓库的本地副本,并且已经配置好了Git,你可以使用GitHub工作流对项目进行一些修改。我们首先对README.md文件进行简单的更改。

第1步:创建一个Branch

要查看本地分支的列表,请键入 git branch. 现在,你可能只看到一个分支:master.

让我们为我们的工作创建一个新的分支(myfeaturebranch):

  1. 键入git branch myfeaturebranch
  2. Checkout 到该分支 git checkout myfeaturebranch

你应该看到这样的东西:

kjameson-ltm:best-repo-ever kjameson$ git branch 
   * master  
kjameson-ltm:best-repo-ever kjameson$ git branch myfeaturebranch 
kjameson-ltm:best-repo-ever kjameson$ git checkout myfeaturebranch 
  Switched to branch 'myfeaturebranch'
注意:如果你听说过从其他VCS签出,这可能意味着不同于Git。使用Git,checkout会移动一个名为HEAD的重要指针,在这种情况下,我们将移动到另一个分支。 HEAD指向你的分支的尖端。我们在最后一个单元中讨论HEAD。

步骤2:更改README.md文件并将更改提交到本地存储库

现在你已经签出了新的分支,做一些改变,看看Git的行动。

  1. 打开存储库中的README.md
  2. 用你最喜欢的文本编辑器添加一些内容。
  3. 完成后,保存您的更改。

在对文件进行了一些更改之后,是时候创建第一个快照了。从命令行工作时,您需要熟悉 two stage commit.

当您在本地工作时,您的文件存在四种状态之一。他们要么未被追踪,修改,上演或承诺。 Git跟踪这些文件,并通过在三棵树中组织文件和更改来跟踪您的历史。他们正在工作,分期(也称为索引)和历史。当我们添加,删除和更改文件时,我们在工作树中执行此操作。

Diagram of the three trees of Git, working, staging, and history.

要将更改添加到版本控制中,请创建一组表示离散工作单元的文件集合 – 我们在暂存区域中构建此单元。

当我们对我们组装的工作单元感到满意时,我们会在暂存区域对所有内容进行快照。这被称为 commit.

让我们使用命令git add和git commit来完成这个过程:

  1. 检查我们的工作树的状态: git status
    kjameson-ltm:best-repo-ever kjameson$ git status 
    On branch myfeaturebranch 
    Changes not staged for commit: 
          (use "git add <file>..." to update what will be committed) 
          (use "git checkout -- <file>..." to discard changes in working directory)  
       modified: README.md 
    no changes added to commit (use "git add" and/or "git commit -a")
  2. 将文件从工作树移动到临时区域:git add README.md
  3. 输入git status来查看发生了什么事情:
    kjameson-ltm:best-repo-ever kjameson$ git status
    On branch myfeaturebranch 
    Changes to be committed: 
          (use "git reset HEAD <file>..." to unstage)
       modified: README.md 
  4. 拿我们的第一个快照:git commit -m “My first commit”
  5. 让我们再看看我们的存储库状态: git status
    kjameson-ltm:best-repo-ever kjameson$ git status
    On branch myfeaturebranch 
    nothing to commit, working tree clean

步骤3:将更改发送到远程存储库

现在,这个提交只是本地的。如果您检查远程存储库,您将看不到您的分支或您刚才所做的更改。要查看远程更改,首先需要将更改推送到远程存储库。

既然我们在本地创建了这个分支,我们将首先创建一个与我们本地分支匹配的远程分支。用同样的命令,我们也会建立两个分支之间的跟踪关系。

  1. 输入 git push -u origin myfeaturebranch
  2. 当被问及时,输入你的GitHub用户名,然后输入你的密码。
    kjameson-ltm:best-repo-ever kjameson$ git push -u origin myfeaturebranch 
    Username for 'https://github.com': kierenjameson 
    Password for 'https://kierenjameson@github.com': 
    Counting objects: 6, done. 
    Delta compression using up to 4 threads. 
    Compressing objects: 100% (4/4), done. 
    Writing objects: 100% (6/6), 551 bytes | 0 bytes/s, done. 
    Total 6 (delta 1), reused 0 (delta 0) 
    remote: Resolving deltas: 100% (1/1), done. 
    To https://github.com/kierenjameson/best-repo-ever.git
       * [new branch] myfeaturebranch -> myfeaturebranch 
    Branch myfeaturebranch set up to track remote branch myfeaturebranch from origin.

注意:第一次推新分支时只需要这么长的命令。之后,你可以简单地输入git push。

第4步:创建合并请求

现在,您已将更改推送到远程存储库,让我们在GitHub上打开一个pull请求。

  1. 转到您的GitHub客户在网上
  2. 点击Pull Request 标签
  3. 点击 New Pull Request
  4. 在Base下拉菜单中选择 master
  5. 在比较下拉列表中,选择myfeaturebranch。你应该看到这样的东西:

Screenshot from GitHub showing comparison of changes between master branch and myfeaturebranch.

  1. 点击 Create pull request
  2. 输入 Subject 和Comment
  3. 点击 Create pull request

通过代码审查控制代码质量

拉取请求不仅仅是分支的比较,它们是通过人工和自动化努力来检查代码并确保质量的一种方式。

一般对话
使用“对话”选项卡在拉取请求上添加常规注释。

行评论
在“文件已更改”选项卡(A)中,可以将鼠标悬停在一行上以查看蓝色+图标(B)。点击此图标将允许您在特定的行上输入注释(C)。这些行级别注释是提供建议更改的附加上下文的好方法。它们也将显示在会话视图中。

Screenshot showing how to add line comments.

评论
在进行评论时,您也可以选择开始评论(D)。创建审阅时,可以将许多行注释与摘要消息一起分组。提交评论时,您可以指出是评论,批准还是要求更改。在与受保护分支结合使用时,请求评论在GitHub中具有特殊的功能,如果没有至少一个评论,则可以防止合并请求。

自动化测试
如果您已经将CI / CD与您的项目集成在一起,您将看到正确的报告请求状态。这些测试是高度可定制的。

合并您的更改

当你合并你的分支时,你从你的功能分支中获取内容和历史记录,并将其添加到主分支的内容和历史记录中。

合并是快速和容易点击合并拉取请求,添加合并注释,然后单击确认合并。

你的团队应该建立谁应该合并拉取请求的规则。一些选项包括:

  • 创建拉取请求的人应该合并,因为他们需要解决合并导致的问题。
  • 在项目组中分配一个人。这确保了一致性,但可能成为一个瓶颈。
  • 创建拉取请求的人以外的任何人都可以合并。这确保了至少一次审查已经发生。

保持一切同步

合并你的pull请求之后,删除GitHub上的分支。要执行此操作,请点击请求画面底部的删除分支。

但是,在GitHub上合并和删除不会自动更新您的本地版本库。让我们回到我们的命令行应用程序,并让所有内容同步。

首先,我们需要将我们在GitHub上所做的更改导入到本地版本库中:

  1. 切换回你的默认分支: git checkout master
  2. 从GitHub中检索所有更改: git pull
    kjameson-ltm:best-repo-ever kjameson$ git checkout master 
    Switched to branch 'master' 
    Your branch is up-to-date with 'origin/master'. 
    
    kjameson-ltm:best-repo-ever kjameson$ git pull 
    remote: Counting objects: 1, done. 
    remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 
    Unpacking objects: 100% (1/1), done. 
    From https://github.com/kierenjameson/best-repo-ever 
           f464053..599f35f master -> origin/master 
    Updating f464053..599f35f 
    Fast-forward 
       README.md | 4 +++- 1 
       file changed, 3 insertions(+), 1 deletion(-)
    注意:git pull是一个组合命令,它从GitHub中检索所有更改,然后更新当前所在的分支,以包含来自远程的更改。正在运行的两个独立命令是git fetch和git merge。