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.

這樣就出現和書中一樣的結果了。

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