使用 GitHub 工作流
学习目标
完成本单元后,您将能够:
- 列出 GitHub 工作流中的步骤。
- 说明远程和本地工作环境之间的区别。
- 完成创建新文件和更改现有文件的步骤。
GitHub 工作流概述
GitHub 流是一个紧凑的工作流,可让您安全地试验新想法,而不必担心损坏项目。主要步骤是:
- 从 main 创建一个分支
- 进行提交
- 发起拉取请求
- 协作
- 进行更多提交
- 与团队成员讨论并审阅代码
- 部署进行最终测试
- 将您的分支合并到主分支
创建分支
分支是 Git 的核心概念。Git 中的一切都存在于分支上。默认情况下,项目的生产版本位于主分支中。
当您准备好测试新功能或修复问题时,创建项目的新分支。该分支一开始与主分支看起来完全相同,但是当您执行更改时,它只会体现在分支中。
进行提交
对项目中的文件进行更改后,将更改提交到功能分支。
发起拉取请求并进行合作
发起拉取请求并开始讨论您的更改。代码不一定是完美的,因此可以通过拉取请求来改进代码。
合并到主分支
一旦团队批准了您的更改,即可部署您的拉取请求并将其从功能分支合并到主分支。
理论上看起来很棒,但让我们来实际操作一下。
安装 Git
在继续进行本单元其余部分的 Git 示例之前,您需要先在您的计算机上安装 Git。这样您才可以在本地使用存储库。访问 Git 网站并按照说明安装正式版 Git。安装期间接受所有默认设置。
注册一个 GitHub 帐户并创建存储库
首先要做的是注册一个 GitHub 个人帐户。这是 GitHub 的免费版本,供您按照以下步骤操作。
接下来创建一个要使用的存储库。
- 在标题中单击 并选择 New repository(新建存储库)
- 输入存储库名称:
best-repo-ever
- 选择项目是公开的还是私有的。
- 在 Initialize this repository with:(使用以下方式初始化此存储库:)下,选择 Add a README file(添加 README 文件)。
- 然后,单击 Create repository(创建存储库)。
在 GitHub 上工作与在本地工作
您可以直接在 GitHub 上对项目进行更改,但大多数人更喜欢在本地计算机上工作,这样他们就可以在自己喜欢的 IDE 或文本编辑器中进行更改。让我们回顾几个重要的术语:
- 远程存储库是 GitHub 上存储库的副本。所有协作者都将他们的更改与此副本同步,使其成为团队的权威来源。
- 本地存储库是存储在用户计算机上的 Git 存储库。当本地目录链接到远程存储库时,本地存储库是远程存储库的完整副本,包括所有文件、分支和历史记录。
只有当您在 Git 中运行以下四个网络命令之一时,本地和远程存储库才会交互:git clone
、git fetch
、git pull
和 git push
。
要在本地存储库上工作,您必须先把它克隆到您的计算机上。要克隆存储库,请按以下步骤操作:
- 在 GitHub 中,单击刚刚创建的存储库的 Code(代码)选项卡。
- 单击 Code(代码)按钮。
- 将克隆 URL 复制到剪贴板。
- 打开命令行应用程序。如果您使用的是 Mac 或 Linux,则可以使用终端。如果您使用的是 Windows,我们建议您使用随 Git 安装的 Git Bash。
- 从 GitHub 检索存储库的完整副本:
git clone
。替换为在上面复制的克隆 URL。您应看到这样的效果:
Cloning into 'best-repo-ever'...remote: Counting objects: 3, done.remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0Unpacking objects: 100% (3/3), done. |
---|
- 克隆完成后,导航到克隆操作创建的新目录:
cd best-repo-ever
配置您的本地环境
在可以更改代码之前,您需要设置一些基本配置。这些配置一般只需要设置一次即可。Git 提供三个级别的配置选项。查看这些配置命令选项。
命令选项 |
描述 |
---|---|
git config --system |
这是系统范围的配置,适用于此计算机的所有用户。 |
git config --global |
这是用户级别的配置,仅适用于您的用户帐户。 |
git config --local |
这是存储库级别的配置,仅适用于设置它们的特定存储库。git config 的默认值是 |
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 步:创建分支
要查看本地分支列表,请键入 git branch
。目前您可能只会看到一个主分支。
让我们来创建一个新分支 (myfeaturebranch
):
- 输入
git branch myfeaturebranch
- 检出到该分支:
git checkout myfeaturebranch
您应看到这样的效果:
kjameson-ltm:best-repo-ever kjameson git branch * main kjameson-ltm:best-repo-ever kjameson git branch myfeaturebranch kjameson-ltm:best-repo-ever kjameson git checkout myfeaturebranch Switched to branch 'myfeaturebranch' |
---|
第 2 步:更改 README.md 文件并将更改提交到您的本地存储库
现在您已经检出到新分支,我们将进行一些更改并查看 Git 的运行情况。
- 在您的存储库中打开 README.md
- 使用您最喜欢的文本编辑器添加一些内容。
- 完成后,保存更改。
对文件进行一些更改后,就可以创建第一个快照了。从命令行工作时,您需要熟悉两阶段提交这个概念。
当您在本地工作时,Git 通过在三棵树中组织您的文件和更改来跟踪您的历史记录。这三棵树分别是 working、staging(也称为索引)和 history。添加、删除和更改文件是在 working 树中完成的。
要将更改添加到版本控制中,请创建代表离散工作单元的文件集合——我们在 staging 区域构建该单元。
当我们对配置的工作单元感到满意时,我们可以为暂存区中的所有内容创建快照。这被称为提交。
让我们使用命令 git add
和 git commit
完成该流程:
- 查看 working 树的状态:
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")
- 将文件从 working 树移动到暂存区:
git add README.md
- 输入
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
- 创建我们的第一个快照:
git commit -m “My first commit”
- 让我们再看看存储库的状态:
git status
kjameson-ltm:best-repo-ever kjameson git status
On branch myfeaturebranch
nothing to commit, working tree clean
第 3 步:将更改发送到远程存储库
目前,此提交仅在本地完成。检查远程存储库时,您不会看到您的分支,也不会看到刚刚所做的更改。要远程查看您的更改,您必须首先将更改推送到远程存储库。
由于我们在本地创建了这个分支,所以我们先创建一个与这个本地分支对应的远程分支。我们还将使用同样的命令设置两个分支之间的跟踪关系。
- 输入
git push -u origin myfeaturebranch
- 按照屏幕上的说明依次输入您的 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.
第 4 步:创建拉取请求
现在您已将更改推送到远程存储库,让我们在 GitHub 上打开一个拉取请求。
- 在 Web 上转到您的 GitHub 帐户
- 单击 Pull Request(拉取请求)选项卡
- 单击 New Pull Request(新建拉取请求)
- 在 Base(基础)下拉列表中选择 main
- 在 Compare(比较)下拉列表中选择 myfeaturebranch。您应看到这样的效果:
- 单击 Create pull request(创建拉取请求)
- 输入主题行和评论。
- 单击 Create pull request(创建拉取请求)
通过代码审阅控制代码质量
拉取请求不仅仅是对分支的比较,还是一种通过手动和自动检查代码来确保质量的方法。
一般对话
使用 Conversation(对话)选项卡以添加对拉取请求的一般评论。
行注释
在 Files Changed(更改的文件)选项卡 (A) 中将鼠标悬停在一行上方,可看到一个蓝色的 + 图标 (B)。单击此图标可让您对特定行输入注释 (C)。可以利用这些行注释为建议的更改提供额外的说明。它们也将显示在对话视图中。
评价
在进行行注释时,您还可以选择 Start a Review(开始审阅) (D)。创建评论时,您可以使用一条摘要消息将多条行注释组合在一起。提交评论时,您可以指明它是否只是评论或者是批准或更改请求。当与受保护的分支一起使用时,拉取请求审阅在 GitHub 中具有特殊的功能,如果拉取请求没有经过至少一次审阅,您可以阻止合并该拉取请求。
自动测试
如果您已将 CI/CD 与您的项目集成,您将在拉取请求中直接看到报告的测试状态。这些测试是高度可定制的。
部署
当团队成员审阅并批准了您的拉取请求,并且通过了所有必要的测试后,您就可以部署分支并在生产环境中验证您的更改。如果您的更改有问题,您可以通过将现有主分支部署回生产环境来进行回滚。
合并更改
合并分支时,您从功能分支中获取内容和历史记录并将其添加到主分支的内容和历史记录中。
合并快速而简单——单击 Merge pull request(合并拉取请求),添加合并评论,然后单击 Confirm merge(确认合并)。
您的团队应制定有关应由谁来合并拉取请求的规则。一些选项包括:
- 应由创建拉取请求的人合并,因为需要由他们解决合并产生的问题。
- 在项目团队中指定一个人来合并。这确保了一致性,但可能造成瓶颈。
- 除了拉取请求的创建者之外的任何人都可以合并。这能确保至少进行了一次审阅。
保持同步
合并拉取请求后,删除 GitHub 上的分支。为此,请单击拉取请求屏幕底部的 Delete branch(删除分支)。
但是,在 GitHub 上进行合并和删除不会自动更新您本地的存储库副本。让我们回到我们的命令行应用程序并同步所有内容。
首先,我们需要将在 GitHub 上所做的更改复制到存储库的本地副本中:
- 切换回默认分支:
git checkout main
- 从 GitHub 检索所有更改:
git pull
kjameson-ltm:best-repo-ever kjameson git checkout main
Switched to branch 'main'
Your branch is up-to-date with 'origin/main'.
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 main -> origin/main
Updating f464053..599f35f
Fast-forward
README.md | 4 +++- 1
file changed, 3 insertions(+), 1 deletion(-)