16.2 合并一:自动合并

    Git的合并操作非常智能,大多数情况下会自动完成合并。不管是修改不同的文件,还是修改相同的文件(文件的不同位置),或者文件名变更。

    16.2.1 修改不同的文件

    如果用户user1和user2各自的本地提交中修改了不同的文件,当一个用户将改动推送到服务器后,另外一个用户推送就会遇到非快进式推送错误,需要先合并再推送。因为两个用户修改了不同的文件,合并不会遇到麻烦。

    在上一章的操作过程中,两个用户的本地版本库和共享版本库可能不一致,为了确保版本库状态的一致性,以便下面的实践能够正常执行,分别在两个用户的本地版本库中执行下面的操作。


    $git fetch $git reset—hard origin/master

    下面的实践中,两个用户分别修改不同的文件,其中一个用户要尝试合并操作将本地提交和另外一个用户的提交合并,具体操作过程如下。

    (1)用户user1修改team/user1.txt文件,提交并推送到共享服务器。


    $cd/path/to/user1/workspace/project/ $echo "hack by user1 atdate">>team/user1.txt $git add-u $git commit-m "update team/user1.txt" $git push

    (2)用户user2修改team/user2.txt文件,提交。


    $cd/path/to/user2/workspace/project/ $echo "hack by user2 atdate">>team/user2.txt $git add-u $git commit-m "update team/user2.txt"

    (3)用户user2在推送的时候,会遇到非快进式推送的错误而被终止。


    $git push To file:///path/to/repos/shared.git ![rejected]master->master(non-fast-forward) error:failed to push some refs to 'file:///path/to/repos/shared.git' To prevent you from losing history,non-fast-forward updates were rejected Merge the remote changes(e.g.'git pull')before pushing again.See the 'Note about fast-forwards'section of'git push—help' for details.

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


    $git fetch remote:Counting objects:7,done. remote:Compressing objects:100%(4/4),done. remote:Total 4(delta 0),reused 0(delta 0) Unpacking objects:100%(4/4),done. From file:///path/to/repos/shared bccc620..25fce74 master->origin/master

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


    $git merge origin/master Merge made by recursive. team/user1.txt|1+ 1 files changed,1 insertions(+),0 deletions(-)

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


    $git push Counting objects:12,done. Delta compression using up to 2 threads. Compressing objects:100%(7/7),done. Writing objects:100%(7/7),747 bytes,done. Total 7(delta 0),reused 0(delta 0) Unpacking objects:100%(7/7),done. To file:///path/to/repos/shared.git 25fce74..0855b86 master->master

    (7)通过提交日志,可以看到成功合并的提交及其两个父提交的关系图。


    $git log-3—graph—stat *commit 0855b86678d1cf86ccdd13adaaa6e735715d6a7e |\Merge:f53acdf 25fce74 ||Author:user2<user2@moon.ossxp.com> ||Date:Sat Dec 25 23:00:55 2010+0800 || ||Merge remote branch 'origin/master' || |*commit 25fce74b5e73b960c42e4a463d03d462919b674d ||Author:user1<user1@sun.ossxp.com> ||Date:Sat Dec 25 22:54:53 2010+0800 || ||update team/user1.txt || ||team/user1.txt|1+ ||1 files changed,1 insertions(+),0 deletions(-) || *|commit f53acdf6a76e0552b562f5aaa4d40ff19e8e2f77 |/Author:user2<user2@moon.ossxp.com> |Date:Sat Dec 25 22:56:49 2010+0800 | |update team/user2.txt | |team/user2.txt|1+ |1 files changed,1 insertions(+),0 deletions(-)