216

有人接受了他们不应该接受的拉取请求。现在我们合并了一堆损坏的代码。如何撤消拉取请求?我只是要在合并之前恢复对提交的更改,但我注意到它合并成一堆提交。所以现在有这个人在合并前几天的所有这些提交。你如何撤消这个?

4

8 回答 8

226

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

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

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

查看提交日志,您应该会发现类似以下内容:

commit b76a5f1f5d3b323679e466a1a1d5f93c8828b269
Merge: 9271e6e a507888
Author: Tim Tom <tim@tom.com>
Date:   Mon Apr 29 06:12:38 2013 -0700

    Merge pull request #123 from john/foo_and_bar

    Add foo and bar

commit a507888e9fcc9e08b658c0b25414d1aeb1eef45e
Author: John Doe <john@doe.com>
Date:   Mon Apr 29 12:13:29 2013 +0000

    Add bar

commit 470ee0f407198057d5cb1d6427bb8371eab6157e
Author: John Doe <john@doe.com>
Date:   Mon Apr 29 10:29:10 2013 +0000

    Add foo

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

在上面的示例中,合并提交是上面写着"Merged pull request #123..."的提交。

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

git revert -m 1 b76a5f1f5d3b323679e466a1a1d5f93c8828b269
于 2013-04-30T11:03:38.677 回答
90

查看您的提交图(使用 gitk 或类似程序)。您将看到来自拉取请求的提交,您将看到自己的提交和合并提交(如果它不是快进合并)。你只需要在合并之前找到你自己的最后一个提交,并将分支重置为这个提交。

(如果您有分支的 reflog,那么在合并之前找到提交应该会更容易。)


(在评论中提供更多信息后进行编辑:)

好的,让我们看一下图表:

截图 1

我假设最后一次(最右边的)提交是您通过 pull request 进行的错误合并,它合并了此处看到的蓝线。你最后一次好的提交将是之前在黑线上的那个,这里用红色标记:

在此处输入图像描述

重置到这个提交,你应该没问题。

这意味着,在您的本地工作副本中执行此操作(在确保您没有更多未提交的内容之后,例如通过 git stash):

git checkout master
git reset --hard 7a62674ba3df0853c63539175197a16122a739ef
gitk 

现在确认你真的在我在那里标记的提交上,你不会在它的祖先中看到任何被拉取的东西。

git push -f origin master

(如果您的 github 远程被命名origin- 否则更改名称)。

现在一切都应该在 github 上看起来正确了。提交仍将在您的存储库中,但任何分支都无法访问,因此不应在那里造成任何伤害。(当然,它们仍然在 RogerPaladin 的存储库中。)

(可能有一个 Github 特定的 Web 方式来做同样的事情,但我对 Github 及其拉取请求管理系统不太熟悉。)

请注意,如果其他人可能已经通过错误的提交拉动了您的 master,那么他们就会遇到与您当前相同的问题,并且无法真正做出贡献。在重置为新的主版本之前。

如果很可能发生了这种情况,或者您只是想避免任何问题,请使用git revert命令而不是git reset, 通过新提交恢复更改,而不是设置回旧提交。(有些人认为您永远不应该对已发布的分支进行重置。)请参阅此问题的其他答案以了解如何执行此操作。

为未来:

如果您只想要 RogerPaladin 分支的一些提交,请考虑使用cherry-pick而不是merge. 或者与 RogerPaladin 沟通以将它们移动到单独的分支并发送新的拉取请求。

于 2011-06-26T01:48:55.190 回答
42

如果拉是他做的最后一件事

git reset --hard HEAD~1
于 2013-02-27T16:26:02.090 回答
38

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

介绍还原按钮

您可以通过单击 Revert 轻松地恢复 GitHub 上的拉取请求:

https://camo.githubusercontent.com/0d3350caf2bb1cba53123ffeafc00ca702b1b164/68747470733a2f2f6769746875622d696d616765732e73332e616d617a6f6e6177732e636f6d2f68656c702f70756c6c5f72657175657374732f7265766572742d70756c6c2d726571756573742d6c696e6b2e706e67

系统将提示您使用还原的更改创建新的拉取请求:

https://camo.githubusercontent.com/973efae3cc2764fc1353885a6a45b9a518d9b78b/68747470733a2f2f6769746875622d696d616765732e73332e616d617a6f6e6177732e636f6d2f68656c702f70756c6c5f72657175657374732f7265766572742d70756c6c2d726571756573742d6e65772d70722e706e67

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

Adil H Raza在评论中补充道(2019 年 12 月):

这是预期的行为,它创建了一个新分支,您可以从这个新分支创建一个 PR 到您的master.
这样,将来您可以在需要时取消还原,这是最安全的选择,而不是直接更改您的master.


警告Korayem在评论中指出:

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

Korayem 向我们介绍了“ Github:Revert ( git cherry-pick, git rebase)后忽略的更改”以获取更多信息。

于 2014-06-27T19:17:22.123 回答
11

要撤消包含您不想删除的提交的 github 拉取请求,您必须运行:

git reset --hard --merge <commit hash>

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

找到这个的一个好方法是转到现在关闭的拉取请求并找到这个字段:

拉取请求图像 拉取请求图像

运行后git reset,运行:

git push origin --force <branch name>

这应该在拉取请求之前将分支恢复回来,而不会影响分支中的任何提交,这些提交会在来自拉取请求的提交之间的提交历史记录中出现。

编辑:

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

于 2017-07-18T18:53:40.793 回答
1

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

我正在寻找如何撤消拉取请求并来到这里。

我正要git reset --hard“很久以前”并快进回到我在做拉取请求之前的位置。

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

git reset --hard 9271e6e

与 Git 中的大多数事情一样,如果您以某种不容易的方式进行操作,那么您可能做错了。

于 2017-04-27T16:59:21.647 回答
0

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

git reflog

您的最后一次提交可能应该在'HEAD@{0}'. 您可以使用您的提交消息检查相同的内容。要转到该点,请使用命令

git reset --hard 'HEAD@{0}'

您的合并将被还原。如果您还有新文件,请从合并中丢弃这些更改。

于 2020-12-11T07:40:11.380 回答
-1

如果您想撤消拉取请求,我们可以按照以下步骤操作 -

所有拉取请求的活动列表 -

git reflog

在此处输入图像描述

运行上述命令后,将出现此输出。

然后运行重置命令-

git reset --hard 6954dff92

其中6954dff92合并 id,并且您的代码根据合并 id 更新。

谢谢,希望对您有所帮助,请点赞和支持。

于 2021-06-15T12:12:28.207 回答