1

这是我的悲伤故事

今天我犯了一个错误,从一个不同的存储库拉到我的。我正在处理存储库 A 并将存储库 B 的内容提取到 A 中。我这样做是因为我想要该存储库中的一些文件。

之后,我将存储库推送到远程。

我的问题不是我的代码,因为两个存储库不同。但问题是历史。

现在,公众可以看到的我的远程存储库将存储库 B 的所有提交历史与我在日志中的提交混合在一起。

如何从历史 LOG 中删除这些提交?

有没有办法将我的存储库重置为昨天的状态?这会导致我历史中来自存储库 B 的提交消失吗?

我尝试重新设置合并、使用 Re-base 和 Cherry-pick,但在这两种情况下都没有删除历史记录。

谢谢你的时间

4

3 回答 3

1

如果您知道昨天所有分支的位置,则可以遍历并将它们中的每一个重置为其原始位置。对于每个相关分支:

git checkout <branch name>
git reset --hard <old hash>
git push -f <repository A> <branch name>

然后,您可以删除任何您不想要的新分支。对于每个这样的分支:

git branch -D <branch name>
git push <repository A> :<branch name>

如果其他人可能同时从存储库 A 中提取,这一切都非常粗略。该解决方案可能部分是社会性的,也可能是技术性的——可能需要告知正在使用存储库的其他人发生了什么,以便他们可以修复他们的本地克隆。

于 2013-08-19T10:54:47.303 回答
0

谢谢大家。我已经解决了我的问题。我设法参考不同的文章和问题来解决它。

我将在这里解释答案以及我通过斗争学到的东西。

首先,为了有选择地从历史中删除分散在最佳方式周围的提交,可以在这个问题的答案中找到:

特别是查尔斯贝利的答案。最接近这个答案的是Stuart

注意:恢复提交不会将其从历史记录中删除,重置会。

至于我的特殊情况,我认为对于每个我不想要的提交,我都必须遵循以前的方法,但实际上答案更简单。

在我的情况下,我必须在拉存储库 B 之前将 git 重置为提交,并且必须为所有分支完成。完成此操作后,来自 B 的所有不受欢迎的提交都从我的历史记录中消失了。

另一件有趣的事情是,在许多提交上使用 git Cherry-Pick 或 Revert 并不像在线文章中听起来那样简单,至少对我而言。

谢谢大家。

于 2013-08-22T09:53:35.307 回答
0

git reflog是你想看的地方。只要您有一段时间没有垃圾收集,您就应该能够git reset --hard HEAD@{x}使用 x 作为历史上的特定点,您希望将本地分支中的所有内容重置回。

一旦你这样做,我会做一个git push --force把你的公共回购放回你想要的地方......

这有一个不幸的问题,如果其他人已经从你的遥控器中拉出,他们的历史就会被搞砸。

于 2013-08-19T13:10:19.393 回答