还原合并的拉取请求

Posted

技术标签:

【中文标题】还原合并的拉取请求【英文标题】:Revert a merged pull request 【发布时间】:2021-12-18 11:23:51 【问题描述】:

我正在开展一个项目,我们有不同的分支(开发、功能、生产)。我在我的feature 分支上工作,并在该分支上为我的更改做了多次commits。后来在某个时候,我从dev 分支中提取了一个内容,并与我的feature 分支合并(我不应该这样做)。但是,当时我并没有意识到这个错误,并继续在我的feature 分支上工作,并做了更多的提交。

现在我只想恢复从dev 获取的拉取并保留我对feature 分支的所有提交,这也是我在拉取之后所做的那个。是否可以保存这些提交?我对 Git Reset/revert 命令了解一些,但我猜这不会保存我以后的提交。它会将HEAD 指向上一次提交,在拉取之前。

谁能帮助我如何保存合并后所做的提交?或者我对 Reset\Revert 命令的理解不正确?

注意-:更改已提交并推送到远程。我正在使用Source Tree

【问题讨论】:

可能是this的副本... git revert 不会将提交还原为。它撤消提交:这是一种“反向应用”提交。与 git cherry-pick 比较,后者会复制提交中发现的更改。当使用git reverton 合并提交时——它有两个父节点——Git 有一个问题:要复制或撤消提交中的更改,Git 需要另一个提交来比较。对于普通(单父)提交,另一个提交是 the 父提交。合并提交有 两个 父母,所以没有单一的“the”父母; -m 告诉 revert 和cherry-pick“哪个父级”。 git revert 的结果是一个新提交。所有现有的提交仍然存在。这与git reset 完全不同,git reset 允许您从分支中取出提交。 Git 在这里使用英文单词 revert 是一个糟糕的选择。 Mercurial 将此操作称为backout,这样更好。这两个动词在技术上都是合理的,但“revert”的英语含义更常见的是实际使用git reset 实现的“revert to”含义。 请注意,我不使用 SourceTree。如果他们有一个标记为Reset|Revert 的按钮,那就是奇怪的标记,因为这些是非常 不同的操作。在做任何不可逆转的事情之前先找一个知道 SourceTree 的人(或者,也许更简单,确保你在所有实验中使用一个新的克隆,让你的 有用 克隆保持不变)。 【参考方案1】:

    在 Sourcetree 中,双击合并前的最后一次提交。 这样做会使您的工作副本成为“分离的 HEAD”等

    单击“新建分支”并为其命名。

    导航到您在合并后所做的所有提交,右键单击它们并选择“Cherry Pick”

【讨论】:

不创建新分支有什么办法吗? 我猜是有的,但这超出了我的拙见??‍♂️【参考方案2】:

您只需要将已签出的分支(使用git reset --hard)重置到您想要的位置。如果您想要的点已丢失,您可能必须使用git reflog

除非人们没有意识到,git 的错误使用会导致开发人员丢失他们的更改。有时使用本地镜像备份更改很方便。

【讨论】:

以上是关于还原合并的拉取请求的主要内容,如果未能解决你的问题,请参考以下文章

GitHub:重新打开合并的拉取请求

Azure DevOps 上的拉取请求以强制替换而不是合并

markdown 将未合并的拉取请求同步到我的前叉

完全恢复拉取请求

错误:指定了主线,但提交不是合并;致命:还原失败

通过拉取请求撤消合并?