出現的問題
在《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.
這樣就出現和書中一樣的結果了。