解决 Git 冲突的 14 个建议和工具
Git 非常善于合并代码。代码的合并在本地完成,快速而且灵活。正常情况下每次从不同分支合并内容时,冲突有可能会发生。通常解决冲突很简单,就如同知道(如何)选择(保留)重要的更改一样,而有时解决冲突则需要额外的工作。
每个开发者对于解决冲突有不同的偏好。不久前,一位叫丹·史蒂文斯的同事用内部软件 Questions for Confluence 询问了大家是如何做的。
收集到的回答和看法比 Atlassian 之墙有更大的吸引力。下面是我们用多种方式解决 Git 冲突的详尽描述,希望它能提供一些可以去尝试的想法,并且融入到你日常编程习惯中。
( Atlassian 之墙是指 Atlassian 公司让客户将意见和反馈贴在墙上,可以参考这幅图(http://atlassian.wpengine.netdna-cdn.com/wp-content/uploads/ww-customers-600x450.jpg),译者注)
通用设置建议
为了设置 Git 使其能正确合并,我们先开始做一些简单的配置。
1. 设置建议
当遇到冲突时,可以在命令行或者其他可视化工具中输入“git mergetool”来初始化合并活动。在“.gitconfig”中用“merge.tool”变量来设置 Git 中自己喜欢的冲突解决软件,比如用 KDiff3 的可能会这样填写”.gitconfig” 的 merge 部分:
[merge]
tool="kdiff3"
上面的语句等价于在命令行输入以下命令:
git config --global merge.tool kdiff3
2. 在冲突标记中显示(分支)共同的祖先
用下面的设置来改进冲突标记使其也显示(分支)共同祖先(感谢罗宾·斯托克和休·吉登斯):
git config --global merge.conflictstyle diff3
这个设置命令新添加一部分标记||||||| 从而给冲突加了注释,这样可以看到冲突行在有问题的两个分支的共同祖先处是什么状态。
3. 合并时使用“耐心”算法
如果文件内容很长(比如一个 XML文件)、冲突很多或者两个版本很不一致时,试着用下面的命令再次合并:
git merge --strategy-option=patience
“耐心”算法的结果应该可以更好地协调一些函数中或者标记中没有配对的括号,具体算法细节可以参考 Stack Overflow 上的一个回答(http://stackoverflow.com/questions/4045017/what-is-git-diff-patience-for)。
4. 当你需要单个文件的历史信息时
除非使用像 SourceTree 一样的可视化工具来弄清到底对一个文件做过什么,不然你可以使用:
git log --merge --decorate --source -p path/to/file/you/care/about
手动解决冲突
处理合并问题主要有两类做法:有些开发者喜欢偏底层处理,因而手工操作处理冲突标记,而有些则偏好可视化工具来辅助(解决冲突)。两种方式都能极其有效地解决冲突。
5. 处理过程示例
有几个同事分享了他们手动处理的过程,比如詹森·欣奇描述了他的处理流程:
从手头的合并开始:
git merge the/other/branch
git status
看下有多少文件冲突。
对每个冲突文件:
- 在编辑器中打开文件(比如 IntelliJ 或 Vim )
- 看看每个被冲突标记(“>>>>”和“<<<<”)围绕的区块。
- 看看(被冲突标记的区块)是否有意义,每个作者的意图是什么,如果能弄清楚就解决掉。
- 如果冲突标记无法理解,通常是这些文件改动很大,运行下面的命令:
git diff HEAD...the/other/branch -- path/to/conflicting/file
git diff the/other/branch...HEAD -- path/to/conflicting/file
这样做是为了看哪边改动较小
通常下面的命令:
git log -p HEAD..the/other/branch -- path/to/conflicting/file
git log -p the/other/branch..HEAD -- path/to/conflicting/file
能帮助理解另一边改动了什么。
回溯文件到改动最大的一边:
git checkout the/other/branch -- path/to/conflicting/file
(在这里你也可以用 git checkout --theirs 或者 --ours )
手动检查并且再重新应用从另一边对文件的更改:
git add path/to/conflicting/file
当这些更改都修复之后要构建整个项目,确保至少可以编译通过,如果测试可以很快运行起来,也要运行一下这些测试:
git commit
这个过程看起来有点太手工化了,但詹森发现对于他的工作流程来说会更少产生不合理的合并。
想看一步步手动解决冲突的基本视频,可以参看我们最近的 Git Power Routines 课程。

合并工具的天堂
有很多不同的可视化工具来操作复杂的合并和解决冲突。我的同事们提到了一些(并不是所有):
6. IntelliJ IDEA 冲突解决工具
IntelliJ IDEA 是很多 Atlassian 工作人员使用的 IDE 。很多人使用它内建的冲突解决工具来处理冲突,它提供了三个面板来分析:本地、远程和合并结果:

7. KDiff3
KDiff3 是 KDE 产品系列的一部分,并且在我们内部调查时提到过几次。

8. P4Merge
SourceTree 的作者斯蒂夫·斯特里廷和其他几个同事使用 P4Merge 来执行合并操作。P4Merge 是免费的可视化工具,它具有四个面板而不是其他工具提供的三个,显示了”base“、”local“、”remote“和”merge result“。

9. meld
meld 是用 GTK+ 和 Python 开发的,也是已经存在了很久的工具,被提到了几次。

10. tig for status + diff
更多喜欢终端的人使用 tig (我们之前写过 tig 的一篇介绍),再加上 “ git diff ”。

11. OS X 下的 FileMerge 即 opendiff
在长长的建议列表里,有几个开发者提到了 OS X 下原生的“opendiff”工具,或者叫做“FileMerge”。

12. diffmerge
我并不知道 diffmerge 这个工具,不过在列表里也被提到了。

13. Araxis Merge (商业版)
Araxis Merge 这个名字让我想起了很久以前。那时,我在一台 Windows 机器上一堆让人抓狂的 XML 文件中垂死挣扎,而这个工具证明了它可以经受住这个挑战。它是个商业软件。

14. vimdiff3
有几个同事用 vimdiff 来解决冲突,那是 vim 自带的合并/差异分析 工具,你可以这样设置:
git config merge.tool vimdiff
git config merge.conflictstyle diff3
git config mergetool.prompt false
或者按照上面展示的那样直接修改 .gitconfig 文件。
结论
你是如何解决冲突的呢?流程是怎样?你还使用过其他除了上文中提到以外的工具吗?让我们知晓你的技能吧,通过 @durdn 联系我或者 @atlassiandev 我那很棒的团队。
解决 Git 冲突的 14 个建议和工具的更多相关文章
- eclipse解决git冲突举例
本地修改了两个文件,提交时提示有冲突,想来应该是没有从远程仓库下载最新代码导致的.通过右击项目 -> Team -> Sychronized WorkSpace,比较本地仓库和远程仓库的异 ...
- 解决git冲突
多个开发者同时操作git中的同一个文件,第一个人在commit和push的时候是可以正常提交的,而之后的开发者执行pull,就会报冲突异常conflict. 解决方案: 全部采用当前更改 之后再去gi ...
- 解决git冲突造成的Please move or remove them before you can merge
git clean -d -fx “” 其中x —–删除忽略文件已经对git来说不识别的文件d —–删除未被添加到git的路径中的文件f —–强制运行如果你确定这货已经没用了,并且git status ...
- idea 解决git冲突
1.提交本地代码到本地仓库 2.啦取远程代码 不进行merge 3.冲突文件会显示 >>> head ===== 4.删除 >>> head ===== ...
- SourceTree + Beynod Compare解决Git冲突的方法
https://www.cnblogs.com/yufeng218/p/6523422.html
- Git版本控制:Git冲突解决 相关错误总结
http://blog.csdn.net/pipisorry/article/details/46958699 冲突处理 git push冲突处理 git push时出现冲突:! [rejected] ...
- git冲突Please move or remove them before you can merge
解决Git冲突造成的Please move or remove them before you can merge git clean -d -fx ""其中x -----删除忽略 ...
- 1git命令的使用,查看git仓库状态,添加文件到git跟踪,git提交,查看git分支,查看git仓库日志信息,切换git分支,解决git分支合并后出现冲突的问题
1新建一个存储git的文件夹,命令是: toto@toto-K45VD:~$ mkdir gitfolder 2初始化一个git仓库,命令是: toto@toto-K45VD:~$cd gitfold ...
- Git冲突与解决方法【转】
本文转载自:https://www.cnblogs.com/gavincoder/p/9071959.html Git冲突与解决方法 1.git冲突的场景 情景一:多个分支代码合并到一个分支时: 情景 ...
随机推荐
- linux几种常见的文件内容查找和替换命令
作为一个以前没怎么接触过linux的小白,开始使用linux,各种不习惯,这周遇到一个文件内容测查找和替换的需求.学习了以下几种实现方式: 1.vi命令下的查找和替换 1.1 vi下的查找 /patt ...
- 邁向IT專家成功之路的三十則鐵律 鐵律十七:IT人休閒之道-清心
現代人的休閒生活可說是兩類極端的表現,一類是整天待在家裡當個超級宅男宅女,假日走最遠的路就是附近三百公尺內的泡沫紅茶店.另一類則是抱著及時享樂心態的美女與型男,整天趴趴走把辛苦賺來的錢都拿去玩樂.美食 ...
- 详解在Visual Studio中使用git版本系统(图文)
http://www.codesky.net/article/201111/123474.html 这篇教程的预期,是希望没有任何版本使用基础的新手也可以掌握,所以细节较多,不当之处,欢迎指正. 第一 ...
- Redis安装过程
Redis在windows下安装过程 学习了:https://www.cnblogs.com/M-LittleBird/p/5902850.html 学习了:http://www.runoob.com ...
- Win7安装软件,界面上中文显示乱码的解决方案
“Control panel”->"Clock,Language and Region"->"Region and Language"->第四 ...
- Vue2.0 视频教程
好像是一套vue 开发webapp 课程.来自网络. url:https://pan.baidu.com/s/1jIele9w password:b404 文章来源:刘俊涛的博客 地址:http:// ...
- Lead软件项目半年感受
Lead一个项目快半年了,整体来说是个辛苦活. 除了自己的研发进度,还要负责对上,对下,对外的交流.这里记录一些感受. 对上的交流,除了确保正确理解老大的安排.就是确保老大在和他的lead以及 ...
- 2013-06-09 12:03 如何在SQLServer中锁定某行记录
锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新 A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订 ...
- (一)MVVMLight安装
http://www.cnblogs.com/manupstairs/p/4890300.html 1.首先新建一个wpf项目 2. 安装完成即可在我们的项目中看到如下引用: 如果点击安装的时候出现: ...
- Django小项目练习
Django学生管理系统 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^class_list/', views.class_list ...