【问题标题】:Git push replaced historygit push 替换了历史
【发布时间】:2020-04-18 11:34:00
【问题描述】:

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

我所做的,来自12

git clone B
cd B
git remote add A URL
git fetch A
git replace --graft b_root_sha a_head_sha
git push origin 'refs/replace/*:refs/replace/*'

这工作得很好,裁判被推送了。但我一定是理解错了。我在远程仓库中没有看到替换的证据。我的第一个提交仍然是b_root,它没有父母。我在 GitHub 上查看它,如果有什么不同的话。

理想情况下我会想要:

  • A 中的提交推送到B 之前master
  • 由于已关闭问题和拉取请求中的引用而保留提交哈希

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

【问题讨论】:

  • 如果你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/<hash> 访问。但是在克隆时,您通常不会从存储库 A 中获得任何这些:您必须明确引入 refs/replace/* refs。
  • @torek 这让您高枕无忧,谢谢。所以对于我的另一个选择,有没有办法让这些替换在主线上具体提交而不(甚至)影响 B 中的提交?

标签: git github


【解决方案1】:

正如上面 cmets 中所讨论的,在 torek 的大力帮助下:

GitHub 不显示替换

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

如何查看替换

需要从存储库中获取替换才能查看它们。作为标签之类的,克隆时默认不下载。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-15
    • 2019-04-10
    • 2022-11-10
    相关资源
    最近更新 更多