Git 合并子模块改动没有出现 ‘merge following commits not found’

出现的问题

在《Pro Git》的第7章11节—— 合并子模块改动 中,输入git pull 命令,并没有出现如下书中的结果

$ git pull
remote: Counting objects: 2, done.
remote: Compressing objects: 100% (1/1), done.
remote: Total 2 (delta 1), reused 2 (delta 1)
Unpacking objects: 100% (2/2), done.
From https://github.com/chaconinc/MainProject
   9a377d1..eb974f8  master     -> origin/master
Fetching submodule DbConnector
warning: Failed to merge submodule DbConnector (merge following commits not found)
Auto-merging DbConnector
CONFLICT (submodule): Merge conflict in DbConnector
Automatic merge failed; fix conflicts and then commit the result.

而是出现下面的内容,

$ git pull
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 2 (delta 0), reused 2 (delta 0), pack-reused 0
Unpacking objects: 100% (2/2), done.
From https://github.com/username/MainProject
   faf7642..f3561d9  master     -> origin/master
Fetching submodule DbConnector
From https://github.com/username/DbConnector
   42c390a..1a5f567  master     -> origin/master
Updating faf7642..f3561d9
Fast-forward
 DbConnector | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

此结果中并没有出现 merge following commits not found,再查看子模块,发现远程分支与本地分支并没有产生冲突,而是分叉了

$ graph
* a88a3be (HEAD -> master) add return 0;
| * 1a5f567 (origin/master, origin/HEAD) add return 1;
|/
* 42c390a first commit

解决的办法

出现这个问题的原因是,没有在主项目中,提交子模块的修改。下面就来具体演示一下如何复现书本上的内容。新建一个 MainProject 文件夹,在里面新建一个 main.c 文件,在该文件中输入

#inclue<stdio.h>
int main(){

}

然后把 MainProject 文件夹初始化为 git 项目

$ git init
Initialized empty Git repository in /Users/apple/Git/MainProject/.git/

$ git add main.c

$ git commit -m 'first commit'
[master (root-commit) 15a113b] first commit
 1 file changed, 4 insertions(+)
 create mode 100644 main.c

新建一个 DbConnector 文件夹,在里面新建一个 connector.c在该文件中输入

#include<stdio.h>
int main(){
    printf("DbConnector");
}

初始化为 git 项目

$ git init
Initialized empty Git repository in /Users/apple/Git/DbConnector/.git/

$ git add connector.c

$ git commit -m 'first commit'
[master (root-commit) 42c390a] first commit
 1 file changed, 4 insertions(+)
 create mode 100644 main.c

在 Github 中新建一个 DbConnector 的仓库,把本地的内容推送上去

$ git remote add origin https://github.com/username/DbConnector.git

$ git push -u origin master
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 262 bytes | 262.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/username/DbConnector.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.

回到 MainProject,给它添加子模块,并提交

$ git submodule add https://github.com/username/DbConnector.git
Cloning into '/Users/apple/Documents/Git/MainProject/DbConnector'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.

$ git commit -m 'add submodule'
[master faf7642] add submodule
 2 files changed, 4 insertions(+)
 create mode 100644 .gitmodules
 create mode 160000 DbConnector

在 Github中新建一个 MainProject 仓库,把本地的内容推送上去

$ git remote add origin https://github.com/username/MainProject.git

$ git push -u origin master
Enumerating objects: 6, done.
Counting objects: 100% (6/6), done.
Delta compression using up to 8 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 595 bytes | 595.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0)
To https://github.com/username/MainProject.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.

本机的其它文件夹别的计算机 中克隆 MainProject

$ git clone --recursive https://github.com/username/MainProject.git
Cloning into 'MainProject'...
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 0), reused 6 (delta 0), pack-reused 0
Unpacking objects: 100% (6/6), done.
Submodule 'DbConnector' (https://github.com/username/DbConnector.git) registered for path 'DbConnector'
Cloning into '/Users/apple/Downloads/MainProject/DbConnector'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Submodule path 'DbConnector': checked out '42c390a15689a128dd017f1ca38b267af1c206c8'

现在我们有了两个 MainProject,一个是原本的,一个是克隆的,目前两个仓库里的内容是一模一样的,现在让它们的分支产生分叉。来到克隆过后的 MainProject 里的子模块 DbConnector

git checkout master

在代码中添加return 0;,如下

#include<stdio.h>
int main(){
    printf("DbConnector");
    return 0;
}

并在子模块中提交

$ git commit -am 'add return 0;'
[master 24cfc12] add return 0;
 1 file changed, 1 insertion(+)

下面是解决问题的关键!关键!关键!重要的事情说三遍!首先切换回克隆的主项目目录

$ cd ..

运行git status我们可以看到我们的修改

$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   DbConnector (new commits)

no changes added to commit (use "git add" and/or "git commit -a")

我们必须把在子项目修改的内容在主项目再提交一次

$ git commit -am 'add return 0;'
[master febe029] add return 0;
 1 file changed, 1 insertion(+), 1 deletion(-)

如果没有提交,当下面使用 git pull命令时,提示信息就不会出现 merge following commits not found,就不会输出和书上一样的结果。现在回到原本的 MainProject 中的子模块,添加与克隆的项目的子模块不一样的提交,如下

#include<stdio.h>
int main(){
    printf("DbConnector");
    return 1;
}

在子模块中提交该修改

$ git commit -am 'add return 1;'
[master 1a5f567] add return 1;
 1 file changed, 1 insertion(+)

回到原本的 MainProject 中,把当前的主项目和子模块的提交推向远程分支,使远程分支与克隆过后的分支产生分叉。在 connector.c 文件中添加 return 1;

$ cd ..

$ git commit -am 'add return 1;'
[master 524639a] add return1;
 1 file changed, 1 insertion(+)
 
$ git push --recurse-submodules=on-demand
Pushing submodule 'DbConnector'
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 303 bytes | 303.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/username/DbConnector.git
   42c390a..1a5f567  master -> master
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 302 bytes | 302.00 KiB/s, done.
Total 2 (delta 0), reused 0 (delta 0)
To https://github.com/username/MainProject.git
   faf7642..f3561d9  master -> master

然后在克隆的 MainProject 中拉取远程服务器的修改

$ git pull
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 2 (delta 0), reused 2 (delta 0), pack-reused 0
Unpacking objects: 100% (2/2), done.
From https://github.com/username/MainProject
   faf7642..f3561d9  master     -> origin/master
Fetching submodule DbConnector
From https://github.com/username/DbConnector
   42c390a..1a5f567  master     -> origin/master
Failed to merge submodule DbConnector (merge following commits not found)
Auto-merging DbConnector
CONFLICT (submodule): Merge conflict in DbConnector
Automatic merge failed; fix conflicts and then commit the result.

这样就出现和书中一样的结果了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章