所以我用git-subtree在repoA的子目录中有repoB的各种分支,就像这样
git clone repoA
cd repoA
// some commits to repoA here
git subtree add --prefix=src/dirA repoB branchA
我在repoA中做了一些提交
git subtree push --prefix=src/dirA repoB branchA
一段时间后,我从另一个仓库中向repoB / branchA提交了一些东西,其中也使用git-subtree添加了branchA。
现在,我尝试
git subtree pull --prefix=src/dirA repoB branchA
但是,我没有明显的原因遇到合并冲突。更改很简单,根本没有冲突-补丁已确认。
我不确定如何解决此错误。我已经找到另外两个处理相同/相似问题的线程:
我不确定这是否与不同的SHA-1相关,因为我没有重新提交提交,也没有编辑它们。链接1到3。
我的问题更像是链接4,其中git神奇地无法进行简单的合并。但是,链接3讨论的是子树合并策略,而不是git-subtree,因此我不确定这是否完全适用于我的情况。
情况看起来是一样的:
<<<<<<< HEAD
=======
// changes from commit I try to pull from repoB/branchA
>>>>>>> {commit SHA-1 from commit I try to pull from repoB/branchA}
因此,我注意到在三向合并窗口(kdiff3)中BASE显然是错误的。但是,如果是这种情况,为什么git不尝试应用自base以来的所有更早提交?发行
git log --oneline
在失败的合并之后但在合并/尝试合并之前,显示有问题的提交之前没有重复的提交。
显示为BASE的文件的版本就是我初次发布时的文件版本
git subtree add --prefix=src/dirA repoB branchA
内部回购。
发生什么了?似乎与git子树由于某种原因找不到我的提交有关,但是它没有尝试将BASE的提交应用于HEAD〜1,而是仅将我实际上缺少的提交应用于HEAD。
如何解决此错误而又不弄乱任何一个存储库的历史记录?为什么git无法提取这个简单的提交,却认为这是合并冲突?
任何见解将不胜感激。
最佳答案
好的,所以我知道了。这是一个两方面的问题。首先,我的树实际上看起来像这样:
我的树中有一个碰触src/dirA
的提交,但是当repoB/branchA
已经继续进行时,尚未提交。
我发现git subtree pull
找不到合适的基础,因为它正在寻找一个共同的祖先,因此它在我上次合并树时(即当我最初调用git subtree add
时)使用了该版本。
现在,要解决常见的祖先问题,必须执行git subtree split --rejoin
,它执行敷衍合并,因此git再次找到正确的基础,即在将提交从repoA
推送到repoB/branchA
之后。
但是,正如您在我的案例中所看到的那样,后面是git subtree split --rejoin
的git subtree pull
不能解决我的问题:
由于git subtree split
会创建所有触摸src/dirA
的提交的综合历史记录,而不管是否推送了split
的事实,因此SHA-1的总和发散了。为了进行演示,我将合成历史记录划分为自己的分支git subtree pull
。git subtree split --rejoin
当然会在git subtree push
之后成功。但是,下一个repoB
将失败,因为此后git subtree split --rejoin
和合成树的历史完全不同。
因此,我必须先回过头来,然后再执行不受欢迎的提交,然后将所做的更改从该分支中拉到我的分支中。由于仍然需要git subtree pull
,这使情况变得复杂,因为通过git merge
的src/dirA
仍然无法自行找出正确的基础。
因此,我当前解决问题的方法是在有问题的非推送式git subtree split --rejoin
提交之前直接 check out 提交。然后我做了一个git subtree pull
然后是git subtree pull
。当然,这会将两个合并添加到我的主树中,我无法弄清楚如何压缩到一个合并中,并且从我在源代码中所读的内容来看,似乎没有一个简单的解决方案可以解决这个问题。
成功完成master
之后,我将master_fix
分支中的其余提交重新部署到repoA/master_fix
上。现在,SHA-1的总和在repoB/branchA
和master
的共享历史记录中都匹配。
当然,这具有重新设置的通常缺点:如果其他人正在使用git branch -m master_fix master
,则他们的历史将被ojit_code破坏。
关于git - git-subtree pull merge 冲突,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25294227/