撤销一个合并拉请求?

有人接受了他们不该接受的请求。现在我们合并了一堆破碎的代码。如何撤销拉请求?我只是打算在合并之前将更改恢复到提交,但我注意到它合并了一堆提交。这是这个人在合并前提交的所有文件。你该怎么做呢?

339466 次浏览

查看您的提交图(使用gitk或类似的程序)。您将看到来自pull请求的提交,您将看到自己的提交,以及一个合并提交(如果不是快进合并的话)。您只需要在合并之前找到您自己的最后一次提交,并将分支重置为此提交。

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


(更多信息请在评论中编辑:)

好的,让我们看看图表:

截图1

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

enter image description here

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

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

git checkout master
git reset --hard 7a62674ba3df0853c63539175197a16122a739ef
gitk

现在确认您确实是在我标记的提交上,您将不会在其祖先中看到任何被拉的东西。

git push -f origin master

(如果你的github远程命名为origin -否则更改名称)。

现在在github上一切看起来都是正确的。提交仍然在存储库中,但不能被任何分支访问,因此不应该在那里造成任何损害。(当然,它们仍然会在RogerPaladin的存储库中。)

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

请注意,如果其他人已经用错误的提交拉了你的master,他们就会有和你现在一样的问题,并且不能真正地贡献回来。在重新设置到新的主版本之前。

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

未来:

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

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

git reset --hard HEAD~1

这个问题有更好的答案,尽管我可以一步一步地分解它。

你需要像这样获取和签出最新的上游更改,例如:

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

现在您希望恢复整个拉请求,并能够在以后取消恢复。 为此,你需要取合并提交.

. 0的ID

在上面的例子中,合并提交是上面的“合并拉请求#123…”

这样做可以恢复这两个更改(“添加栏”“添加foo”),你将在一次提交中恢复整个拉请求,你可以在以后取消恢复,并保持更改的历史记录干净:

git revert -m 1 b76a5f1f5d3b323679e466a1a1d5f93c8828b269

从2014年6月24日开始,您可以尝试轻松取消PR(参见“恢复一个拉请求”):

介绍恢复按钮 . .

你可以通过单击revert在GitHub上轻松恢复拉请求:

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

系统会提示你创建一个新的pull请求,并将更改还原:

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

不过,还原是否使用-m仍有待测试(对于还原合并也是如此)

但是Adil H Raza在评论中添加了(2019年12月):

这是预期的行为,它创建了一个新分支,你可以从这个新分支创建一个PR到你的master 这样以后你可以在需要的时候取消还原,这是最安全的选择,而不是直接改变你的master

警告: Korayem指出在评论中:

在恢复之后,假设你在Git分支上做了一些进一步的更改,并从相同的源/目标分支创建了一个新的PR 您将发现PR只显示了新的更改,但没有显示恢复之前的内容。

Korayem让我们参考“Github:在恢复(__ABC0, git rebase)后忽略更改”了解更多信息。

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

我在搜索如何撤销拉请求,然后到了这里。

I was just git reset --hard to "a long time ago" and 快进到我做拉请求之前的地方。

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

git reset --hard 9271e6e
和Git中的大多数事情一样,如果你用某种不容易的方式来做, 你可能做错了

要撤消一个你不想删除的github拉请求,你必须运行一个:

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

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

找到它的一个好方法是去现在关闭的pull request并找到这个字段:

Pull Request Image 拉请求图像 < / p >

运行git reset之后,运行:

git push origin --force <branch name>

这应该会将分支恢复到拉请求之前,而不会影响在拉请求提交之间的提交历史中插入的分支中的任何提交。

编辑:

如果您在拉取请求上单击还原按钮,这将在分支上创建一个额外的提交。它不会取消提交或取消合并。这意味着,如果您要点击还原按钮,则无法打开新的拉取请求来重新添加所有这些代码。

如果您给出以下命令,您将得到包括提交、合并在内的活动列表。

git reflog

你的最后一次提交应该在'HEAD@{0}'。你可以同样检查你的提交信息。 要到达这一点,使用命令

git reset --hard 'HEAD@{0}'

您的合并将被恢复。如果您有新的文件,请丢弃合并中的更改。

如果你想撤销拉请求,那么我们可以遵循这些 步骤——< / p >

活动列表全部拉请求

git reflog

enter image description here

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

然后执行重置命令-

git reset --hard 6954dff92

6954年dff92合并id,你的代码根据合并id更新。

谢谢,希望能对大家有所帮助,请大家喜欢和支持。