Git教程
Git标签管理
Git分支
Git操作
Git应用
GitHub应用
IDEA对于Git&GitHub的支持
Git与GitHub使用注意事项

Git处理冲突

假设要在wchar_support分支中执行更改,修改wchar_support分支中的代码。添加一个计算长度的函数:count_len(obj),代码变化如下:

$ git branch
  master
* wchar_support

Administrator@MY-PC /D/worksp/sample/src (wchar_support)
$ git diff
diff --git a/src/string.py b/src/string.py
index ba6d584..4307fe2 100644
--- a/src/string.py
+++ b/src/string.py
@@ -13,4 +13,7 @@ a = '我'  #
 b = 'ab'
 ab = '我ab'

-print(len(a), len(b), len(ab), len('='))
\ No newline at end of file
+print(len(a), len(b), len(ab), len('='))
+
+def count_len(obj):
+    return len(obj)
\ No newline at end of file

假设验证代码后,没有问题就提交这些更改。

$ git status
On branch wchar_support
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   string.py

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

Administrator@MY-PC /D/worksp/sample/src (wchar_support)
$ git add string.py

Administrator@MY-PC /D/worksp/sample/src (wchar_support)
$ git commit -m "add new function: count_len(obj)"
[wchar_support 1cc9ddb] add new function: count_len(obj)
 1 file changed, 4 insertions(+), 1 deletion(-)

执行 master 分支变更

同时在master分支中,另外一个开发人员(minsu)还会更改了内容,并将其更改推送到master分支。

bjpowernode@ubuntu:~/git/sample/src$ git diff
diff --git a/src/string.py b/src/string.py
index ba6d584..5eb2a5d 100644
--- a/src/string.py
+++ b/src/string.py
@@ -13,4 +13,6 @@ a = '我'  #
b = 'ab'
ab = '我ab'

-print(len(a), len(b), len(ab), len('='))
\ No newline at end of file
+print(len(a), len(b), len(ab), len('='))
+def obj_len(obj):
+    return len(obj)
bjpowernode@ubuntu:~/git/sample/src$

验证差异后,现在就提交更新内容。

bjpowernode@ubuntu:~/git/sample/src$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   string.py

no changes added to commit (use "git add" and/or "git commit -a")
bjpowernode@ubuntu:~/git/sample/src$ git add string.py
bjpowernode@ubuntu:~/git/sample/src$ git commit -m 'Changed function name from w_strlen to my_wc_strlen'
[master 07cd5af] Changed function name from w_strlen to my_wc_strlen
 1 file changed, 3 insertions(+), 1 deletion(-)
bjpowernode@ubuntu:~/git/sample/src$ git push origin master
Username for 'http://git.oschina.net': 769728683@qq.com
Password for 'http://769728683@qq.com@git.oschina.net':
Counting objects: 4, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 398 bytes | 0 bytes/s, done.
Total 4 (delta 1), reused 0 (delta 0)
To http://git.oschina.net/bjpowernode/sample.git
   e7d1734..07cd5af  master -> master

在wchar_support分支上,我们已经实现了一个count_len(obj)函数。假设经过测试后,提交并将其更改推送到wchar_support分支。

出现冲突

假设另外一个开发人员(minsu)想看看我们在wchar_branch分支上做了什么,他试图从wchar_support分支中拉出最新的变化,但是Git会中断这个操作,并显示以下错误消息。

bjpowernode@ubuntu:~/git/sample/src$ git pull origin wchar_support
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (4/4), done.
From http://git.oschina.net/bjpowernode/sample
 * branch            wchar_support -> FETCH_HEAD
   e7d1734..1cc9ddb  wchar_support -> origin/wchar_support
Auto-merging src/string.py
CONFLICT (content): Merge conflict in src/string.py
Automatic merge failed; fix conflicts and then commit the result.
bjpowernode@ubuntu:~/git/sample/src$

解决冲突

从错误消息中,很明显文件:src/string.py 中存在冲突。运行git diff命令查看更多细节。

bjpowernode@ubuntu:~/git/sample/src$ git diff
diff --cc src/string.py
index 5eb2a5d,4307fe2..0000000
--- a/src/string.py
+++ b/src/string.py
@@@ -14,5 -14,6 +14,11 @@@ b = 'ab
  ab = '我ab'

  print(len(a), len(b), len(ab), len('='))
++<<<<<<< HEAD
 +def obj_len(obj):
 +    return len(obj)
++=======
+
+ def count_len(obj):
 -    return len(obj)
++    return len(obj)
++>>>>>>> 1cc9ddb410561976b006106590481cc01b79080e
bjpowernode@ubuntu:~/git/sample/src$

由于两个人同进修改了string.py中的代码,所以Git处于混乱状态,并且要求用户手动解决冲突。

假设maxsu决定保留修改的代码,并删除了自己定义的函数:obj_len(obj)。删除冲突标记后(<<<<<<<<<<<<<<<< 和 >>>>>>>>>>>>>>>>>>>>的行),现在冲突的代码如下所示:

解决冲突需要修改代码后,如下所示:

git diff将如下所示:

bjpowernode@ubuntu:~/git/sample/src$ git diff
diff --cc src/string.py
index 5eb2a5d,4307fe2..0000000
--- a/src/string.py
+++ b/src/string.py
@@@ -14,5 -14,6 +14,7 @@@ b = 'ab
  ab = '我ab'

  print(len(a), len(b), len(ab), len('='))
+
 -def count_len(obj):
 -    return len(obj)
 +def obj_len(obj):
 +    return len(obj)
++
bjpowernode@ubuntu:~/git/sample/src$

由于minsu已经修改了这些文件,所以必须首先提交这些修改,然后就可以提出这些修改。如下所示:

bjpowernode@ubuntu:~/git/sample/src$ git add .
bjpowernode@ubuntu:~/git/sample/src$ git commit -a -m 'Resolved conflict'
[master 33f0406] Resolved conflict
bjpowernode@ubuntu:~/git/sample/src$ git pull origin wchar_support

已经解决了冲突,现在执行git pull应该没有问题了。

全部教程