还原合并的拉取请求
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 revert
on 合并提交时——它有两个父节点——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 的错误使用会导致开发人员丢失他们的更改。有时使用本地镜像备份更改很方便。
【讨论】:
以上是关于还原合并的拉取请求的主要内容,如果未能解决你的问题,请参考以下文章