如何重置和更新拉取请求

介绍

对开源项目做出贡献是一种有益的体验,因为您正在努力为像您这样的最终用户改进软件,一旦提交了提交请求,为项目做出贡献的过程可能需要在接受之前对代码进行一些重新建立和重新编辑,然后对您的分支进行一般清理。

本教程将引导您通过一些您可能需要在向开源软件项目提交 拉动请求后采取的下一步。

前提条件

本教程将指导您在提取请求后采取的步骤,因此您应该已经安装了Git,并且已经创建了或正在考虑创建一个提取请求。

从2020年11月开始,GitHub删除了基于密码的身份验证,因此,您需要创建一个个人访问代码(https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token)或添加您的SSH公共密钥信息(https://docs.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account)才能通过命令行访问GitHub存储库。

要了解更多有关贡献开源项目的信息,您可以阅读 此介绍。 要了解如何在 GitHub 上创建提取请求,您可以阅读[如何在 GitHub 上创建提取请求](https://andsky.com/tech/tutorials/how-to-create-a-pull-request-on-github)

复制代码和清理评论

当您对开源代码做出贡献时,您可能会发现您的分支或提取请求和上游代码之间存在冲突。

1[secondary_label Output]
2CONFLICT (content): Merge conflict in your-file.py
3Automatic merge failed; fix conflicts and then commit the result.

或者如下,通过GitHub的网站提取请求:

GitHub pull request conflicts

如果维护人员暂时不响应您的提取请求,或者如果有许多人同时为项目做出贡献,则可能会发生这种情况,并且您仍然想要合并提取请求,则必须解决冲突并重新定义您的代码。

一个 rebase允许我们通过改变他们所依据的 commit 来移动分支机构。这样,我们可以根据主分支机构的最新 commit 来重新分支我们的代码。 重分支机构应该谨慎地进行,并且你应该确保你在整个过程中使用正确的 commit 和正确的 branch。

正如我们在 拉出请求教程中所做的,我们将进入代码目录:

1cd repository

接下来,您要通过使用git checkout命令导航到正确的分支:

1git checkout new-branch

然后,为代码的最新上游版本运行git fetch:

1git fetch origin

一旦您收集了项目的上游版本,您可以通过压缩或重定义您的委托信息来清理您的评论,以使其更容易被项目维护者消化。

要开始这个过程,你将执行一个交互式转换. 一个 交互式转换可以用来编辑以前的委托信息,将多个委托组合成一个,或删除或重置不再需要的委托。

要找出我们已经完成的委托数量,我们可以通过以下命令检查项目已完成的委托总数:

1git log

这将为您提供类似于此的输出:

 1[secondary_label Output]
 2commit 46f196203a16b448bf86e0473246eda1d46d1273
 3Author: username-2 <email-2>
 4Date:   Mon Dec 14 07:32:45 2015 -0400
 5
 6    Commit details
 7
 8commit 66e506853b0366c87f4834bb6b39d941cd034fe3
 9Author: username1 <email-1>
10Date:   Fri Nov 27 20:24:45 2015 -0500
11
12    Commit details

日志显示了给定项目的存储库中所做的所有委托,因此您的委托将列出,以及其他人所做的委托。

1git log --author=your-username

通过指定此参数,您应该能够计算您创建的委托,如果您正在处理多个分支,您可以将 --分支[=<分支>] 添加到命令的末尾以限制分支。

现在,如果您知道您在您想要重新定位的分支上完成的委托数量,则可以执行git rebase命令:

1git rebase -i HEAD~x

在这里,‘-i’指的是反向是互动的,而‘HEAD’指的是来自主要分支的最新委托,‘x’将是您从最初采集到分支以来对分支的委托数量。

但是,如果您不知道您在分支机构中做了多少委托,则需要找到哪个委托是分支机构的基础,您可以执行以下命令:

1git merge-base new-branch main

此命令会返回一个被称为 commit 哈希的长串,它看起来如下:

1[secondary_label Output]
266e506853b0366c87f4834bb6b39d341cd094fe9

我们将使用这个 commit hash 来传递到git rebase命令:

1git rebase -i 66e506853b0366c87f4834bb6b39d341cd094fe9

对于上述任何一个命令,您的命令行文本编辑器将打开一个包含您分支中的所有委托列表的文件,您现在可以选择将委托压缩或重定义。

Squash 承诺

当我们压缩承诺信息时,我们正在压缩或将几个较小的承诺合并成一个更大的承诺。

在每个委托前面,你会看到选择这个词,所以如果你有两个委托,你的文件将看起来类似:

1[label GNU nano 2.0.6 File: ...username/repository/.git/rebase-merge/git-rebase-todo]
2pick a1f29a6 Adding a new feature
3pick 79c0e80 Here is another new feature
4
5# Rebase 66e5068..79c0e80 onto 66e5068 (2 command(s))

现在,除了第一个行之外,对于文件的每个行,你应该用squash来代替pick这个词来组合承诺:

1[label GNU nano 2.0.6 File: ...username/repository/.git/rebase-merge/git-rebase-todo]
2pick a1f29a6 Adding a new feature
3squash 79c0e80 Here is another new feature

在此时,您可以保存和关闭该文件,该文件将打开一个新的文件,该文件将所有 commit 消息组合在一起. 您可以按您认为合适的方式重新编写 commit 消息,然后保存和关闭文件。

您将在关闭文件后收到反馈:

1[secondary_label Output]
2Successfully rebased and updated refs/heads/new-branch.

现在你已经将所有承诺合并到一个,将它们撕裂在一起。

重申承诺

重新编写 commit 消息是很好的,当你注意到一个 typpo,或者你意识到你不是在使用平行语言的每个你的 commit。

一旦您使用git rebase -i命令执行上文所述的交互式翻译,您将打开一个看起来像这样的文件:

1[label GNU nano 2.0.6 File: ...username/repository/.git/rebase-merge/git-rebase-todo]
2pick a1f29a6 Adding a new feature
3pick 79c0e80 Here is another new feature
4
5# Rebase 66e5068..79c0e80 onto 66e5068 (2 command(s))

现在,对于您想要重定义的每一个承诺,替换选择一词为重定义:

1[label GNU nano 2.0.6 File: ...username/repository/.git/rebase-merge/git-rebase-todo]
2pick a1f29a6 Adding a new feature
3reword 79c0e80 Adding a second new feature
4
5# Rebase 66e5068..79c0e80 onto 66e5068 (2 command(s))

一旦您保存并关闭该文件,新文本文件将出现在您的终端编辑器中,该文本显示了 commit 消息的修改文本. 如果您想再次编辑该文件,您可以在保存和关闭文件之前这样做。

完成后台

一旦你对你所做的承诺数量和相关的承诺消息感到满意,你就应该在项目上流代码的最新版本上完成你的分支的翻译,要做到这一点,你应该从你的库目录中运行这个命令:

1git rebase origin/main

在此时,Git 将开始重新播放您的承诺到最新版本的主要版本. 如果您在发生冲突时遇到冲突,Git 将暂停,要求您在继续之前解决冲突。

1[secondary_label Output]
2Current branch new-branch is up to date.

一旦您解决了冲突,您将运行:

1git rebase --continue

此命令将向 Git 表示,它现在可以继续播放您的承诺。

如果您以前使用了squash命令来组合承诺,您只需要解决冲突一次。

使用 Force-Push 更新提取请求

一旦您执行翻译,您的分支历史发生变化,您不再可以使用git push命令,因为直接路径已被修改。

相反,我们将不得不使用力量f的旗帜来强行推动更改,并告知Git你完全知道你正在推动什么。

让我们先确保我们的push.default简单,这是Git 2.0+中的默认设置:

1git config --global push.default simple

在这一点上,我们应该通过检查我们正在工作的分支机构来确保我们在正确的分支机构:

1git checkout new-branch
1[secondary_label Output]
2Already on 'new-branch'
3. . .

现在我们可以执行 force-push:

1git push -f

现在您应该收到有关您的更新的反馈,以及这是一项强迫更新的消息。

恢复失去的承诺

如果在某个时刻,你丢弃了你真正想要整合到更大的项目的委托,你应该能够使用Git来恢复你可能意外丢弃的委托。

我们将使用git reflog命令来找到我们缺少的承诺,然后从该承诺中创建一个新的分支。

**Reflog 是指 ** 参考日志,记录了分支和其他参考的提示在本地存储中上次更新时。

从我们正在工作的代码存储库的本地目录中,我们将运行命令:

1git reflog

一旦运行此命令,您将收到看起来如下的输出:

1[secondary_label Output]
246f1962 HEAD@{0}: checkout: moving from branch-1 to new-branch
39370d03 HEAD@{1}: commit: code cleanups
4a1f29a6 HEAD@{2}: commit: brand new feature 
538f2fc2 HEAD@{3}: commit: remove testing methods 
6. . .

您的 commit 訊息會讓您知道哪個 commits 是您留下的,相應的字符串會在您的終端窗口左側的「HEAD@{x}」信息之前。

现在您可以从相关的委托中获取这些信息并创建一个新分支:

1git checkout -b new-new-branch a1f29a6

在上面的示例中,我们从上面显示的第三个委托中创建了一个新分支,该分支推出了一个全新的功能,由字符串a1f29a6表示。

取决于您从这里需要做什么,您可以遵循在 此引导引导请求中设置分支部的步骤,或返回到 当前教程的顶部通过重新建立新分支部进行工作。

<$>[注意] 注意:如果您最近运行了git gc命令来清理不必要的文件并优化本地存储库,则可能无法恢复丢失的委托。

在代码审查中可以期待什么

当你提交一个提交请求时,你正在与一个更大的项目进行对话。提交一个提交请求是邀请其他人谈论你的工作,就像你自己在谈论和参与一个更大的项目一样。

提取请求的审查可能很长和详细,取决于项目,最好把这个过程看作是一种学习体验,也是你改进代码,让提取请求更好,更符合软件项目的需求的好方法。

提取请求将记录评论员的笔记以及您一起进行的任何更新和讨论。在接受提取请求之前,您可能需要在整个过程中做出几个额外的承诺。

您的拉动请求将继续通过Git进行维护,并在整个过程中自动更新,只要您继续在同一分支中添加承诺并将这些添加到您的叉子上。

虽然你正在把你的代码放到更大的世界中来审查你的同行,你永远不应该觉得评论变得个人,所以一定要阅读相关的CONTRIBUTION.md文件或行为准则。重要的是要确保你的承诺符合项目规定的指导方针,但如果你开始感到不舒服,你正在工作的项目可能不值得你的贡献。在开源社区中有很多欢迎的空间,而你可以期望你的代码被视为一个批判性的眼睛,你得到的所有反馈都应该是专业和礼貌。

提取接受请求并删除您的分支

如果您的提取请求已被接受,您已成功为开源软件项目做出贡献!

在此时,您需要通过本地存储器将所做的更改拖回您的叉子中,这是您在通过 sync your fork的过程时已经完成的。

1git checkout main
2git pull --rebase origin main
3git push -f origin main

现在,您应该通过删除您在两个地方创建的分支机构来清理本地和远程分支机构,因为它们不再需要。

1git branch -d new-branch

git branch命令添加的-d旗将删除您传递给命令的分支,在上面的示例中,它被称为新分支。

接下来,我们将删除远程分支:

1git push origin --delete new-branch

随着分支被删除,您已经清理了存储库,并且您的更改现在生活在主存储库中。您应该记住,因为您通过抽取请求所做的更改现在是主存储库的一部分,所以它们可能不适用于下载公共版本的平均最终用户。

结论

本教程将您带到以下几个步骤中,您可能需要在向开源软件存储库提交 拉动请求后完成。

贡献开源项目 - 并成为一个活跃的开源开发人员 - 往往是一个有益的经验. 定期对您经常使用的软件做出贡献有助于确保它对其用户社区有价值和有用。

Published At
Categories with 技术
comments powered by Disqus