有人接受了他们不应该接受的拉取请求。现在我们合并了一堆损坏的代码。如何撤消拉取请求?我只是要在合并之前恢复对提交的更改,但我注意到它合并成一堆提交。所以现在有这个人在合并前几天的所有这些提交。你如何撤消这个?
8 回答
这个问题有一个更好的答案,尽管我可以逐步分解。
您将需要像这样获取和签出最新的上游更改,例如:
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 。
在上面的示例中,合并提交是上面写着"Merged pull request #123..."的提交。
这样做可以恢复这两个更改(“Add bar”和“Add foo”),您最终将在一次提交中恢复整个拉取请求,您可以稍后取消恢复并保持更改历史记录干净:
git revert -m 1 b76a5f1f5d3b323679e466a1a1d5f93c8828b269
查看您的提交图(使用 gitk 或类似程序)。您将看到来自拉取请求的提交,您将看到自己的提交和合并提交(如果它不是快进合并)。你只需要在合并之前找到你自己的最后一个提交,并将分支重置为这个提交。
(如果您有分支的 reflog,那么在合并之前找到提交应该会更容易。)
(在评论中提供更多信息后进行编辑:)
我假设最后一次(最右边的)提交是您通过 pull request 进行的错误合并,它合并了此处看到的蓝线。你最后一次好的提交将是之前在黑线上的那个,这里用红色标记:
重置到这个提交,你应该没问题。
这意味着,在您的本地工作副本中执行此操作(在确保您没有更多未提交的内容之后,例如通过 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
从 2014 年 6 月 24 日开始,您可以尝试通过以下方式轻松取消 PR(请参阅“恢复拉取请求”):
您可以通过单击 Revert 轻松地恢复 GitHub 上的拉取请求:
系统将提示您使用还原的更改创建新的拉取请求:
如果恢复使用或不使用它仍有待测试-m
(也用于恢复合并)
但Adil H Raza在评论中补充道(2019 年 12 月):
这是预期的行为,它创建了一个新分支,您可以从这个新分支创建一个 PR 到您的
master
.
这样,将来您可以在需要时取消还原,这是最安全的选择,而不是直接更改您的master
.
还原后,假设您在 Git 分支上做了一些进一步的更改,并从相同的源/目标分支创建了一个新的 PR。
您会发现 PR 只显示新的更改,但没有显示恢复之前的内容。
Korayem 向我们介绍了“ Github:Revert ( git cherry-pick
, git rebase
)后忽略的更改”以获取更多信息。
要撤消包含您不想删除的提交的 github 拉取请求,您必须运行:
git reset --hard --merge <commit hash>
提交哈希是合并拉取请求之前的提交。这将从拉取请求中删除所有提交,而不会影响历史记录中的任何提交。
找到这个的一个好方法是转到现在关闭的拉取请求并找到这个字段:
运行后git reset
,运行:
git push origin --force <branch name>
这应该在拉取请求之前将分支恢复回来,而不会影响分支中的任何提交,这些提交会在来自拉取请求的提交之间的提交历史记录中出现。
编辑:
如果您要单击拉取请求上的恢复按钮,则会在分支上创建一个额外的提交。它不会取消提交或取消合并。这意味着如果您要点击恢复按钮,您将无法打开新的拉取请求来重新添加所有这些代码。
我一直在用这个地方,谢谢。
我正在寻找如何撤消拉取请求并来到这里。
我正要git reset --hard
“很久以前”并快进回到我在做拉取请求之前的位置。
除了看这里,我还问我的同事他会做什么,他有一个典型的好答案:使用上面第一个答案中的示例输出:
git reset --hard 9271e6e
与 Git 中的大多数事情一样,如果您以某种不容易的方式进行操作,那么您可能做错了。
如果您给出以下命令,您将获得包括提交、合并在内的活动列表。
git reflog
您的最后一次提交可能应该在'HEAD@{0}'
. 您可以使用您的提交消息检查相同的内容。要转到该点,请使用命令
git reset --hard 'HEAD@{0}'
您的合并将被还原。如果您还有新文件,请从合并中丢弃这些更改。