gpt4 book ai didi

git - 子模块移动后 merge 冲突

转载 作者:太空狗 更新时间:2023-10-29 13:44:35 24 4
gpt4 key购买 nike

在开发分支中移动子模块后,每次从 master 分支 merge 更改时,我都会遇到 merge 冲突。要解决,我必须 git add mysubmodule。每次 merge 时如何避免解决这个冲突?

这是一个说明问题的脚本:

cd ~/src
git init MyProduct
git init MySubmodule
cd MySubmodule
echo "foo" > foo.txt
git add foo.txt
git commit -m "Add foo.txt"
cd ../MyProduct
echo "bar" > bar.txt
git add bar.txt
git commit -m "Add bar.txt"
git submodule add ../MySubmodule
git commit -m "Add MySubmodule"
git branch development
git checkout development
git mv MySubmodule OurSubmodule
git commit -m "Move MySubmodule to OurSubmodule."
git checkout master
echo "barbar" > bar.txt
git commit -am"Update bar.txt"
git checkout development
git merge master
git add OurSubmodule
git commit -am"Resolve conflict"

我在 merge 时收到的 merge 冲突消息是:

Auto-merging OurSubmodule
Adding as OurSubmodule~HEAD instead
Automatic merge failed; fix conflicts and then commit the result.

最佳答案

问题是由于在 merge 之前运行 git submodule update,但我不确定为什么。如果 OurSubmodule 为空,则 merge 正常。但是,如果 OurSubmodule 包含一个 git repo,则 merge 失败。

$ git submodule update
Submodule path 'OurSubmodule': checked out 'fc7d6244ff60b52884da1e562edbc9059f758494'

$ git status
On branch development
nothing to commit, working tree clean

$ git merge master
Auto-merging OurSubmodule
Adding as OurSubmodule~HEAD instead
Automatic merge failed; fix conflicts and then commit the result.

$ git status
On branch development
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)

Changes to be committed:

modified: bar.txt

Unmerged paths:
(use "git add <file>..." to mark resolution)

added by us: OurSubmodule

Adding as OurSubmodule~HEAD instead 表示 git merge 未能注意到重命名。 Git 中的重命名不会被记录下来,Git 会查看内容的相似程度。我猜这是 git merge 的子模块重命名检测中的一些错误或失败。

如果你 git add OurSubmodule 一切都很好。

$ git add OurSubmodule/
$ git status
On branch development
All conflicts fixed but you are still merging.
(use "git commit" to conclude merge)

Changes to be committed:

modified: bar.txt

如果您随后将 development merge 到 master 中,一切都很好。

由于重命名子模块非常罕见,除非您想深入了解 Git 的内部结构,否则我建议您解决冲突并继续。 Git 的自动 merge 很好,但有时会发生冲突。


关于子模块的注释。子模块往往比它们的值(value)更麻烦。如果您的代码依赖于其他存储库,请考虑改用包管理器。最好是可以直接从 Git 存储库中 pull 的。

即使使用得当,您也可以轻松更改代码和子模块以进行匹配,从而鼓励将本应独立的项目紧密绑定(bind)在一起。将它们分成必须单独处理和构建的包,即使只需要一分钟,也会鼓励项目之间的良好界限。

关于git - 子模块移动后 merge 冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51271135/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com