通过拉取请求撤消合并?

时间:2011-06-26 01:26:38

标签: git github merge pull-request

有人接受了他们不应该提出的拉取请求。现在我们已经合并了一堆破碎的代码。你如何撤消拉取请求?我只是要在合并之前将更改还原到提交,但我注意到它在一堆提交中合并。所以现在在合并之前几天就有来自这个人的所有这些提交。你怎么撤消这个?

8 个答案:

答案 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,在合并之前找到提交应该更容易。)


(在评论中提供更多信息后编辑:)

Okay, lets look at the graph:

screenshot 1

我假设最后一次(最右边)提交是你错误的合并拉请求,它合并了这里看到的蓝线。 你最后的提交将是黑线前的那个,这里用红色标记:

enter image description here

重置为此提交,您应该没问题。

这意味着,在您的本地工作副本中执行此操作(确保您没有更多未提交的内容,例如通过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;):

Introducing the Revert Button

  

您可以通过点击还原:

轻松恢复GitHub上的拉取请求

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

  

系统会提示您使用还原的更改创建新的拉取请求:

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

如果该恢复使用-m或不恢复合并,还有待测试

答案 4 :(得分:6)

要通过您不想删除的提交来撤消github pull请求,您必须运行:

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

提交哈希是合并拉取请求的提交。这将删除pull请求中的所有提交,而不会影响历史记录中的任何提交。

找到这个的一个好方法是转到现在关闭的拉取请求并找到这个字段:

Pull Request Image Pull Request Image

运行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)

如果你想撤消拉取请求,我们可以按照这些 步骤-

活动列表所有拉取请求 -

git reflog

enter image description here

运行上述命令后,将出现此输出。

然后运行reset命令-

git reset --hard 6954dff92

where 6954dff92 合并 id,您的代码根据合并 id 更新。

谢谢,希望能帮到你,请点赞支持。