通过拉取请求撤消合并?
有人接受了他们不应该有的拉取请求。 现在我们合并了一堆破碎的代码。如何撤消一个请求? 我只是想在合并之前恢复对提交的更改,但我注意到它合并在一堆提交中。 所以现在这个人在合并之前的几天就有这些提交。 你如何解决这个问题?
这个问题有一个更好的答案,但我可以一步一步地解决这个问题。
您将需要获取并签出最新的上游更改,例如:
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