查看你的提交图(用gitk或类似的程序),你会看到来自拉取请求的提交,你会看到你自己的提交,和一个合并提交(如果不是快进合并),你只需要找到合并前你自己的最后一个提交,然后重置分支到这个提交。 (If你有分支的reflog,那么在合并之前找到提交应该会更容易。) (Edit评论中的更多信息之后:) Okay, lets look at the graph:
我假设最后一次(最右边的)提交是错误的 merge by pull request,它合并了这里看到的蓝线。最后一次 good 提交是之前黑线上的提交,这里用红色标记:
8条答案
按热度按时间a0x5cqrl1#
这个问题有一个better answer,尽管我可以一步一步地分解这个问题。
您需要获取并 checkout 最新的上游更改,如下所示:
查看提交日志,您应该会发现类似于以下内容的内容:
现在您希望还原整个拉取请求,并在以后能够取消还原。为此,您需要获取 merge commit 的ID。
在上面的例子中,merge commit 是最上面的一个,它说 “合并的拉取请求#123..."。
这样做可以还原这两个更改(“Add bar” 和 “Add foo”),您将在一次提交中还原整个拉取请求,您可以稍后取消还原,并保持更改历史记录清晰:
yduiuuwa2#
查看你的提交图(用gitk或类似的程序),你会看到来自拉取请求的提交,你会看到你自己的提交,和一个合并提交(如果不是快进合并),你只需要找到合并前你自己的最后一个提交,然后重置分支到这个提交。
(If你有分支的reflog,那么在合并之前找到提交应该会更容易。)
(Edit评论中的更多信息之后:)
Okay, lets look at the graph:
我假设最后一次(最右边的)提交是错误的 merge by pull request,它合并了这里看到的蓝线。最后一次 good 提交是之前黑线上的提交,这里用红色标记:
重置到这个提交,你应该没问题。
这意味着,在本地工作副本中执行以下操作(确保没有未提交的内容,例如git stash):
现在确认你真的在我标记的提交上,你将不会在它的祖先中看到任何被拉的东西。
(if你的github远程被命名为
origin
-否则更改名称)。现在在github上一切都应该正常了。提交仍然在你的仓库里,但是不能被任何分支访问,因此不会对仓库造成任何伤害。(当然,它们仍然在RogerPaladin的仓库里。)
(可能有一种Github特有的只在Web上使用的方法来做同样的事情,但我对Github及其拉取请求管理系统不是很熟悉。)
请注意如果其他人可能已经用错误的提交拉了您的母版,那么他们会遇到和您当前相同的问题,并且在重置为新的母版之前无法真正做出贡献。
如果这种情况很有可能发生,或者你只是想避免任何问题,使用
git revert
命令而不是git reset
,用新的提交来还原更改,而不是设置回旧的提交。(有些人认为你永远不应该对已发布的分支进行重置。)未来:
如果你只想要RogerPaladin分支的一部分提交,可以考虑使用
cherry-pick
而不是merge
,或者通知RogerPaladin将它们移到一个单独的分支,然后发送一个新的拉取请求。6uxekuva3#
如果那是他最后做的事
nnt7mjpx4#
从2014年6月24日起,您可以尝试使用以下方法轻松取消请购单(参见"Reverting a pull request"):
Introducing the Revert Button
你可以通过点击Revert在GitHub上很容易地回复一个拉取请求:
系统将提示您使用恢复的更改创建新的拉取请求:
尽管还原是否使用
-m
(也用于还原合并),但仍有待测试但Adil H Raza在评论中补充道(2019年12月):
这是预期的行为,它创建了一个新分支,您可以创建从这个新分支到
master
的PR。这样,在未来您可以取消还原还原,如果需要的话,这是最安全的选择,而不是直接改变您的
master
。在恢复之后,假设您对Git分支做了一些进一步的更改,并从相同的源/目标分支创建了一个新的PR。
Korayem让我们参考"Github: Changes ignored after revert (
git cherry-pick
,git rebase
)"了解更多信息。还有:
(2023年1月)
GraphQL变体现在可用于恢复合并的拉取请求:* *
revertPullRequest
**.与Web中拉取请求页面上的还原操作类似,调用此API将创建一个新的拉取请求,该请求将还原合并的拉取请求所做的更改。
了解有关reverting a pull request的更多信息。
k10s72fa5#
要撤销一个github拉取请求,其中包含您不想删除的提交,您必须运行一个:
git reset --hard --merge <commit hash>
提交哈希是合并拉取请求之前的提交。这将从拉取请求中移除所有提交,而不影响历史中的任何提交。
查找此字段的一个好方法是转到现已关闭的拉式请求并查找此字段:
Pull Request Image
运行
git reset
后,运行以下命令:git push origin --force <branch name>
这应该会将分支恢复到拉取请求之前,而不会影响分支中的任何提交,这些提交会在拉取请求的提交之间插入提交历史中。
如果单击拉式请求上的"还原"按钮,则会在分支上创建一个额外的提交。它不会取消提交或取消合并。这意味着如果单击"还原"按钮,则无法打开新的拉式请求来重新添加所有这些代码。
zc0qhyus6#
我经常来这里,谢谢。
我正在寻找如何撤销拉取请求,然后到了这里。
我正准备
git reset --hard
到“很久以前”,然后快进到我在做拉取请求之前的位置。除了看这里,我还问我的同事他会怎么做,他有一个典型的好答案:使用上面第一个答案中的示例输出:
就像Git中的大多数事情一样,如果你用某种不容易的方式来做,你可能做错了。
ui7jx7zq7#
如果你想撤销请求我们可以按以下步骤进行-
所有拉式请求的活动列表-
运行上述命令后,将出现此输出。
然后运行reset命令-
where6954 dff 92合并ID,并根据合并ID更新代码。
谢谢,希望对大家有所帮助,请大家点赞和支持。
m1m5dgzv8#
如果你给予下面的命令,你会得到一个活动列表,包括提交,合并。
git reflog
你的最后一次提交应该是在
'HEAD@{0}'
,你可以通过你的提交信息来检查,要到达那个点,使用命令git reset --hard 'HEAD@{0}'
您的合并将被还原。如果您还有新文件,请从合并中放弃这些更改。