通过拉取请求撤消合并?
有人接受了他们不应该有的拉取请求。 现在我们有一堆破碎的代码被合并了。你如何撤消一个拉请求? 我只是想在合并之前恢复对提交的更改,但我注意到它合并在一堆提交中。 所以现在这个人在合并前的几天都有这些提交。 你如何解决这个问题?
对这个问题有一个更好的答案 ,但我可以一步一步地解决这个问题。
您将需要获取并签出最新的上游更改,例如:
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提交。)
(更多的信息在评论后编辑:)
好的,让我们看看图:
我假设最后一个(最右边的)提交是通过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上的请求:
系统会提示您使用恢复的更改创build新的请求。
它仍然有待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中的大多数事情一样,如果你这样做并不容易,那么你可能做错了。