有人接受了他们不应该提出的请求。现在,我们已经合并了许多损坏的代码。如何撤消请求请求?我只是打算在合并之前将更改还原到提交,但是我注意到它已合并为一堆提交。因此,从合并之前的几天开始,此人已经提交了所有这些提交。您如何撤消此操作?
有人接受了他们不应该提出的请求。现在,我们已经合并了许多损坏的代码。如何撤消请求请求?我只是打算在合并之前将更改还原到提交,但是我注意到它已合并为一堆提交。因此,从合并之前的几天开始,此人已经提交了所有这些提交。您如何撤消此操作?
Answers:
尽管我可以逐步分解此问题,但对这个问题有一个更好的答案。
您将需要像这样获取和签出最新的上游更改,例如:
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 ...”。
执行此操作以还原两个更改(“ Add bar”和“ Add foo”),最终将在一次提交中还原整个拉取请求,以后可以撤消此请求并保持更改历史记录的清洁:
git revert -m 1 b76a5f1f5d3b323679e466a1a1d5f93c8828b269
git checkout upstream/master -b revert/john/foo_and_bar
呢?它到底是做什么的?
查看您的提交图(使用gitk或类似程序)。您将看到来自pull请求的提交,还将看到您自己的提交和一个合并提交(如果不是快速转发合并)。您只需要在合并之前找到您自己的最后一次提交,然后将分支重置为此提交即可。
(如果您有分支的引用日志,则在合并之前查找提交应该更加容易。)
(在评论中获取更多信息后进行编辑:)
我认为最后一次(最右边)的提交是您通过pull request进行的错误合并,它合并了此处看到的蓝线。您的最后一个好提交将是黑线之前的提交,此处用红色标记:
重置为该提交,就可以了。
这意味着,在您的本地工作副本中执行此操作(确保没有更多未提交的内容(例如,通过git stash)):
git checkout master
git reset --hard 7a62674ba3df0853c63539175197a16122a739ef
gitk
现在,确认您确实在我在此处标记的提交上,并且在其祖先中将看不到任何被拉出的东西。
git push -f origin master
(如果您的github遥控器已命名origin
-否则更改名称)。
现在,一切也应该在github上看起来正确。提交仍将在您的存储库中,但任何分支都无法访问,因此不应在此造成任何伤害。(当然,它们仍将保留在RogerPaladin的存储库中。)
(也许有一种Github特定于Web的方式可以完成相同的操作,但是我对Github及其拉取请求管理系统不太熟悉。)
请注意,如果其他任何人可能已经用错误的提交拉动了您的主服务器,那么他们将遇到与您当前遇到的问题相同的问题,并且无法真正做出贡献。重置为新的主版本之前。
如果很可能发生了这种情况,或者您只是想避免任何问题,请使用git revert
命令而不是git reset
来通过新的提交还原更改,而不是将其设置回旧的。(有些人认为您永远都不要对已发布的分支机构进行重置。)有关如何执行此操作的信息,请参见此问题的其他答案。
为将来:
如果只需要RogerPaladin分支的一些提交,请考虑使用cherry-pick
而不是merge
。或与RogerPaladin交流以将其移至单独的分支并发送新的拉取请求。
如果拉是他做的最后一件事,那
git reset --hard HEAD~1
git reset --hard HEAD~1
,我用来git push origin -f
更新远程存储库。但是要小心,在执行此操作之前要小心。
从2014年6月24日开始,您可以尝试轻松取消PR(请参阅“ 还原拉取请求 ”),方法是:
您可以通过单击还原轻松地在GitHub上还原拉取请求:
系统将提示您使用还原的更改创建新的请求请求:
尽管该还原是否使用-m
(还有还原合并),仍然有待测试。
但是Adil H Raza在评论中添加了内容(2019年12月):
这是预期的行为,它创建了一个新分支,您可以从该新分支到您的创建PR
master
。
将来,您将来可以通过这种方式取消还原,这是最安全的选择,而不是直接更改master
。
还原后,假设您在Git分支上做了一些进一步的更改,并从相同的源/目标分支创建了一个新的PR。
您会发现PR仅显示新的更改,而恢复之前没有任何变化。
Korayem向我们介绍了“ Github:还原(git cherry-pick
,git rebase
)后忽略的更改 ”的更多信息。
要撤消您不想删除的带有提交的github pull请求,您必须运行:
git reset --hard --merge <commit hash>
提交哈希是合并合并请求之前的提交。这将从拉取请求中删除所有提交,而不会影响历史记录中的任何提交。
找到它的一个好方法是转到现在关闭的拉取请求并找到以下字段:
运行后git reset
,请运行:
git push origin --force <branch name>
这应该在拉取请求之前将分支还原回去,而不会影响分支中的任何提交,而分支中的任何提交都会插入到拉取请求之间的提交历史中。
编辑:
如果要单击拉取请求上的还原按钮,则会在分支上创建一个额外的提交。它不会取消提交或取消合并。这意味着,如果要单击还原按钮,则无法打开新的拉取请求以重新添加所有此代码。