【发布时间】:2017-12-15 15:30:18
【问题描述】:
我们的 git repo 是从不同的 VCS (Perforce) 导入的,但标准导入无法恢复分支关系(即分支 1.1 是从分支 1.0 派生的)。为了解决这个问题,我们添加了嫁接:git replace --graft <commit> <parent> 来记录从每个分支的创建到其父提交的缺失关系。
所以我们有一个 git 存储库,它在 .git/refs/replace 中有一些替换。 (这些可能应该通过某种方式重新设置来删除,但现在可能为时已晚)
这些替换必须手动使用:
git pull origin 'refs/replace/*:refs/replace/*'
一位同事不知道这一点,但不知何故能够将更改推送到 repo,以便:
git pull origin 'refs/replace/*:refs/replace/*'
导致合并冲突,例如:
Simple merge did not work, trying automatic merge.
ERROR: /some/file: Not handling case c6aa12b3f446c57921a68c5fc73dae9e086c2bdb -> -> bb909246180daf894ccdb59cc4a4ff398ac62bad
fatal: merge program failed
Automated merge did not work.
Should not be doing an octopus.
Merge with strategy octopus failed
我不明白这里合并了什么。 如果我使用:
git pull origin 'refs/replace/*:refs/replace/*' -s ours
合并成功,我最终(提交后)收到如下合并消息:
commit 67d7f7cc40826e8a84beed3af9999d39e411e65d
Merge: 718dbe3 c9333d1 b870b22 d3f10f7 77d0835 de79e03 d7f0e7c 97ca1f8 Author: xxxxx
Date: Tue Jul 11 11:33:55 2017 +0100
Merge commits 'refs/replace/00029d7b3e531215f6ce5afb32862b49d652e896', 'refs/replace/03d715c9890e5cec95ac62d1c9ecc54cb78b9f62', '
git 声称有几个文件被更改,尽管这些不是最近更改的文件。我怀疑它们是两个旧分支之间的区别。
合并/拉取后,我们在 .git/refs/replace 中有替换。
我的同事的报告称,推动的更改包括复制他需要的 2 个缺失的分支关系的移植。这些根本不会出现在 .git/refs/replace 中。
如果它们以某种方式与之前推送的内容混在一起,还有其他一些问题:
他怎么能在不先解决合并冲突的情况下进行推送?
此外,如果您从存储库克隆而不拉取替换,他添加的关系仍然会被拉取。有两个明显的提交,提交消息如下:
Former-commit-id: bc735afc1d8bb842733cb94767afb8b42599eb6a
但是没有描述替换的 .git/refs/replace 目录。
我的同事如何能够将他的移植物作为对回购协议的永久更改,而之前的代码不是自动提取的? 这样根本就没有 .git/refs/replace 目录?
有人可以告诉我这里可能发生什么吗?
还有什么我可以在不重写历史的情况下使其他分支关系永久化吗?我的同事似乎已经这样做了,但我不明白是怎么做到的。
已解决
总结答案:
在 git 中,push 的反面是 fetch 而不是 pull
我的同事 push 不会有合并问题,因为没有合并问题。它是我使用 'pull' 而不是 'fetch' 的产物。
感谢您的帮助。
【问题讨论】:
标签: git