通过拉取请求撤消合并?

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


这个问题有一个更好的答案,但我可以一步一步地解决这个问题。

您将需要获取并签出最新的上游更改,例如:

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。

在上面的例子中,合并提交是它所说的“合并请求#123 ...”的最高层。

这样做可以恢复两个更改(“添加栏”和“添加foo”),并且最终将在一次提交中恢复整个请求,您可以稍后进行恢复,并保持更改历史记录的清洁:

git revert -m 1 b76a5f1f5d3b323679e466a1a1d5f93c8828b269

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

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


(在更多信息的评论后编辑:)

好的,让我们看看图表:

我认为最后一个(最右边的)提交是通过拉取请求进行的错误合并,合并了此处显示的蓝线。 你最后一次的良好承诺将是之前在黑线上的那个,在这里标记为红色:

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

这意味着,在你的本地工作副本中(确保你没有更多未提交的东西,例如通过git存储):

git checkout master
git reset --hard 7a62674ba3df0853c63539175197a16122a739ef
gitk 

现在确认您确实在我标记的提交内容中,并且您将看不到其祖先中的所有提取内容。

git push -f origin master

(如果你的github remote被命名为origin - 否则改名字)。

现在,所有东西都应该在github上正确显示。 提交仍然在您的存储库中,但任何分支都无法访问,因此不应该在那里造成任何伤害。 (当然,他们仍然会在RogerPaladin的仓库中。)

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

请注意 ,如果其他人已经用错误的提交方式拉下了主人,他们就会遇到与您现在一样的问题,并且无法真正回馈。 在重置为新的主版本之前。

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

为将来:

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


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

git reset --hard HEAD~1
链接地址: http://www.djcxy.com/p/16977.html

上一篇: Undo a merge by pull request?

下一篇: Bitbucket, accidentally pulled wrong branch