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