Chinaunix首页 | 论坛 | 博客
  • 博客访问: 303863
  • 博文数量: 35
  • 博客积分: 825
  • 博客等级:
  • 技术积分: 913
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-11 09:44
文章分类

全部博文(35)

文章存档

2013年(10)

2012年(24)

2010年(1)

我的朋友

分类: 系统运维

2012-12-20 23:59:00

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结果

阅读(10396) | 评论(0) | 转发(0) |
0

上一篇:rpmbuild 多了MS换行符

下一篇:git reset

给主人留下些什么吧!~~