16.5.2 交互式解决树冲突
树冲突虽然不能像文件冲突那样使用图形工具进行冲突解决,但还是可以使用git mergetool命令,通过交互式问答快速解决此类冲突。
首先将user2的工作区重置到前一次提交,再执行git merge引发树冲突。
(1)重置到前一次提交。
$cd/path/to/user2/workspace/project $git reset—hard HEAD^ HEAD is now at 20180eb rename doc/README.txt to README $git clean-fd
(2)执行git merge引发树冲突。
$git merge refs/remotes/origin/master CONFLICT(rename/rename):Rename "doc/README.txt" ->"README" in branch "HEAD" rename "doc/README.txt" ->"readme.txt" in "refs/remotes/origin/master" Automatic merge failed;fix conflicts and then commit the result. $git status-s AU README DD doc/README.txt UA readme.txt
上面的操作所引发的树冲突,可以执行git mergetool命令进行交互式冲突解决,会如下逐一提示用户进行选择。
(1)执行git mergetool命令。忽略其中的提示和警告。
$git mergetool merge tool candidates:opendiff kdiff3 tkdiff xxdiff meld tortoisemerge gvimdiff diffuse ecmerge p4merge araxis emerge vimdiff Merging: doc/README.txt README readme.txt mv:无法获取"doc/README.txt"的文件状态(stat):没有那个文件或目录 cp:无法获取"./doc/README.txt.BACKUP.13869.txt"的文件状态(stat):没有那个文件或目录 mv:无法将".merge_file_I3gfzy"移动至"./doc/README.txt.BASE.13869.txt":没有那个文件或目录
(2)询问对文件doc/README.txt的处理方式。输入d选择将该文件删除。
Deleted merge conflict for 'doc/README.txt': {local}:deleted {remote}:deleted Use(m)odifed or(d)eleted file,or(a)bort?d
(3)询问对文件README的处理方式。输入c选择将该文件保留(创建)。
Deleted merge conflict for 'README': {local}:created {remote}:deleted Use(c)reated or(d)eleted file,or(a)bort?c
(4)询问对文件readme.txt的处理方式。输入d选择将该文件删除。
Deleted merge conflict for 'readme.txt': {local}:deleted {remote}:created Use(c)reated or(d)eleted file,or(a)bort?d
(5)查看当前状态,只有一些尚未清理的临时文件,而冲突已经解决。
$git status-s ?? .merge_file_I3gfzy ?? README.orig
(6)提交完成冲突解决。
$git commit-m "fixed tree conflict." [master e070bc9]fixed tree conflict.
(7)向共享服务器推送。
$git push Counting objects:5,done. Delta compression using up to 2 threads. Compressing objects:100%(3/3),done. Writing objects:100%(3/3),457 bytes,done. Total 3(delta 0),reused 0(delta 0) Unpacking objects:100%(3/3),done. To file:///path/to/repos/shared.git 615c1ff..e070bc9 master->master
