介绍
贡献于开源项目是一个有益的经验,你的工作,使软件更好的为最终用户像你自己。一旦提交Pull请求,对项目作出贡献的过程可能需要在接受之前进行一些重新基准和重新编写代码,然后对分支进行一般清理。 本教程将指导您完成一些你可能需要你提交之后采取的下一步骤 Pull请求到一个开源软件项目。先决条件
本教程将引导您完成Pull请求后需要执行的步骤,因此您应该已经安装了Git,并且已经或正在考虑创建Pull请求。 要了解更多有关促进开源项目,你可以阅读 这篇介绍 。 要了解有关使Pull请求,您可以阅读“ 如何创建GitHub上一Pull请求 。”代码清理和清理注释
如果维护者对您的pull请求没有响应一段时间,或者如果有很多人同时对项目做出贡献,则最近的提交可能会与作为最近的请求的一部分提交的代码相冲突。当这种情况发生时,或者如果维护者要求你,你必须改变你的代码。 rebase使我们能够通过改变承诺,他们是基于中移动的分支机构。 这样,我们可以改变我们的代码,使它们基于主分支的最近提交。 重组应该仔细进行,你应该确保你正在提交正确的提交,并在整个过程中的正确分支。 我们还会去上使用git reflog
命令
下面的情况下,你作出错误。 正如我们在做
Pull教程中 ,我们将移动到代码目录并获取代码的最新的上游版本。
cd repository
git fetch upstream
一旦您获取了项目的上游版本,您可以通过压缩或重写您的提交消息来清理您的意见,以使它们对项目维护者更容易理解。如果你没有做很多小提交,这可能没有必要。 要开始此过程,您将执行交互式rebase。
交互式rebase可以用来编辑以前提交信息,多次提交合并成一个,或删除或恢复是没有必要再提交。为了做到这一点,我们需要能够引用我们通过数字或引用分支基础的字符串提交的提交。 要了解我们提交的提交数量,我们可以使用以下命令检查对项目提交的提交总数:
git log
这将为您提供类似于以下的输出:
Outputcommit 46f196203a16b448bf86e0473246eda1d46d1273
Author: username-2 <email-2>
Date: Mon Dec 14 07:32:45 2015 -0400
Commit details
commit 66e506853b0366c87f4834bb6b39d941cd034fe3
Author: username1 <email-1>
Date: Fri Nov 27 20:24:45 2015 -0500
Commit details
日志显示对给定项目的存储库提交的所有提交,因此您的提交将与其他人提交的提交混合。对于具有由多个作者提交的大量历史的项目,您需要在命令中将自己指定为作者:
git log --author=your-username
通过指定此参数,您应该能够计数您提交的提交。如果您在多个分支工作,你可以添加
--branches[=< branch >]
到命令的末尾按分支来限制。 现在,如果你知道你已经上要变基的分支中的提交数量,你可以简单地运行
git rebase
命令,如下所示:
git rebase -i HEAD~x
在这里,
-i
是指变基是交互式的,并且
HEAD
是指从最新主分支提交。 该
x
将是你在分支上所作因为您最初取来提交的数目。 然而,如果你不知道你在你的分支上有多少提交,你将需要找到哪个提交是分支的基础,你可以通过运行以下命令来做:
git merge-base new-branch master
此命令将返回一个称为提交哈希的长字符串,如下所示:
Output66e506853b0366c87f4834bb6b39d341cd094fe9
我们将使用此承诺哈希传递给
git rebase
命令:
git rebase -i 66e506853b0366c87f4834bb6b39d341cd094fe9
对于上述任一命令,您的命令行文本编辑器将打开一个文件,其中包含您分支中所有提交的列表,现在可以选择是否压缩提交或重新输入提交。
压缩提交
当我们压缩提交消息时,我们正在压缩或组合几个较小的提交到一个较大的提交。 在每个提交之前,你会看到“选择”一词,所以如果你有两个提交,你的文件将看起来像这样:
GNU nano 2.0.6文件:... username / repository / .git / rebase-merge / git-rebase-todo
pick a1f29a6 Adding a new feature
pick 79c0e80 Here is another new feature
# Rebase 66e5068..79c0e80 onto 66e5068 (2 command(s))
现在,除了第一行之外,对于文件的每一行,您应该用单词“squash”替换单词“pick”以组合提交:
GNU nano 2.0.6文件:... username / repository / .git / rebase-merge / git-rebase-todo
pick a1f29a6 Adding a new feature
squash 79c0e80 Here is another new feature
此时,您可以保存并关闭文件,这将打开一个新文件,其中包含所有提交的所有提交消息。您可以根据需要重新输入提交消息,然后保存并关闭文件。 关闭文件后,您会收到反馈:
OutputSuccessfully rebased and updated refs/heads/new-branch.
你现在已经把所有的提交组合成一个通过挤压在一起。
重写提交
重写提交消息是伟大的,当你注意到错别字,或者你意识到你没有使用并行语言的每个提交。 一旦执行如上面所描述的交互式的rebasegit rebase -i
命令,你就会有一个文件打开,看起来像这样:
GNU nano 2.0.6文件:... username / repository / .git / rebase-merge / git-rebase-todo
pick a1f29a6 Adding a new feature
pick 79c0e80 Here is another new feature
# Rebase 66e5068..79c0e80 onto 66e5068 (2 command(s))
现在,对于您要重新输入的每个提交,将“pick”替换为“reword”:
GNU nano 2.0.6文件:... username / repository / .git / rebase-merge / git-rebase-todo
pick a1f29a6 Adding a new feature
reword 79c0e80 Adding a second new feature
# Rebase 66e5068..79c0e80 onto 66e5068 (2 command(s))
一旦保存并关闭文件,将在终端编辑器中显示一个新的文本文件,显示提交消息的修改后的文字。如果要再次编辑文件,可以在保存和关闭文件之前进行。这样做可以确保您的提交消息有用和统一。
完成Rebase
一旦你对提交的数量和相关的提交消息感到满意,你应该在项目的上游代码的最新版本之上完成分支的rebase。为此,您应该从存储库的目录运行此命令:git rebase upstream/master
在这一点上,Git将开始重播您的提交到最新版本的主。如果在这种情况下遇到冲突,Git将暂停,以提示您在继续之前解决冲突。 解决冲突后,您将运行:
git rebase --continue
此命令将指示Git它现在可以继续重播您的提交。 如果以前通过结合使用提交
squash
命令,你只需要一次解决冲突。
使用强制推送更新Pull请求
一旦执行rebase,分支的修改历史,您将不再能够使用git push
命令,因为直接的路径已被修改。 我们将不得不改为使用
--force
或
-f
标志来强制推送更改,通知Git的,你完全知道你是推什么。 让我们先确保我们
push.default
是
simple
,这是在Git的默认2.0+,通过配置吧:
git config --global push.default simple
在这一点上,我们应该通过检查我们正在开发的分支来确保我们在正确的分支上:
git checkout new-branch
OutputAlready on 'new-branch'
. . .
现在我们可以执行force-push:
git push -f
现在,你应该与消息,这是一个一起收到更新的反馈
forced update
。您的请求已更新。
恢复丢失提交
如果在某个时候你抛出了一个你真正想要集成到更大的项目的提交,你应该能够使用Git来恢复提交,你可能已经抛弃了意外。 我们将使用git reflog
命令来查找我们缺少的提交,然后创建从提交一个新的分支。
引用日志是短期的
参考木头 ,树枝时,和其他参考文献的提示本地仓库内的最后更新的记录。 从我们工作的代码库的本地目录,我们将运行命令:
git reflog
一旦你运行这个命令,你会收到输出看起来像这样:
Output46f1962 HEAD@{0}: checkout: moving from branch-1 to new-branch
9370d03 HEAD@{1}: commit: code cleanups
a1f29a6 HEAD@{2}: commit: brand new feature
38f2fc2 HEAD@{3}: commit: remove testing methods
. . .
你提交的信息将让你知道其中的提交是你留下的人,以及相关的字符串将是前
HEAD@{ x }
在终端窗口的左侧信息。 现在,您可以获取该信息并从相关提交创建一个新分支:
git checkout -b new-new-branch a1f29a6
在上面的例子中,我们从第三提交上方显示了一个新的分支,即推出了“全新的功能,”用字符串表示一个
a1f29a6
。 根据你需要从这里做什么,你可以按照设立分支的步骤
上Pull请求本教程中 ,或返回到
当前教程的顶部通过rebase的新的分支工作。
注意 :如果您最近运行git gc
命令清除不必要的文件和优化您可能无法恢复丢失提交的本地仓库。
代码审查
当您提交Pull式请求时,您正在与一个更大的项目进行对话。提交Pull请求是邀请其他人谈论你的工作,就像你自己在谈论和参与一个更大的项目。因为你有一个成功的对话,你是能够沟通 ,为什么你正在通过你提交的信息Pull入请求是很重要的,所以最好是尽可能精确,清晰越好。 Pull请求审查可能是冗长和详细的,取决于项目。最好将流程视为一种学习体验,并且是一个改进代码并使pull请求更好,更符合软件项目需求的好方法。审核应允许您通过维护人员的建议和指导进行更改。 Pull请求将保留来自审阅者的笔记日志,以及您在一起的任何更新和讨论。在接受Pull请求之前,您可能需要在此过程中进行多次额外提交。这是完全正常的,为您作为团队的一部分进行修订提供了一个很好的机会。 你的pull请求将继续通过Git维护,并在整个过程中自动更新,只要你继续添加提交到同一个分支,并推送到你的fork。 虽然你把你的代码在那里到更大的世界进行审查由你的同龄人,你不应该做感觉像审查越来越个性化,所以一定要阅读相关CONTRIBUTION.md
文件或行为守则。重要的是确保您的提交与项目指定的指导方针一致,但如果您开始感到不舒服,您正在开展的项目可能不值得您的贡献。在开源社区有许多欢迎的空间,虽然你可以期待你的代码被密切关注,你收到的所有反馈应该是专业和礼貌。
请求接受并删除您的分支
恭喜!如果您的请求被接受,您已经成功地对一个开源软件项目做出了贡献! 此时,您将需要通过本地存储库将更改返回到您的fork。这是什么,当你通过这个过程去你已经做 同步你的分支 。您可以在终端窗口中使用以下命令执行此操作:git checkout master
git pull --rebase upstream master
git push -f origin master
现在,您应该清除您的本地和远程分支,删除在两个地方创建的分支,因为他们不再需要。首先,我们删除本地分支:
git branch -d new-branch
该
-d
标志添加到
git branch
命令将删除您传递给该命令的分支。 在上面的例子中,它被称为
新的分支 。 接下来,我们将删除远程分支:
git push origin --delete new-branch
删除分支后,您已清除了存储库,您的更改现在存在于主存储库中。您应该记住,只是因为您通过Pull请求所做的更改现在是主存储库的一部分,它们可能无法供下载公开发行版的普通最终用户使用。一般来说,软件维护人员会将几个新功能和修复集中在一起,形成一个公开的版本。