介绍
自由和开源,Git是一个分布式版本控制系统,使基于团队和开源软件项目更易于管理。 许多项目将它们的文件保存在一个Git仓库中,像GitHub这样的站点使得代码的共享和贡献变得简单,有价值和有效。
托管在公共存储库中的开源项目受益于更广泛的开发人员社区通过pull请求的贡献,pull请求要求项目接受对其代码库所做的更改。
本教程将指导您通过命令行向Git存储库发出拉取请求,以便您可以对开源软件项目做出贡献。
先决条件
你应该在本地机器上安装Git。 您可以检查是否已安装在计算机上的Git并通过安装过程中为您的操作系统按照本指南 。
您还需要拥有或创建一个GitHub帐户。 你可以通过GitHub的网站,这样做github.com ,并可以登录或创建您的帐户。
最后,你应该确定一个开源软件项目来做贡献。 你可以通过阅读更熟悉开源项目这个介绍 。
创建存储库的副本
存储库 ,或回购的简称,本质上是一个项目的主文件夹。 存储库包含所有相关的项目文件,包括文档,还存储每个文件的修订历史。 在GitHub上,存储库可以有多个协作者,可以是公共的也可以是私有的。
为了在开源项目上工作,您首先需要创建自己的存储库副本。 为此,应该分叉存储库,然后克隆它,以便拥有本地工作副本。
分叉存储库
您可以轻松地在GitHub上分配存储库,方法是使用浏览器导航到您希望贡献的开源项目的GitHub URL。
GitHub存储库URL将引用与存储库所有者相关联的用户名以及存储库名称。 例如,DigitalOcean是所有者NETBOX项目库,所以GitHub的URL该项目是:
https://github.com/digitalocean/netbox
在上面的例子中,digitalocean是用户名和NETBOX是存储库名称。
一旦你确定了你想要贡献的项目,你可以导航到URL,格式如下:
https://github.com/username/repository
或者您可以使用GitHub搜索栏搜索项目。
当您位于存储库的主页面上时,您会在页面右上方的用户图标下方看到一个“Fork”按钮:
单击fork按钮开始分叉过程。 在浏览器窗口中,您会收到以下反馈:
一旦过程完成,您的浏览器将转到类似于上面的存储库图像的屏幕,除了在顶部,您将在存储库名称之前看到您的用户名,并且在URL中它也将在存储库名称之前说您的用户名。
因此,在上面的例子中,而不是在页面顶部digitalocean / NETBOX,你会看到你的-的用户名 / NETBOX,以及新的URL看起来是这样:
https://github.com/your-username/netbox
使用存储库分叉,您可以克隆它,以便您拥有本地代码库的工作副本。
克隆存储库
要创建您想要贡献的存储库的本地副本,让我们先打开一个终端窗口。
我们将使用git clone
以及命令指向你的库叉的URL。
此URL将类似于上面的网址,除了现在将与结束.git
。 在上面的NetBox示例中,URL将如下所示:
https://github.com/your-username/netbox.git
您也可以使用您从原始存储库页面分叉的存储库页面中的绿色“克隆或下载”按钮复制URL。 点击该按钮后,您可以通过点击网址旁边的文件夹按钮来复制网址:
一旦我们有了URL,我们就可以克隆仓库了。 要做到这一点,我们将结合git clone
与资源库中的URL命令:
git clone https://github.com/your-username/repository.git
现在我们有一个本地代码的副本,我们可以继续创建一个新的分支,使用该代码。
创建新分支
每当您在协作项目上工作时,您和其他对存储库贡献的程序员都会对新功能或修复立即有不同的想法。 其中一些新功能将不会花费大量时间来实现,但其中一些将持续。 因此,重要的是分支存储库,以便您能够管理工作流,隔离您的代码,并控制哪些功能使它回到项目存储库的主分支。
项目库的默认主枝通常称为主分支。 一个常见的最佳实践是将主分支上的任何东西考虑为可随时部署以供其他人使用。
当创建分支时,从主分支创建新分支是非常重要的。 您还应该确保您的分支名称是一个描述性的。 而不是调用它my-branch
,你应该去frontend-hook-migration
或fix-documentation-typos
代替。
要创建我们的分支,从我们的终端窗口,让我们改变我们的目录,使我们在仓库的目录中工作:
cd repository
现在,我们将创造我们的新分支git branch
命令。 请确保以描述性的方式命名,以便其他正在处理项目的人员了解您正在使用的工作。
git branch new-branch
现在我们的新分支被创建,我们可以切换,以确保我们在该分支工作使用git checkout
命令:
git checkout new-branch
一旦你进入了git checkout
命令,您将收到以下的输出:
OutputSwitched to branch 'new-branch'
另外,您也可以凝聚以上两个命令,创建并切换到一个新的分支,用下面的命令和-b
标志:
git checkout -b new-branch
如果你想切换回主,您将使用checkout
命令与主分支的名称:
git checkout master
在checkout
的命令可以让你多个分支之间切换,这样你就可以在多个功能一次潜在的工作。
此时,您现在可以修改现有文件或向您自己的分支上的项目添加新文件。
在本地进行更改
一旦你已经修改了现有的文件或添加新的文件到项目中,则可以将其添加到您的本地资源库,我们可以用做git add
命令。 让我们添加了-A
标志来补充,我们所做的所有更改:
git add -A
接下来,我们将要记录我们系统信息库与变化git commit
命令。
提交消息是你的代码贡献的一个重要方面; 它帮助其他贡献者完全理解你所做的改变,为什么你做它,以及它是多么重要。 此外,提交消息提供了整个项目的更改的历史记录,帮助未来的贡献者。
如果我们有一个很短的消息,我们可以记录,与-m
标志和报价信息:
git commit -m "Fixed documentation typos"
但是,除非它是一个非常小的变化,我们将更可能希望包括一个更长的提交消息,以便我们的合作者完全加速我们的贡献。 为了记录这个更大的消息,我们将运行git commit
命令,它会打开默认的文本编辑器:
git commit
如果你想配置默认的文本编辑器,你可以用这样做的git config
命令,设置nano作为默认编辑器,例如:
git config --global core.editor "nano"
或vim:
git config --global core.editor "vim"
运行后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将使用以下命令提交:
git status
根据您所做的更改,您将收到类似于以下内容的输出:
OutputOn branch new-branch
Your branch is ahead of 'origin/new-branch' by 1 commit.
(use "git push" to publish your local commits)
nothing to commit, working directory clean
在这一点上,你可以使用git push
命令推更改您的叉仓库的当前分支:
git push --set-upstream origin new-branch
该命令将提供输出,让您知道进度,它将看起来类似于以下内容:
OutputCounting 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 /respository .git
a1f29a6..79c0e80 new-branch -> new-branch
Branch new-branch set up to track remote branch new-branch from origin.
现在,您可以导航到GitHub网页上的分支存储库,并切换到您刚才推送的分支,以查看您在浏览器中所做的更改。
在这一点上,有可能使pull请求原来的资源库,但如果你还没有这样做的话,你要确保你的本地库是最新的最新与上游资源库。
更新本地存储库
当您与其他贡献者一起工作时,重要的是让您的本地存储库与项目保持同步,因为您不希望对将导致冲突的代码进行拉取请求。 要更新代码库的本地副本,您需要同步更改。
我们将首先为分叉配置远程,然后同步分支。
为分叉配置远程
远程仓库有可能使你与他人在Git项目合作。 每个远程存储库是托管在Internet上或您有权访问的网络上的项目版本。 根据您的用户权限,每个远程存储库都应该是只读或读写访问的。
为了能够与您正在使用的原始存储库进行同步更改,您需要配置引用上游存储库的远程。 您应该只将远程设置到上游存储库一次。
让我们首先检查您配置的远程服务器。 该git remote
命令将列出任何远程仓库已经指定,因此,如果您克隆你的仓库象我们上面那样,你至少看产地资源库,这是对的Git克隆目录中给出的默认名称。
从我们的终端窗口仓库的目录,让我们使用git remote
与一起命令-v
标志显示Git有伴随着相应的远程存储简短名字(如“原产地”)的网址:
git remote -v
因为我们克隆了一个仓库,我们的输出应该看起来像这样:
Outputorigin https://github.com/your-username/forked-repository.git (fetch)
origin https://github.com/your-username/forked-repository.git (push)
如果您之前已经设置了多个远程的git remote -v
命令将提供所有的人的名单。
接下来,我们将指定一个新的远程上游存储库,以便我们与fork同步。 这将是我们分叉的原始存储库。 我们将做到这一点的git remote add
命令。
git remote add upstream https://github.com/original-owner-username/original-repository.git
在本例中, upstream
是我们为远程存储库自GIT中的条款所提供的短名称,“上游”指的是我们从克隆的库中。 如果我们要向协作者的存储库添加远程指针,我们可能需要提供该协作者的用户名或缩写为短名称的昵称。
我们可以验证我们的远程指向上游库被正确使用添加git remote -v
再次命令从储备库目录:
git remote -v
Outputorigin 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”来引用上游仓库,我们将把它传递给命令:
git fetch upstream
根据我们分配存储库后进行的更改,您的输出可能不同,并且可能包括计数,压缩和解包对象的几行。 您的输出将类似于以下行结束,但可能会根据项目中有多少个分支而有所不同:
OutputFrom https://github.com/original-owner-username/original-repository
* [new branch] master -> upstream/master
现在,致力于主分支将被存储在一个名为一个本地分支upstream/master
。
让我们切换到我们的仓库的本地master分支:
git checkout master
OutputSwitched to branch 'master'
我们现在将合并在原始存储库的主分支中进行的任何更改,我们将通过我们的本地上游/主分支,与本地主分支进行访问:
git merge upstream/master
这里的输出会有所不同,但它会首先Updating
,如果已经作了修改,或Already up-to-date.
如果因为你分叉库已作出任何更改。
您的fork的主分支现在与上游存储库同步,并且您所做的任何本地更改都不会丢失。
根据您自己的工作流程和花费在更改上的时间,您可以将fork与原始存储库的上游代码同步多次,因为它对您有意义。 但是你应该在发出pull请求之前立即同步你的fork,以确保你不会贡献冲突的代码。
创建请求
此时,您可以向原始存储库发出拉式请求。
您应该导航到您的分支存储库,然后按页面左侧的“新建请求”按钮。
您可以在下一个屏幕上修改分支。 在任一站点上,您可以从下拉菜单和相应的分支中选择相应的存储库。
一旦你选择,例如,在左侧的原始存储库的主分支,和你的分支的右边的存储库的新分支 ,你应该看到一个屏幕,看起来像这样:
GitHub会提醒你,你可以合并两个分支,因为没有竞争代码。 您应该添加标题,注释,然后按“创建拉式请求”按钮。
此时,原始存储库的维护者将决定是否接受您的pull请求。 在接受拉取请求之前,他们可能会要求您编辑或修改代码。
结论
此时,您已成功发送拉取请求到开源软件存储库。 接下来,您应该确保在等待审核代码的同时更新和重新编译代码。 项目维护者可能会要求您重新编写代码,因此您应该准备这样做。
贡献于开源项目 - 并成为一个活跃的开源开发人员,可以是一个有益的经验。 定期为您经常使用的软件做出贡献,您可以确保该软件对其他最终用户同样有价值。