【发布时间】:2020-04-18 11:34:00
【问题描述】:
我已经用另一个存储库的最后一次提交替换了我初始提交的父级。我想推动这些变化。
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 cloneGitHub 存储库,然后(在新克隆中)执行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 中的提交?