所以我使用git-subtree将repoB的各个分支放在repoA的子目录中,如下所示
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
不久之后,我从另一个名为repoC的仓库向repoB/branchA提交了一些内容,其中branchA也是使用git-subtree添加的。
现在,我尝试
git subtree pull --prefix=src/dirA repoB branchA
然而,我出现了一个没有明显原因的合并冲突。更改很简单,根本不冲突——这已经通过补丁确认过了。
我不确定如何解决这个错误。我已经找到了另外四个与同样或类似问题相关的线程:
1. git-subtree pull complications 2. git subtree pull -P whatever <repo> <ref> always merge conflict 3. git-subtree conflict when pulling from central repo 4. Git Subtree Merging reports conflict when merging a simple upstream change(尽管这个是关于子树合并策略的,见下文)
我不确定这是否与不同的SHA-1有关,因为我没有rebase我的提交,也没有编辑它们; 链接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
在合并失败之后但在合并/尝试合并之前,显示的提交中没有重复的提交。作为基础的文件版本是我最初发出时的文件版本。
git subtree add --prefix=src/dirA repoB branchA
在repoA内部。
那是怎么回事?似乎与git子树无法找到我的提交有关,但它没有尝试将BASE到HEAD~1的提交应用,而只是我实际缺少的提交HEAD。
如何修复此错误而不破坏任何存储库的历史记录?为什么git不能拉取这个简单的提交,而是认为它是合并冲突?
任何见解都将不胜感激。