介绍
Git 是一种开源分布式版本控制系统,它使协作软件项目更易于管理。许多项目在 Git 存储库中维护他们的文件,而像 GitHub 这样的平台使代码共享和贡献变得可访问、有价值和有效。
托管在公共存储库中的开源项目受益于更广泛的开发人员社区通过拉取请求所做的贡献,请求项目接受您对其代码存储库所做的更改。
本教程将指导您通过命令行向 Git 存储库发出拉取请求,以便您可以为开源软件项目做出贡献。
先决条件
您应该在本地计算机上安装 Git。您可以检查您的计算机上是否安装了 Git,并按照本指南完成操作系统的安装过程。
您还需要拥有或创建一个 GitHub 帐户。您可以通过 GitHub 网站github.com这样做,并且可以登录或创建您的帐户。
自 2020 年 11 月起,GitHub 删除了基于密码的身份验证。因此,您需要创建个人访问令牌或添加SSH 公钥信息,以便通过命令行访问 GitHub 存储库。
最后,您应该确定要参与的开源软件项目。通过阅读本简介,您可以更加熟悉开源项目。
创建存储库的副本
存储库,或简称repo ,本质上是项目的主文件夹。存储库包含所有相关的项目文件,包括文档,还存储每个文件的修订历史。在 GitHub 上,存储库可以有多个协作者,可以是公共的也可以是私有的。
为了从事开源项目,您首先需要制作自己的存储库副本。为此,您应该分叉存储库然后克隆它,以便您拥有本地工作副本。
分叉存储库
您可以通过使用浏览器导航到您想要贡献的开源项目的 GitHub URL 来在 GitHub 上创建一个存储库。
GitHub 存储库 URL 将引用与存储库所有者关联的用户名以及存储库名称。例如,DigitalOcean Community(用户名:)是cloud_haikudo-community
项目存储库的所有者,因此该项目的 GitHub URL 为:
https://github.com/do-community/cloud_haiku
在上面的示例中,do-community
是用户名,cloud_haiku
是存储库名称。
一旦您确定了您想要贡献的项目,您可以导航到 URL,其格式如下:
https://github.com/username/repository
或者,您可以使用 GitHub 搜索栏搜索项目。
当您在存储库的主页上时,一个Fork按钮将显示在页面的右上角,在您的用户图标下方:
单击Fork按钮开始分叉过程。在您的浏览器窗口中,您将收到一条通知,告知您正在处理您正在分叉的存储库:
该过程完成后,您的浏览器将转到与之前的存储库屏幕类似的屏幕,除了在顶部您会在存储库名称之前看到您的用户名,并且在 URL 中它还会在存储库名称之前显示您的用户名。
因此,在上面的示例中,您会看到页面顶部的不是do-community / cloud_haiku您的用户名/ cloud_haiku,新 URL 将类似于以下内容:
https://github.com/your-username/cloud_haiku
存储库分叉后,您就可以克隆它,以便拥有代码库的本地工作副本。
克隆存储库
要制作您自己想要贡献的存储库的本地副本,让我们首先打开一个终端窗口。
我们将使用该git clone
命令以及指向您的存储库分支的 URL。
此 URL 将与上面的 URL 类似,只是现在它将以.git
. 在cloud_haiku
上面的示例中,URL 将与此类似,将您的实际用户名替换为your-username
:
https://github.com/your-username/cloud_haiku.git
您也可以使用从原始存储库页面派生的存储库页面中的绿色“⤓ 代码”按钮复制 URL。单击该按钮后,您将能够通过单击 URL 旁边的剪贴板按钮来复制 URL:
有了 URL 后,我们就可以克隆存储库了。为此,我们将git clone
在终端窗口中将命令与命令行中的存储库 URL 结合起来:
现在我们有了代码的本地副本,我们可以继续创建一个新分支来处理代码。
创建一个新分支
每当您从事协作项目时,您和其他为存储库做出贡献的程序员都会同时对新功能或修复有不同的想法。其中一些新功能不会花费大量时间来实施,但其中一些将持续进行。因此,对存储库进行分支很重要,这样您就可以管理工作流、隔离代码并控制哪些功能使其返回项目存储库的主分支。
项目存储库的主要分支通常称为主分支。推荐的做法是将主分支上的任何内容视为可部署供其他人随时使用。
注意:2020 年 6 月,GitHub 更新了术语,将默认源代码分支称为分支main
,而不是master
分支。如果您的默认分支仍然出现,您可以通过更改默认分支设置master
将其更新为。main
在基于现有项目创建分支时,从主分支创建新分支非常重要。您还应该确保您的分支名称是描述性名称。而不是调用它my-branch
,你应该使用类似frontend-hook-migration
或的东西fix-documentation-typos
。
要从我们的终端窗口创建分支,让我们更改我们的目录,以便我们在存储库的目录中工作。请务必使用存储库的实际名称(例如cloud_haiku
)更改到该目录。
现在,我们将使用命令创建新分支git branch
。确保以描述性的方式命名,以便从事该项目的其他人了解您正在从事的工作。
现在我们的新分支已经创建,我们可以使用以下命令切换以确保我们正在该分支上工作git checkout
:
输入git checkout
命令后,您将收到以下输出:
Switched to branch 'new-branch'
或者,您可以使用以下命令和标志压缩上述两个命令,创建并切换到新分支-b
:
如果你想切换回main
,你将使用checkout
带有主分支名称的命令:
该checkout
命令将允许您在多个分支之间切换,因此您可以同时处理多个功能。
此时,您现在可以修改现有文件或将新文件添加到您自己分支上的项目中。
在本地进行更改
为了演示如何发出拉取请求,让我们使用示例cloud_haiku
存储库并在我们的本地副本中创建一个新文件。使用您喜欢的文本编辑器创建一个新文件,以便我们可以按照投稿指南中的说明添加一首新俳句。例如,我们可以使用 nano 并调用我们的示例文件filename.md
. 您需要将您的文件命名为带有.md
Markdown 扩展名的原始名称。
接下来,我们将按照贡献指南向新文件添加一些文本。我们需要使用 Jekyll 格式并添加带有换行符的俳句。以下文件是一个示例文件,因为您需要提供原始俳句。
---
layout: haiku
title: Octopus Cloud
author: Sammy
---
Distributed cloud <br>
Like the octopuses' minds <br>
Across the network <br>
包含文本后,保存并关闭文件。如果您使用 nano,请依次按CTRL + X
、Y
、 和ENTER
。
修改现有文件或将新文件添加到您选择的项目后,您可以将其暂存到本地存储库,我们可以使用命令来完成git add
。在我们的示例中filename.md
,我们将键入以下命令。
我们将创建的文件的名称传递给此命令,以将其暂存到我们的本地存储库。这可确保您的文件已准备好添加。
如果你想添加你在特定目录中修改的所有文件,你可以使用以下命令暂存它们:
在这里,句号或句点将添加所有相关文件。
如果您希望递归添加所有更改,包括子目录中的更改,您可以键入:
或者,您也可以键入git add -all
所有要暂存的新文件。
暂存文件后,我们需要记录我们使用命令对存储库所做的更改git commit
。
提交更改
提交信息是代码贡献的一个重要方面;它可以帮助维护者和其他贡献者充分理解您所做的更改、您为什么进行更改以及更改的重要性。此外,提交消息提供了整个项目更改的历史记录,一路帮助未来的贡献者。
-m
如果我们有一条非常短的消息,我们可以用标志和引号中的消息记录下来。在我们添加俳句的示例中,我们git commit
可能类似于以下内容。
除非是微小的或预期的更改,否则我们可能希望包含更长的提交消息,以便我们的合作者能够完全跟上我们的贡献。要记录这条较大的消息,我们将运行git commit
将打开默认文本编辑器的命令:
运行此命令时,您可能会注意到您在 vim 编辑器中,您可以通过键入退出:q
。如果你想配置你的默认文本编辑器,你可以使用命令来完成git config
,并将 nano 设置为默认编辑器,例如:
或者:
运行该git commit
命令后,根据您使用的默认文本编辑器,您的终端窗口应显示一个可供您编辑的文档,类似于以下内容:
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch new-branch
# Your branch is up-to-date with 'origin/new-branch'.
#
# Changes to be committed:
# modified: new-feature.py
#
在介绍性注释下方,您应该将提交消息添加到文本文件中。
要编写有用的提交消息,您应该在第一行包含一个大约 50 个字符长的摘要。在此之下,并分解为易于理解的部分,您应该包括一个说明,说明您进行此更改的原因、代码如何工作,以及将上下文化和澄清它的其他信息,以便其他人在合并时审查工作。尽量提供帮助和积极主动,以确保维护项目的人员能够充分理解您的贡献。
推送更改
保存并退出提交消息文本文件后,您可以使用以下命令验证 Git 将提交的内容:
根据您所做的更改,您将收到类似于以下内容的输出:
On branch new-branch
nothing to commit, working tree clean
此时您可以使用git push
命令将更改推送到您的分叉存储库的当前分支:
该命令将为您提供输出,让您了解进度,它类似于以下内容:
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 336 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/your-username/repository.git
a1f29a6..79c0e80 new-branch -> new-branch
Branch new-branch set up to track remote branch new-branch from origin.
您现在可以导航到 GitHub 网页上的分叉存储库,并切换到您推送的分支以查看您在浏览器中所做的更改。
此时,可以向原始存储库发出拉取请求,但如果您尚未这样做,则需要确保您的本地存储库与上游存储库保持同步。
更新本地存储库
当您与其他贡献者一起处理项目时,保持本地存储库与项目保持同步对您来说很重要,因为您不希望对会自动导致冲突的代码发出拉取请求(尽管在协作代码项目,必然会发生冲突)。要使代码库的本地副本保持更新,您需要同步更改。
我们将首先为分叉配置远程,然后同步分叉。
为分叉配置远程
远程存储库使您可以与他人协作处理 Git 项目。每个远程存储库都是托管在 Internet 或您有权访问的网络上的项目版本。您应该可以只读或读写方式访问每个远程存储库,具体取决于您的用户权限。
为了能够将您在复刻中所做的更改与您正在使用的原始存储库同步,您需要配置一个引用上游存储库的远程。您应该只设置一次到上游存储库的远程。
让我们首先检查您配置了哪些远程服务器。该git remote
命令将列出您已经指定的任何远程存储库,因此如果您像我们上面那样克隆存储库,您至少会收到有关原始存储库的输出,这是 Git 为克隆目录指定的默认名称。
从我们终端窗口的存储库目录中,让我们使用命令git remote
和-v
标志来显示 Git 存储的 URL 以及相关的远程短名称(如“origin”):
由于我们克隆了一个存储库,我们的输出应该类似于:
origin https://github.com/your-username/forked-repository.git (fetch)
origin https://github.com/your-username/forked-repository.git (push)
如果您之前设置了多个遥控器,该git remote -v
命令将提供所有遥控器的列表。
接下来,我们将为我们指定一个新的远程上游存储库以与分叉同步。这将是我们从中分叉的原始存储库。我们将使用git remote add
命令执行此操作。
对于我们的cloud_haiku
示例,此命令如下:
在此示例中,upstream
是我们为远程存储库提供的短名称,因为就 Git 而言,“上游”指的是我们从中克隆的存储库。如果我们想添加一个指向协作者存储库的远程指针,我们可能需要提供该协作者的用户名或短名称的缩写昵称。
git remote -v
我们可以通过从存储库目录再次使用命令来验证我们指向上游存储库的远程指针是否已正确添加:
origin https://github.com/your-username/forked-repository.git (fetch)
origin https://github.com/your-username/forked-repository.git (push)
upstream https://github.com/original-owner-username/original-repository.git (fetch)
upstream https://github.com/original-owner-username/original-repository.git (push)
upstream
现在您可以在命令行上引用而不是编写整个 URL,并且您已准备好将您的复刻与原始存储库同步。
同步分叉
一旦我们配置了一个引用 GitHub 上游和原始存储库的远程,我们就可以同步我们的存储库分支以使其保持最新。
为了在终端窗口中从我们本地存储库的目录同步我们的分支,我们将使用该git fetch
命令从上游存储库中获取分支及其各自的提交。由于我们使用短名称“upstream”来指代上游存储库,我们将把它传递给命令。
根据我们对存储库进行分叉后所做的更改数量,您的输出可能会有所不同,并且可能包含几行关于计数、压缩和解包对象的内容。您的输出将以类似于以下行的方式结束,但可能会有所不同,具体取决于项目中有多少分支:
From https://github.com/original-owner-username/original-repository
* [new branch] main -> upstream/main
现在,对主分支的提交将存储在名为upstream/main
.
让我们切换到我们存储库的本地主分支:
Switched to branch 'main'
我们现在将合并在原始存储库的主分支中所做的任何更改,我们将通过我们的本地upstream/main
分支访问我们的本地主分支:
此处的输出会有所不同,但Updating
如果已进行更改,它将以 or开头Already up-to-date
。如果自从您分叉存储库以来未进行任何更改。
您的分支的主分支现在与上游存储库同步,并且您所做的任何本地更改都没有丢失。
根据您自己的工作流程和您花在更改上的时间,您可以将您的复刻与原始存储库的上游代码同步多次,只要您觉得合适。但是你当然应该在发出拉取请求之前同步你的分支,以确保你不会自动贡献冲突代码。
创建拉取请求
此时,您已准备好向原始存储库发出拉取请求。
您应该导航到您的分叉存储库,然后按页面左侧的新建拉取请求按钮。
您可以在下一个屏幕上修改分支。在任一侧,您都可以从下拉菜单和适当的分支中选择适当的存储库。
例如,一旦您选择了左侧原始存储库的主分支,然后新分支在右侧的分支存储库中,您应该会收到一个屏幕,说明如果没有竞争代码,您的分支可以合并:
您应该在适当的字段中添加标题和评论,然后按创建拉取请求按钮。
此时,原始存储库的维护者将决定是否接受您的拉取请求。在通过提交代码审查接受拉取请求之前,他们可能会要求您编辑或修改代码。
结论
此时,您已成功向开源软件存储库发送拉取请求。在此之后,您应该确保在等待审查时更新和变基您的代码。项目维护者可能会要求您修改代码,因此您应该做好准备。
为开源项目做贡献——并成为一名活跃的开源开发者——是一种有益的经历。定期对您经常使用的软件做出贡献,可以确保该软件对其他最终用户尽可能有价值。
如果您有兴趣了解有关 Git 的更多信息以及在开源软件方面进行协作,您可以阅读我们名为“开源简介”的教程系列。如果您已经熟悉 Git,并且想要备忘单,可以参考“如何使用 Git:参考指南”。