Git推送取代了历史

Git推送取代了历史,git,github,Git,Github,我已将初始提交的父级替换为另一个存储库的最后一次提交。我想推动这些变化 我所做的,从和收集: 这样做效果很好,裁判被推了出去。但我一定是弄错了什么。我在远程回购协议中没有看到替换的证据。我的第一次提交仍然是b_root,它没有父级。我正在GitHub上查看,如果有什么不同的话 理想情况下,我会想: 将A中的提交推到master中的B之前 保留提交散列,因为已关闭问题和拉取请求中存在引用 因为这样整个历史都会在同一个存储库中。这种组合可能吗?如果不是,是否可以以销毁引用为代价推送整个历史记录,

我已将初始提交的父级替换为另一个存储库的最后一次提交。我想推动这些变化

我所做的,从和收集:

这样做效果很好,裁判被推了出去。但我一定是弄错了什么。我在远程回购协议中没有看到替换的证据。我的第一次提交仍然是
b_root
,它没有父级。我正在GitHub上查看,如果有什么不同的话

理想情况下,我会想:

  • A
    中的提交推到
    master中的
    B
    之前
  • 保留提交散列,因为已关闭问题和拉取请求中存在引用

因为这样整个历史都会在同一个存储库中。这种组合可能吗?如果不是,是否可以以销毁引用为代价推送整个历史记录,或者至少在存储库中显示父历史记录?或者至少将代码保存在存储库中的某个地方,以便人们获取引用并亲自查看正确的父级应该是什么。

如上面的评论所述,在torek的大力帮助下:

GitHub不显示替换项 在其UI中,被替换的根提交没有父级,提交计数是存储库中原始提交的数量。因此,无法通过GitHub查看替换的旧提交。但是,在执行了我在问题中列出的步骤之后,它们将保存在存储库中,而不依赖于任何其他远程设备

如何查看替换 需要从存储库中提取替换项才能查看它们。作为标记等,克隆时默认情况下不会下载它们

git fetch origin '+refs/replace/*:refs/replace/*'

然后,例如,
git log--oneline
显示完整的历史记录。父关系是伪造的,因此保留最近提交的哈希。如果希望真正应用替换,则可以使用不带参数的git filter branch
。不过,至少在
graft
中,我在将更改推回(索引包,未找到预期对象)时遇到了一些问题。

如果您
git clone
GitHub存储库,然后(在新克隆中)执行
git fetch origin'+refs/replace/*:refs/replace/*'
,新克隆是否遵循了替换?如果是这样的话,那就是GitHub的显示和其他机制故意不遵循替换,不管出于什么原因。@torek确实有它们。而且
git log
甚至显示了历史记录!那么,它现在是否独立于其他存储库存在于我的存储库中?或者它引用了一个单独的遥控器?好的,这只是意味着GitHub不遵循替换。例如,您可以拥有自己的Git,而不是跟随替换(
Git--no replace objects log
)。GitHub(显然)一直在这样做,这可能会使您无法实现您想要的(当然这取决于您想要什么)。所有提交都在GitHub存储库中,从存储库B提交的提交都在“主分支行”上,从存储库A提交的提交可以从
refs/replace/
访问。但是克隆时,通常不会从存储库A中获取任何内容:您必须显式地将
refs/replace/*
refs带过来。@torek这让您安心了,谢谢。那么对于我的另一个选择,有没有一种方法可以使这些替换在主线上实现具体的提交而不影响(甚至不影响)B中的提交?
git fetch origin '+refs/replace/*:refs/replace/*'