16.2.3 同时更改文件名和文件内容

如果一个用户将文件移动到其他目录(或修改文件名),另外一个用户针对重命名前的文件进行了修改,还能够实现自动合并么?这对于其他版本控制系统可能是一个难题,例如Subversion就不能很好地处理,还为此引入了一个“树冲突”的新名词。Git对于此类冲突能够很好地处理,可以自动解决冲突实现自动合并,具体操作过程如下。

(1)为确保两个用户的本地版本库和共享版本库状态一致,先分别对两个用户的本地版本库执行拉回操作。


$git pull


(2)用户user1在自己的工作区中将文件README进行重命名,本地提交并推送到共享版本库。


$cd/path/to/user1/workspace/project/

$mkdir doc

$git mv README doc/README.txt

$git commit-m "move document to doc/."

$git push


(3)用户user2在自己的工作区中修改README文件,在文件的最后插入内容,并本地提交。


$cd/path/to/user2/workspace/project/

$echo "User2 hacked again.">>README

$git add-u

$git commit-m "User2 hack README again."


(4)用户user2执行获取(git fetch)操作。获取到的提交更新到本地跟踪共享版本库master分支的本地引用origin/master中。


$git fetch

remote:Counting objects:5,done.

remote:Compressing objects:100%(2/2),done.

remote:Total 3(delta 0),reused 0(delta 0)

Unpacking objects:100%(3/3),done.

From file:///path/to/repos/shared

0855b86..07e9d08 master->origin/master


(5)用户user2执行合并操作,完成自动合并。


$git merge refs/remotes/origin/master

Merge made by recursive.

README=>doc/README.txt|0

1 files changed,0 insertions(+),0 deletions(-)

rename README=>doc/README.txt(100%)


(6)用户user2推送合并后的本地版本库到共享版本库。


$git push

Counting objects:10,done.

Delta compression using up to 2 threads.

Compressing objects:100%(5/5),done.

Writing objects:100%(6/6),636 bytes,done.

Total 6(delta 0),reused 0(delta 0)

Unpacking objects:100%(6/6),done.

To file:///path/to/repos/shared.git

9c51cb9..f73db10 master->master


(7)使用-m参数可以查看合并操作所做出的修改。


$git log-1-m—stat

commit f73db106c820f0c6d510f18ae8c67629af9c13b7(from 887488eee19300c566c272ec84b 236026b0303c6)

Merge:887488e 9c51cb9

Author:user2<user2@moon.ossxp.com>

Date:Sat Dec 25 23:36:57 2010+0800

Merge remote branch 'refs/remotes/origin/master'

README|4——

doc/README.txt|4++++

2 files changed,4 insertions(+),4 deletions(-)

commit f73db106c820f0c6d510f18ae8c67629af9c13b7(from 9c51cb91bfe12654e2de1d61d72 2161db0539644)

Merge:887488e 9c51cb9

Author:user2<user2@moon.ossxp.com>

Date:Sat Dec 25 23:36:57 2010+0800

Merge remote branch 'refs/remotes/origin/master'

doc/README.txt|1+

1 files changed,1 insertions(+),0 deletions(-)