有人接受了他们不该接受的请求。现在我们合并了一堆破碎的代码。如何撤销拉请求?我只是打算在合并之前将更改恢复到提交,但我注意到它合并了一堆提交。这是这个人在合并前提交的所有文件。你该怎么做呢?


当前回答

这个问题有一个更好的答案,尽管我可以一步一步地分解它。

你需要像这样获取和签出最新的上游更改,例如:

git fetch upstream
git checkout upstream/master -b revert/john/foo_and_bar

查看一下提交日志,你应该会发现类似这样的东西:

提交b76a5f1f5d3b323679e466a1a1d5f93c8828b269 合并:9271e6e a507888 作者:Tim Tom <tim@tom.com> 日期:2013年4月29日星期一06:12:38 -0700 Merge pull request #123 from john/foo_and_bar 添加foo和bar 提交a507888e9fcc9e08b658c0b25414d1aeb1eef45e 作者:John Doe <john@doe.com> 日期:2013年4月29日星期一12:13:29 +0000 添加栏 提交470年ee0f407198057d5cb1d6427bb8371eab6157e 作者:John Doe <john@doe.com> 日期:4月29日星期一10:29:10 2013 +0000 增加foo

现在您希望恢复整个拉请求,并能够在以后取消恢复。 为此,您需要获取合并提交的ID。

在上面的例子中,合并提交是最上面的一个,上面写着“Merged pull request #123…”

这样做可以恢复这两个更改(“Add bar”和“Add foo”),你最终会在一次提交中恢复整个pull请求,你可以在以后取消恢复,并保持更改历史干净:

git revert -m 1 b76a5f1f5d3b323679e466a1a1d5f93c8828b269

其他回答

如果您给出以下命令,您将得到包括提交、合并在内的活动列表。

git 引用日志

你的最后一次提交应该是在'HEAD@{0}'。你可以同样检查你的提交信息。 要到达那个点,使用命令

git重置—hard 'HEAD@{0}'

您的合并将被恢复。如果您有新的文件,请丢弃合并中的更改。

这个问题有一个更好的答案,尽管我可以一步一步地分解它。

你需要像这样获取和签出最新的上游更改,例如:

git fetch upstream
git checkout upstream/master -b revert/john/foo_and_bar

查看一下提交日志,你应该会发现类似这样的东西:

提交b76a5f1f5d3b323679e466a1a1d5f93c8828b269 合并:9271e6e a507888 作者:Tim Tom <tim@tom.com> 日期:2013年4月29日星期一06:12:38 -0700 Merge pull request #123 from john/foo_and_bar 添加foo和bar 提交a507888e9fcc9e08b658c0b25414d1aeb1eef45e 作者:John Doe <john@doe.com> 日期:2013年4月29日星期一12:13:29 +0000 添加栏 提交470年ee0f407198057d5cb1d6427bb8371eab6157e 作者:John Doe <john@doe.com> 日期:4月29日星期一10:29:10 2013 +0000 增加foo

现在您希望恢复整个拉请求,并能够在以后取消恢复。 为此,您需要获取合并提交的ID。

在上面的例子中,合并提交是最上面的一个,上面写着“Merged pull request #123…”

这样做可以恢复这两个更改(“Add bar”和“Add foo”),你最终会在一次提交中恢复整个pull请求,你可以在以后取消恢复,并保持更改历史干净:

git revert -m 1 b76a5f1f5d3b323679e466a1a1d5f93c8828b269

从2014年6月24日开始,您可以尝试轻松取消PR(参见“恢复拉请求”):

介绍恢复按钮

你可以通过单击revert在GitHub上轻松恢复拉请求:

系统会提示你创建一个新的pull请求,并将更改还原:

它仍然有待测试,如果恢复使用-m或不(用于恢复合并)

但阿迪勒·H·拉扎在评论中补充道(2019年12月):

这是预期的行为,它创建了一个新分支,您可以从这个新分支创建一个PR到您的master。 这样在未来你可以取消恢复,如果需要,这是最安全的选择,而不是直接改变你的主。


警告:Korayem在评论中指出:

在恢复之后,假设您对Git分支做了一些进一步的更改,并从相同的源/目标分支创建了一个新的PR。 你会发现PR只显示了新的更改,而没有显示还原之前的内容。

Korayem让我们参考“Github:在恢复后忽略更改(git cherry-pick, git rebase)”了解更多信息。


另外:

用于恢复拉取请求的API(2023年1月) 现在可以使用GraphQL突变来恢复合并的拉请求:revertPullRequest。 与web中拉请求页面上的恢复操作一样,调用此API创建一个新的拉请求,该请求将反转合并的拉请求所做的更改。 了解有关恢复拉取请求的详细信息。

我一直用这个地方,谢谢。

我在搜索如何撤销拉请求,然后到了这里。

我正准备重新开始,很难回到"很久以前"然后 快进到我做拉请求之前的地方。

除了看这里,我还问我的同事他会做什么, 他有一个典型的好答案:使用输出的例子 上面的第一个答案:

git reset --hard 9271e6e

和Git中的大多数事情一样,如果你用某种不容易的方式来做, 你可能做错了。

要撤消一个你不想删除的github拉请求,你必须运行一个:

Git重置——hard——merge <commit hash>

提交哈希是合并pull请求之前的提交。这将从pull请求中删除所有提交,而不会影响历史记录中的任何提交。

找到它的一个好方法是去现在关闭的pull request并找到这个字段:

拉请求图像

运行git重置后,运行:

Git push origin——force <分支名称>

这应该会将分支恢复到拉请求之前,而不会影响在拉请求提交之间的提交历史中插入的分支中的任何提交。

编辑:

如果您在拉取请求上单击还原按钮,这将在分支上创建一个额外的提交。它不会取消提交或取消合并。这意味着,如果您要点击还原按钮,则无法打开新的拉取请求来重新添加所有这些代码。