git 是否撤消按拉取请求进行的合并?

b1zrtrql  于 2023-01-28  发布在  Git
关注(0)|答案(8)|浏览(154)

有人接受了一个他们不应该接受的拉取请求。现在我们有一堆破碎的代码合并在一起。你如何撤销一个拉取请求?我只是想在合并之前恢复对提交的更改,但我注意到它合并在一堆提交中。所以现在有所有这些来自这个人在合并前几天的提交。你如何撤销这个?

a0x5cqrl

a0x5cqrl1#

这个问题有一个better answer,尽管我可以一步一步地分解这个问题。
您需要获取并 checkout 最新的上游更改,如下所示:

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

现在您希望还原整个拉取请求,并在以后能够取消还原。为此,您需要获取 merge commit 的ID。
在上面的例子中,merge commit 是最上面的一个,它说 “合并的拉取请求#123..."
这样做可以还原这两个更改(“Add bar”“Add foo”),您将在一次提交中还原整个拉取请求,您可以稍后取消还原,并保持更改历史记录清晰:

git revert -m 1 b76a5f1f5d3b323679e466a1a1d5f93c8828b269
yduiuuwa

yduiuuwa2#

查看你的提交图(用gitk或类似的程序),你会看到来自拉取请求的提交,你会看到你自己的提交,和一个合并提交(如果不是快进合并),你只需要找到合并前你自己的最后一个提交,然后重置分支到这个提交。
(If你有分支的reflog,那么在合并之前找到提交应该会更容易。)
(Edit评论中的更多信息之后:)
Okay, lets look at the graph:

我假设最后一次(最右边的)提交是错误的 merge by pull request,它合并了这里看到的蓝线。最后一次 good 提交是之前黑线上的提交,这里用红色标记:

重置到这个提交,你应该没问题。
这意味着,在本地工作副本中执行以下操作(确保没有未提交的内容,例如git stash):

git checkout master
git reset --hard 7a62674ba3df0853c63539175197a16122a739ef
gitk

现在确认你真的在我标记的提交上,你将不会在它的祖先中看到任何被拉的东西。

git push -f origin master

(if你的github远程被命名为origin-否则更改名称)。
现在在github上一切都应该正常了。提交仍然在你的仓库里,但是不能被任何分支访问,因此不会对仓库造成任何伤害。(当然,它们仍然在RogerPaladin的仓库里。)
(可能有一种Github特有的只在Web上使用的方法来做同样的事情,但我对Github及其拉取请求管理系统不是很熟悉。)

请注意如果其他人可能已经用错误的提交拉了您的母版,那么他们会遇到和您当前相同的问题,并且在重置为新的母版之前无法真正做出贡献。

如果这种情况很有可能发生,或者你只是想避免任何问题,使用git revert命令而不是git reset,用新的提交来还原更改,而不是设置回旧的提交。(有些人认为你永远不应该对已发布的分支进行重置。)

未来:

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

6uxekuva

6uxekuva3#

如果那是他最后做的事

git reset --hard HEAD~1
nnt7mjpx

nnt7mjpx4#

从2014年6月24日起,您可以尝试使用以下方法轻松取消请购单(参见"Reverting a pull request"):
Introducing the Revert Button
你可以通过点击Revert在GitHub上很容易地回复一个拉取请求:

系统将提示您使用恢复的更改创建新的拉取请求:

尽管还原是否使用-m(也用于还原合并),但仍有待测试
Adil H Raza在评论中补充道(2019年12月):
这是预期的行为,它创建了一个新分支,您可以创建从这个新分支到master的PR。
这样,在未来您可以取消还原还原,如果需要的话,这是最安全的选择,而不是直接改变您的master

    • 警告**:Korayem在评论中指出:

在恢复之后,假设您对Git分支做了一些进一步的更改,并从相同的源/目标分支创建了一个新的PR。

    • 您会发现PR只显示新的更改,但没有显示恢复前的任何内容**。

Korayem让我们参考"Github: Changes ignored after revert ( git cherry-pick , git rebase )"了解更多信息。
还有:
(2023年1月)
GraphQL变体现在可用于恢复合并的拉取请求:* * revertPullRequest**.
与Web中拉取请求页面上的还原操作类似,调用此API将创建一个新的拉取请求,该请求将还原合并的拉取请求所做的更改。
了解有关reverting a pull request的更多信息。

k10s72fa

k10s72fa5#

要撤销一个github拉取请求,其中包含您不想删除的提交,您必须运行一个:
git reset --hard --merge <commit hash>
提交哈希是合并拉取请求之前的提交。这将从拉取请求中移除所有提交,而不影响历史中的任何提交。
查找此字段的一个好方法是转到现已关闭的拉式请求并查找此字段:


Pull Request Image
运行git reset后,运行以下命令:
git push origin --force <branch name>
这应该会将分支恢复到拉取请求之前,而不会影响分支中的任何提交,这些提交会在拉取请求的提交之间插入提交历史中。

    • 编辑:**

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

zc0qhyus

zc0qhyus6#

我经常来这里,谢谢。
我正在寻找如何撤销拉取请求,然后到了这里。
我正准备git reset --hard到“很久以前”,然后快进到我在做拉取请求之前的位置。
除了看这里,我还问我的同事他会怎么做,他有一个典型的好答案:使用上面第一个答案中的示例输出:

git reset --hard 9271e6e

就像Git中的大多数事情一样,如果你用某种不容易的方式来做,你可能做错了。

ui7jx7zq

ui7jx7zq7#

如果你想撤销请求我们可以按以下步骤进行-
所有拉式请求的活动列表-

git reflog

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

git reset --hard 6954dff92

where6954 dff 92合并ID,并根据合并ID更新代码。
谢谢,希望对大家有所帮助,请大家点赞和支持。

m1m5dgzv

m1m5dgzv8#

如果你给予下面的命令,你会得到一个活动列表,包括提交,合并。
git reflog
你的最后一次提交应该是在'HEAD@{0}',你可以通过你的提交信息来检查,要到达那个点,使用命令
git reset --hard 'HEAD@{0}'
您的合并将被还原。如果您还有新文件,请从合并中放弃这些更改。

相关问题