有人接受了他们不应该提出的拉取请求。现在我们已经合并了一堆破碎的代码。你如何撤消拉取请求?我只是要在合并之前将更改还原到提交,但我注意到它在一堆提交中合并。所以现在在合并之前几天就有来自这个人的所有这些提交。你怎么撤消这个?
答案 0 :(得分:119)
这个问题有better answer,但我可以一步一步地解决这个问题。
您需要获取并检查最新的上游更改,例如:
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。
在上面的示例中,合并提交是最重要的一个,它表示&#34;合并拉取请求#123 ...&#34; 。
执行此操作以还原这两项更改(&#34;添加栏&#34; 和&#34;添加foo&#34; )并最终完成在一个提交中恢复整个拉取请求,您可以在以后重新保存,并保持更改历史记录清洁:
git revert -m 1 b76a5f1f5d3b323679e466a1a1d5f93c8828b269
答案 1 :(得分:85)
查看您的提交图(使用gitk或类似程序)。您将看到来自pull请求的提交,您将看到自己的提交和合并提交(如果它不是快进合并)。您只需在合并之前找到自己最后一次提交,并将分支重置为此提交。
(如果你有分支的reflog,在合并之前找到提交应该更容易。)
(在评论中提供更多信息后编辑:)
我假设最后一次(最右边)提交是你错误的合并拉请求,它合并了这里看到的蓝线。 你最后的好提交将是黑线前的那个,这里用红色标记:
重置为此提交,您应该没问题。
这意味着,在您的本地工作副本中执行此操作(确保您没有更多未提交的内容,例如通过git stash):
git checkout master
git reset --hard 7a62674ba3df0853c63539175197a16122a739ef
gitk
现在确认你确实参与了我在那里标记的提交,你将看不到它的祖先所带来的东西。
git push -f origin master
(如果您的github遥控器名为origin
- 否则更改名称。)
现在一切都应该在github上看起来正确。提交仍然在您的存储库中,但任何分支都无法访问,因此不应该在那里造成任何伤害。 (当然,他们仍然会在RogerPaladin的存储库中。)
(可能有一个Github特定的网络方式做同样的事情,但我不太熟悉Github及其拉取请求管理系统。)
注意如果其他人已经用错误的提交拉了你的主人,那么他们就会遇到与你现在相同的问题,并且无法真正回馈。在重置为新的主版本之前。
如果可能发生这种情况,或者您只是想避免任何问题,请使用git revert
命令而不是git reset
来使用新提交还原更改,而不是设置回较旧的。 (有些人认为你永远不应该使用已发布的分支重置。)请参阅有关如何执行此操作的此问题的其他答案。
未来:
如果您只想要RogerPaladin分支的一些提交,请考虑使用cherry-pick
而不是merge
。或者与RogerPaladin沟通,将他们转移到一个单独的分支机构并发送新的拉取请求。
答案 2 :(得分:32)
如果拉动是他做的最后一件事
git reset --hard HEAD~1
答案 3 :(得分:20)
从2014年6月24日开始,您可以尝试轻松取消PR(请参阅&#34; Reverting a pull request&#34;):
您可以通过点击还原:
轻松恢复GitHub上的拉取请求
系统会提示您使用还原的更改创建新的拉取请求:
如果该恢复使用-m
或不恢复合并,还有待测试
答案 4 :(得分:6)
要通过您不想删除的提交来撤消github pull请求,您必须运行:
git reset --hard --merge <commit hash>
提交哈希是合并拉取请求的提交。这将删除pull请求中的所有提交,而不会影响历史记录中的任何提交。
找到这个的一个好方法是转到现在关闭的拉取请求并找到这个字段:
运行git reset
后,运行:
git push origin --force <branch name>
这应该在pull请求之前恢复分支,而不会影响分支中的任何提交,这些提交会在pull请求的提交之间进行提交历史记录。
修改强>
如果要单击拉取请求上的“还原”按钮,则会在分支上创建其他提交。它不会解散或取消合并。这意味着如果您点击恢复按钮,则无法打开新的拉取请求以重新添加所有此代码。
答案 5 :(得分:0)
我一直都在这个地方,谢谢。
我正在搜索如何撤消拉取请求并到达此处。
我很久以前只是git reset --hard
到#34;&#34;和
在做拉动请求之前快速回到原来的位置。
除了看这里,我还问我的同事他会做什么, 他有一个典型的好答案:使用示例输出 上面的第一个答案:
git reset --hard 9271e6e
和Git中的大多数事情一样,如果你以某种方式做到这一点并不容易, 你可能做错了。
答案 6 :(得分:0)
如果提供以下命令,您将获得包括提交,合并在内的活动列表。
git reflog
您的上一次提交可能应该在'HEAD@{0}'
处。您可以使用提交消息进行检查。
为此,请使用命令
git reset --hard 'HEAD@{0}'
您的合并将被还原。如果有剩余的新文件,请放弃合并中的更改。
答案 7 :(得分:-1)