所以我用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

但是,我没有明显的原因遇到合并冲突。更改很简单,根本没有冲突-补丁已确认。

我不确定如何解决此错误。我已经找到另外两个处理相同/相似问题的线程:
  • git-subtree pull complications
  • git subtree pull -P whatever <repo> <ref> always merge conflict
  • git-subtree conflict when pulling from central repo
  • Git Subtree Merging reports conflict when merging a simple upstream change(这是关于子树合并策略的,请参见下文)

  • 我不确定这是否与不同的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 --rejoingit 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 mergesrc/dirA仍然无法自行找出正确的基础。

    因此,我当前解决问题的方法是在有问题的非推送式git subtree split --rejoin提交之前直接 check out 提交。然后我做了一个git subtree pull然后是git subtree pull。当然,这会将两个合并添加到我的主树中,我无法弄清楚如何压缩到一个合并中,并且从我在源代码中所读的内容来看,似乎没有一个简单的解决方案可以解决这个问题。

    成功完成master之后,我将master_fix分支中的其余提交重新部署到repoA/master_fix上。现在,SHA-1的总和在repoB/branchAmaster的共享历史记录中都匹配。

    当然,这具有重新设置的通常缺点:如果其他人正在使用git branch -m master_fix master,则他们的历史将被ojit_code破坏。

    关于git - git-subtree pull merge 冲突,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25294227/

    10-14 17:48
    查看更多