git merge操作的时候免不了会遇到conflict的状况 找出什么地方出现conflict很简单 git给我们很多的提示 查看conflict的文件 git加入的提示和cvs或者其它的版本控制工具类似 但是git在处理这些conflict的时候给我们提供更多的提示 我们可以利用多种方法来定位conflict的来源 对比不同branch之间的不同等等
首先,找到包含conflict的文件 一般的命令包括
git diff
git status
git ls-files -u (这个命令的结果比较奇葩)
找到文件后 cat一下 就可以找到conflict具体的地方
找到了conflict的地方 我们可以通过一些方面来追溯 产生conflict的那些递交可以使用
git log --merge --left-right -p
其中--merge选项告诉git只要显示那些和conflict相关的递交 --left-right会在commit的信息中加入< 或者> 来提示这个commit是在当前分支 还是在那个需要被merge进来的分支上
上面提到git ls-fils -s这个命令的奇葩结果 它的结果可能如下:
仔细观察 会注意到在commit sha1和文件之间多了一列 0 1 2 3 这个是什么意思呢?
我们在进行merge操作时 .git/MERGE_HEAD里列出了需要merge进来的那个分支的最近的commit sha1 .git/MERGE_MSG里有默认的merge信息 如果没有conflict那么很简单 就是merge xxx 但是如果出现conflict 会包含那些conflict的文件信息
git index会存放每一个有conflict的文件的3个copy, merge base 当前分支上的该文件版本 还有theirs 被merge进来的分支上的该文件版本 ls-files -s中的 1 2 3 就分别指代了这里的merge base ours 和theirs的文件版本(ls-files -s结果中的0 表示该文件没有冲突)我们可以用git cat-file -p 对应的hash sha1(其实它是一个blob)来查看文件的内容 还有一个conflict的版本就是在当前的working目录里 带有conflict提示
我们可以用git diff --theirs 或者git diff --ours来得到当前working目录中的文件与相应分支中该文件的diff结果
阅读(10445) | 评论(0) | 转发(0) |