如何在不进行任何更改的情况下恢复推送的合并?

Posted

技术标签:

【中文标题】如何在不进行任何更改的情况下恢复推送的合并?【英文标题】:How to revert pushed merge without any changes? 【发布时间】:2016-10-02 16:18:57 【问题描述】:

我错误地将我的 git 存储库与它自己的一个遥控器合并。我试图按照this question 中的说明来扭转这一点,但我只得到了回复:

$ git revert -m 1 <commit id> On branch master Your branch is up-to-date with 'origin/master'. nothing to commit, working directory clean

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

在做任何事情之前阅读整个答案,如果您觉得使用可能具有破坏性的命令不安全,最好备份 git repo(整个项目文件夹)。

如果您在错误合并后没有推送更改:

如果您键入git reflog,您应该会在错误合并之前获得一个标记您的历史的修订。如果您不关心自该时间点以来您可能所做的任何更改(包括本地提交/未提交的文件),如果 XYZ 是您在查看 git reflog 时喜欢的参考,我将使用 git reset --hard XYZ

这将使您的历史看起来好像没有发生任何不好的事情,如果我没有在任何地方推送任何更改,我更愿意这样做(因为您真的不想与其他人 git history 搞混,以防他们退出您将“错误”更改推送到的遥控器)。

如果您在错误合并后推送了更改:

这里的官方文档中有很多提示:https://github.com/git/git/blob/master/Documentation/howto/revert-a-faulty-merge.txt(该页面链接自man git revert)。

我建议您浏览大部分内容以找到一些一般推理并找到您想要尝试的案例。 git revert 保留您当前的历史记录并建立在它之上,与 git reset 相反,它让您回溯您的历史记录并“擦除”其中的一部分。如果你备份了你的 git 存储库,你应该可以在其中玩耍并学习一两件事:)

【讨论】:

所以我已经采取了恢复提交的步骤,注释说:这会恢复提交 ,撤销对 所做的更改。这是可以做到的最好的吗?我的 repo 仍然显示 2 倍的实际提交次数,并且网络图显示了两个基本相同的并行分支 不重写推送的历史是常见的做法/礼貌。这留下了一个选择 - 推送更改以平衡先前的更改。这在 git 历史中的外观取决于您是否进行了快进合并,是否在合并之前压缩了提交等。您不应该害怕让 git log 显示大量提交,它们只是指向 git 对象的指针,因此它们应该占用那么多空间。我会假设将非 ff 合并的恢复压缩到包括所有差异的单独的“单一提交恢复”中,会更难回溯。 所以基本上历史会因为这个错误而看起来有点难看,但这没什么大不了的? 如果你已经推送了,你可以克隆你的分支,自己看。文件的内容应该没有区别,但您已经知道了。如果您还没有将其推送到“origin/master”(假设是“标准”命名标准),我不会使用还原,我会使用git reset --hard 方法。丑陋的历史可能没什么大不了的,您可以在这之间做出决定,并迫使用户将git fetch-ed(或git pull-ed)从您那里发送到git fetch,然后将git reset --hard 发送到您的新推送历史,这是我到目前为止使用的选项。 所以我已经推送到origin/master了,你的第二个建议让用户git reset --hard仍然适用吗?只有我自己和另一位用户...

以上是关于如何在不进行任何更改的情况下恢复推送的合并?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 git reset 在不丢失本地更改的情况下重置未推送的提交

如何在不实际合并的情况下测试合并

Git - 如何在不快速转发和合并为当前的情况下恢复以前的提交

我可以在不删除最近提交的情况下删除源/主合并历史记录吗?

如何在不导航到该 url 的情况下推送历史记录条目并更改地址栏 url?

如何在不选择 RichTextBox 的情况下恢复插入符号位置或更改文本颜色