【问题标题】:what causes submodule conflicts in git, and how should they be resolved?是什么导致 git 中的子模块冲突,应该如何解决?
【发布时间】:2011-10-05 17:14:42
【问题描述】:

我们正在使用子模块,我们是 git 新手。

我们经常看到子模块本身的合并冲突,没有文件冲突,只有子模块。 git submodule summary 的输出中列出了多个版本。我们通过在超级项目中运行 git add <submodule> 来解决它们。
但是今天我们有一位开发人员在以这种方式解决冲突时丢失了子模块的提交。
运行 git add 会选择远程版本吗?子模块的内容不应该合并吗?如果她在子模块中进行了更改并提交了它们(我看到了),那么为什么在她运行拉取并解决冲突后该提交会消失?

【问题讨论】:

    标签: git merge git-submodules conflict


    【解决方案1】:

    你的本地子模块和远程子模块已经分道扬镳了。

    git checkout --theirs submodulename
    

    或您的版本:

    git checkout --ours submodulename
    

    然后使用 git add 提交更改并提交更改。

    注意:如果您使用制表符补全,您的 shell 可能会在子模块名后面添加一个斜杠,因为它也是一个子目录。如果是这样,你需要删除它,否则你会得到:

    error: pathspec 'submodulename/' did not match any file(s) known to git.
    

    【讨论】:

    • 这对我不起作用:上游更改了模块,并且在合并他们的更改时我尝试了 'git checkout --theirs ios_src' 但在 'git diff origin/dev_ios 。我仍然看到我的本地 oid 标记为“-dirty”,而新的 oid 没有标记为脏。我期待看到我的本地线路是带有“-dirty”标记的新 oid。提交也给我留下了我的oid。进入模块并明确检查根目录,然后添加它可以工作,但这很乏味。
    【解决方案2】:

    文件冲突和子模块冲突都发生当你当前的分支和你的分支-want-to-merge-into 已经分道扬镳

    这仅仅意味着存在一种模棱两可的情况——在任何给定的情况下,您都可以合理地希望 either “赢”。因此,虽然它可能看起来“烦人”,但它们只是突出显示您的丰富选项以指定您想要的内容(并且您必须指定您想要的内容)。 (而且,程序员每天所做的只是指定细节。)

    似乎 git-add-the-submodule-on-the-superproject 应该有效。但是,您也可以选择立即执行 git-checkout-on-the-superproject。这个链接(解决子模块冲突)中提到了这一点,其中谈到了file冲突和summodule冲突的区别,以及如何解决它们:

    http://pacific.mpi-cbg.de/wiki/index.php/Git_Conflicts

    【讨论】:

    • 我认为该链接目前无效。 WebArchive 救援:web.archive.org/web/20100925080451/http://pacific.mpi-cbg.de/…
    • git checkout --theirs 或您的版本: git checkout --ours
    • 澄清您的初始声明:潜在的冲突文件/子模块必须在两条不同的路径中都发生了变化。只是一个分支发散并不意味着你会遇到冲突。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 2019-12-22
    • 2017-08-13
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 2012-10-25
    相关资源
    最近更新 更多