如何管理与git子模块的冲突?

Tyl*_*ler 108 git branch conflict git-submodules

我有一个引用多个子模块的git超级项目,我试图锁定其他项目成员的工作流程.

对于这个问题,让我说我的超级项目被调用supery并且子模块被调用subby.(然后是我正在尝试做的简化......我实际上并没有使用分支版本,但我认为最简单的问题是布局.)

我的主分支supery具有作为子模块引用v1.0的git项目的subby标记.的分支superyone.one,改变了子模块的引用指向该标记v1.1subby.

我可以毫不费力地在每个分支中工作,但如果我尝试使用one.one分支更改来更新分支,master我会收到一些冲突,而我不知道如何解决它们.

基本上在分支中运行一段git pull . master时间之后subby,看起来它会创建其他子模块.

在拉/合并之前,我git submoduleone.one分支获得了所需的响应:

$ git checkout master
$ git submodule
qw3rty...321e subby (v1.0)
$ git checkout one.one
$ git submodule
asdfgh...456d subby (v1.1)
Run Code Online (Sandbox Code Playgroud)

但是在拉动之后,它会在我运行时添加额外的子模块git submodule:

$ git pull . master
Auto-merged schema
CONFLICT (submodule): Merge conflict in subby - needs qu3rty...321e
Automatic merge failed; fix conflicts and then commit the results.

$ git submodule
qw3rty...321e subby (v1.0)
asdfgh...456d subby (v1.1)
zxcvbn...7890 subby (v1.1~1)
Run Code Online (Sandbox Code Playgroud)

如何删除/忽略不需要的子模块引用并提交我的冲突和更改?或者我可以使用我的原始参数来git pull忽略我的子模块吗?

Tyl*_*ler 78

好吧,它不是技术上管理与子模块的冲突(即:保留这个而不是那个),但我找到了继续工作的方法......我所要做的就是注意我的git status输出并重置子模块:

git reset HEAD subby
git commit
Run Code Online (Sandbox Code Playgroud)

这会将子模块重置为预拉提交.在这种情况下,这正是我想要的.在其他我需要应用于子模块的更改的情况下,我将处理那些具有标准子模块工作流程(结账主机,下拉所需标签等).

  • 您可能希望保留合并分支的子模块:git reset <merged-branch> subby (4认同)

Emm*_*ows 48

我对这个问题的答案有点挣扎,并且在类似的SO帖子中的答案也没有太多运气.所以这对我有用 - 请记住,在我的情况下,子模块由不同的团队维护,因此冲突来自master和我正在研究的项目的本地分支中的不同子模块版本:

  1. 运行git status- 记下带有冲突的子模块文件夹
  2. 将子模块重置为当前分支中上次提交的版本:

    git reset HEAD path/to/submodule

  3. 此时,您有一个无冲突版本的子模块,您现在可以将其更新到子模块的存储库中的最新版本:

    cd path/to/submodule
    git submodule foreach git pull origin SUBMODULE-BRANCH-NAME
  4. 现在你可以commit这样做并重新开始工作.

  • 唯一明确和有效的解决方案upvote (3认同)

Jes*_*ett 20

我以前没见过那个确切的错误.但我猜你遇到的麻烦.看起来因为子模块包含不同引用的masterone.one分支,当你从git 合并更改时,不知道哪个引用或者应该由分支保存和跟踪.superysubbymasterv1.0v1.1one.onesupery

如果是这种情况,那么您需要选择所需的ref并提交该更改以解决冲突.这正是您使用reset命令所做的.

在项目的不同分支中跟踪子模块的不同版本是一个棘手的方面.但子模块ref与项目的任何其他组件一样.如果两个不同的分支在连续合并之后继续跟踪相同的相应子模块refs,那么git应该能够计算出模式而不会在将来的合并中引发合并冲突.另一方面,如果你频繁切换子模块,你可能不得不忍受大量的冲突解决.

  • 最后!一个答案!我已经'添加了我们:../ Mono.Cecil`在`git status`但是'git add`和`git rm`失败了`Mono.Cecil:需要合并,pathspec'Mono.Cecil /'与任何匹配files`因为它只是一个空文件夹,而git只能真正处理文件.`git checkout`给了我`Mono.Cecil:需要合并,错误:你需要首先解决你当前的索引`,`git submodule update`给`跳过未合并的子模块Mono.Cecil`和`git checkout master Mono.Cecil`最后固定它.基本问题:`git status`建议是错误的,所以选择一个分支并将其文件夹的副本带为`checkout`! (26认同)
  • @ IBBoard的命令帮助我解决了这种情况 - 我尝试了`git checkout --ours SUBMOD`和`git add SUBMOD`等等,但最后做了`git checkout master SUBMOD`修复了冲突.这个评论应该是一个答案,而不是评论... :) (6认同)

hel*_*tan 15

首先,找到要引用子模块的哈希值.然后运行

~/supery/subby $ git co hashpointerhere
~/supery/subby $ cd ../
~/supery $ git add subby
~/supery $ git commit -m 'updated subby reference'
Run Code Online (Sandbox Code Playgroud)

这对我来说是有用的,可以让我的子模块得到正确的哈希引用,继续我的工作而不会产生任何进一步的冲突.

  • @Bachi: git checkout --theirs 和 --ours 对子模块没有影响。 (2认同)
  • 虽然这确实解决了冲突,但要确定 &lt;hashpointerhere&gt; 并不容易。我不知道有什么简单的方法可以查看冲突每一方的子模块提交。您在 subby 中检出的任何提交都可能与合并的任一侧不同,这在合并提交中是不合适的。 (2认同)

mar*_*hon 10

我有git rebase -i origin/master一个分支问题.我想采用主模块的子模块参考,所以我只是做了:

git reset master path/to/submodule

然后

git rebase --continue

这解决了我的问题.

  • 这对我有用.我还在想他们为了破坏子模块做了些什么 (3认同)

小智 10

从这次讨论中得到了帮助。就我而言

git reset HEAD subby
git commit
Run Code Online (Sandbox Code Playgroud)

为我工作:)


小智 6

以上所有内容对我来说都不起作用...我的子模块位于“未合并路径”下,但我被卡住了...

最终,经过多次尝试,有效的是:从子模块中手动删除合并冲突文件,而不是在主存储库中:

git restore --staged submodule_path
Run Code Online (Sandbox Code Playgroud)

(这将其移至“未暂存提交的更改:”)

 git clean -df
Run Code Online (Sandbox Code Playgroud)

然后

git 子模块更新 --init