撤销 git 远程误推送的仓库更改

4
如何从远程仓库中删除意外推送的存储库?
在推送之前,有两个独立的存储库,每个存储库都有自己的历史记录,例如:
Repo1:Commit1--Commit2--Commit3<--Head Repo2:Commit1--Commit2<--Head
添加了一个额外的远程引用 Repo1 存储库到 Repo2,并将所有 Repo2 更改推送到 Repo1 远程后,Repo1 开始变成这样:
Repo1: Repo2Commit1--Repo2Commit2-- --Repo1Commit1--Repo1Commit2--Repo1Commit3<--Head
因此,它看起来像是一个主分支,具有两个独立的提交历史序列,彼此不相关。
此外,git log 不显示所有提交,它只显示一个独立序列的历史记录。
有没有一种方法可以从 Repo1 中恢复 Repo2 的提交,使其看起来像以前一样,例如:
Repo1:Commit1--Commit2--Commit3<--Head
有什么想法吗?

How is it possible?


一个分支有两个独立的提交历史序列是不可能的。你用什么命令将所有Repo2的更改推送到Repo1? - fracz
git remote add ... git push <Remote name> - ixi
"git remote add" 不会推送任何东西。我猜你可能混淆了两个远程主分支?如果你不需要 repo2 远程,请尝试使用 "git remote rm repo2" 命令移除它。 - fracz
在将任何更改推送到Repo1之前,我已将Repo1作为Repo2的远程添加,并在Repo2上执行了git push Repo1。结果,在Repo1中看到了两个独立的序列。请注意,在Repo1中只有一个用于获取和推送的远程。 - ixi
1个回答

0

你看到了两个独立的序列,因为这些仓库是“不相关”的 - 不是同一个分支。

git reflog 在 Repo2 中可能会有所帮助。

只需将 Repo2 克隆到另一个目录中并在那里运行 git reflog。您将看到对存储库进行的顺序更改。之后,您可以硬重置到所需提交(reflog 中的历史记录包含每个更改的哈希),然后将其强制推送回远程 Repo2。

但我不确定您想要实现什么目标。因此,请确保备份两个存储库。


Repo2 很好,不需要任何更改,但 Repo1 需要。git reflog 只显示本地仓库的更改,但问题在于远程仓库 Repo1 有一个额外的无关历史,在 SourceTree 中可见,但在 Web 或任何 git 命令中都不可见。因此,目标是从 Repo1 中删除 Repo2 的历史记录。此外,提交序列是无关的,彼此之间没有连接。 - ixi
如果您创建一个新的远程存储库,并尝试将Repo1中的分支推送到其中,会怎样呢?这可能会解决问题,因为似乎您只在本地拥有不相关的历史记录。请记住,您只需要推送所需的分支,而不是运行git push --all。到目前为止,我还不知道如何从历史记录中删除不相关的提交。 - Jakub Kopřiva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接