【发布时间】:2016-10-10 08:32:48
【问题描述】:
一周前,我使用来自相应分支的代码(从 github 跟踪上游)重置了 %current% 分支中的“ceph-ansible”文件夹的状态:
# git read-tree --prefix=ceph-ansible/ -u ceph_ansible
然后我提交了一些更改,包括:
-
重命名文件并提交:
# git mv site.yml.sample site.yml 做了一些更改并提交
-
通过以下方式从原始分支提取更新:
# git merge -s subtree --squash ceph_ansible
它说:
自动合并 ceph-ansible/site.yml.sample
废话
Squash 提交 -- 不更新 HEAD
自动合并进展顺利;在按要求提交之前停止
我可以看到“我的”ceph-ansible/site.yml 已删除(以及我添加的一些新文件),ceph-ansible/site.yml.sample 已恢复并且不包含我的更改(它只是恢复到我更改之前的状态)。
git log ceph_ansible site.yml.sample 显示 2016 年 8 月 26 日(= ceph-ansible 分支的最新更改),我在 %current% 分支中的更改是今年 10 月,因此也不应该有任何冲突。
我相信这种行为有一些明显的解释。你能帮帮我吗?
更新:我注意到我的 git 已经很老了(1.8.3)并且是从源代码压缩包(2.10.1)构建的。现在的输出是:
# ~/gitbuild/git-2.10.1/git merge -s subtree --squash ceph_ansible
fatal: refusing to merge unrelated histories
快速谷歌搜索显示 (Git refusing to merge unrelated histories ) 默认行为已更改。添加“--allow-unrelated-histories”会清除错误消息,但合并本身仍然是错误的(我的更改丢失了)。
此错误消息可能解释了为什么 git 无法正确合并它(因为这些 repos 没有任何关系,对吧)。有人可以确认一下吗? “merge -s subtree”真的不会合并分支吗?
【问题讨论】:
-
其他人(或某物)进行了删除和修改。反过来想一想:假设您对一个文件进行了一系列更改,然后创建了一个 PR。完成 PR 后,您会希望您所做的事情能够反映在目标分支中。好吧,在这种情况下,某人的愿望实现了,但不是你的。
-
@TimBiegeleisen,感谢您的快速回复!这可以完美地解释它,但正如我所写的
git log ceph_ansible site.yml.sample在 10 月份并没有向我展示任何东西。我如何证明你的想法? -
在合并期间,您的一些工作被丢弃,以支持来自另一个分支的版本。至少,我会这样解释(我准备错了)。
-
@TimBiegeleisen,另外 2 个反对该理论的意见:
-
@TimBiegeleisen,对这一理论的另外 2 个观察结果: * 我在“外部”看不到任何变化,这个文件只是恢复到我的变化之前的状态 * 我的其他不相关的变化被丢弃了,谢谢你的想法!