有人接受了他们不该接受的请求。现在我们合并了一堆破碎的代码。如何撤销拉请求?我只是打算在合并之前将更改恢复到提交,但我注意到它合并了一堆提交。这是这个人在合并前提交的所有文件。你该怎么做呢?
当前回答
查看您的提交图(使用gitk或类似的程序)。您将看到来自pull请求的提交,您将看到自己的提交,以及一个合并提交(如果不是快进合并的话)。您只需要在合并之前找到您自己的最后一次提交,并将分支重置为此提交。
(如果你有分支的reflog,在合并之前找到提交应该会更容易。)
(更多信息请在评论中编辑:)
好的,让我们看一下图表:
我假设最后一次(最右边)提交是您错误的merge by pull请求,它合并了这里所见的蓝线。 你最后一次好的提交将是之前黑线上的那个,这里用红色标记:
重置为此提交,应该没问题。
这意味着,在你的本地工作副本中这样做(在确保你没有更多未提交的东西之后,例如通过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分支的一些提交,可以考虑使用樱桃选择而不是合并。或者与RogerPaladin通信,将它们移动到一个单独的分支,并发送一个新的拉请求。
其他回答
要撤消一个你不想删除的github拉请求,你必须运行一个:
Git重置——hard——merge <commit hash>
提交哈希是合并pull请求之前的提交。这将从pull请求中删除所有提交,而不会影响历史记录中的任何提交。
找到它的一个好方法是去现在关闭的pull request并找到这个字段:
拉请求图像
运行git重置后,运行:
Git push origin——force <分支名称>
这应该会将分支恢复到拉请求之前,而不会影响在拉请求提交之间的提交历史中插入的分支中的任何提交。
编辑:
如果您在拉取请求上单击还原按钮,这将在分支上创建一个额外的提交。它不会取消提交或取消合并。这意味着,如果您要点击还原按钮,则无法打开新的拉取请求来重新添加所有这些代码。
如果您给出以下命令,您将得到包括提交、合并在内的活动列表。
git 引用日志
你的最后一次提交应该是在'HEAD@{0}'。你可以同样检查你的提交信息。 要到达那个点,使用命令
git重置—hard 'HEAD@{0}'
您的合并将被恢复。如果您有新的文件,请丢弃合并中的更改。
查看您的提交图(使用gitk或类似的程序)。您将看到来自pull请求的提交,您将看到自己的提交,以及一个合并提交(如果不是快进合并的话)。您只需要在合并之前找到您自己的最后一次提交,并将分支重置为此提交。
(如果你有分支的reflog,在合并之前找到提交应该会更容易。)
(更多信息请在评论中编辑:)
好的,让我们看一下图表:
我假设最后一次(最右边)提交是您错误的merge by pull请求,它合并了这里所见的蓝线。 你最后一次好的提交将是之前黑线上的那个,这里用红色标记:
重置为此提交,应该没问题。
这意味着,在你的本地工作副本中这样做(在确保你没有更多未提交的东西之后,例如通过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分支的一些提交,可以考虑使用樱桃选择而不是合并。或者与RogerPaladin通信,将它们移动到一个单独的分支,并发送一个新的拉请求。
如果拉人是他做的最后一件事
git reset --hard HEAD~1
我一直用这个地方,谢谢。
我在搜索如何撤销拉请求,然后到了这里。
我正准备重新开始,很难回到"很久以前"然后 快进到我做拉请求之前的地方。
除了看这里,我还问我的同事他会做什么, 他有一个典型的好答案:使用输出的例子 上面的第一个答案:
git reset --hard 9271e6e
和Git中的大多数事情一样,如果你用某种不容易的方式来做, 你可能做错了。
推荐文章
- 为什么调用git分支——unset-upstream来修复?
- Windows git“警告:LF将被CRLF取代”,这是警告尾巴向后吗?
- git中的哈希冲突
- git可以自动在空格和制表符之间切换吗?
- Git暂存文件列表
- 在Markdown Jekyll中使用图像说明
- 如何将git配置存储为存储库的一部分?
- 如何修改GitHub拉请求?
- 如何在Github和本地删除最后n次提交?
- 我如何调试git/git-shell相关的问题?
- 错误:无法使用rebase进行拉取:您有未分阶段的更改
- Git隐藏未缓存:如何把所有未分期的变化?
- 如何将文件附加到GitHub问题?
- 真实的恶魔
- 如何从另一个分支获得更改