通过拉取请求撤消合并?

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

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

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

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

看看提交日志,你应该find类似这样的东西:

 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” ),最后在一个提交中恢复整个请求,你可以稍后恢复,并保持更改的历史logging清晰:

 git revert -m 1 b76a5f1f5d3b323679e466a1a1d5f93c8828b269 

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

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


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

好的,让我们看看图:

屏幕截图1

我假设最后一个(最右边的)提交是通过pull请求进行的错误合并 ,合并了此处显示的蓝线。 你的最后一个好的承诺是在黑线上的那个,在这里标记为红线:

在这里输入图像说明

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

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

 git checkout master git reset --hard 7a62674ba3df0853c63539175197a16122a739ef gitk 

现在确认你真的在我标记的那个提交,你将不会看到其祖先的东西。

 git push -f origin master 

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

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

(可能有一个Github特定的networking方式做同样的事情,但我不太熟悉Github和它的拉取请求pipe理系统。)

请注意 ,如果其他人已经可能已经把你的主人拉错了,他们就会遇到和你现在一样的问题,并且不能真正回馈。 在重置到您的新主版本之前。

如果可能发生这种情况,或者您只是想避免任何问题,请使用git revert命令而不是git reset ,以使用新的提交来恢复更改,而不是设置回旧的更改。 (有些人认为你不应该使用发布的分支重置。)请参阅这个问题的其他答案如何做到这一点。

为将来:

如果你只想要RogerPaladin分支的一些提交,可以考虑使用cherry-pick而不是merge 。 或者与RogerPaladin通信将其移动到单独的分支并发送新的请求。

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

 git reset --hard HEAD~1 

从2014年6月24日起,您可以尝试轻松取消公关(请参阅“ 恢复拉取请求 ”):

介绍恢复button

您可以通过单击还原轻松地还原GitHub上的请求:

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

系统会提示您使用恢复的更改创build新的请求。

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

它仍然有待testing,但是如果该回复使用-m或不(也用于还原合并)

要通过提交而不需要删除的github拉取请求,必须运行:

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

提交散列是合并请求的提交前提交。 这将从pull请求中删除所有提交而不影响历史logging中的任何提交。

find这个的一个好方法是去现在closures的pull请求并find这个字段:

拉取请求图片 拉取请求图片

运行git reset ,运行:

git push origin --force <branch name>

这应该在pull请求之前将分支恢复回来,而不影响分支中任何提交的提交请求提交提交之间的提交历史logging。

编辑:

如果您要在拉取请求上单击还原button,则会在分支上创build额外的提交。 它不会拒绝或取消。 这意味着如果你要打回复button,你不能打开一个新的拉取请求来重新添加所有这些代码。

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

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

我只是想git reset --hard一下“很久以前”,然后快速回到之前做拉请求的地方。

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

 git reset --hard 9271e6e 

和Git中的大多数事情一样,如果你这样做并不容易,那么你可能做错了。