返回资讯中心
外部精选
软件工程
#开发者实时流

Meld 支持三方 Git 合并,作者介绍用法

来源标题:Three way Git merging with meld

Meld 其实支持三方 Git 合并,只是官网和内置帮助都没提。该功能在传统 LOCAL/REMOTE 之外加入 BASE 作为合并基准,作者因此从 vim 转向用 Meld 处理 Git 合并。文章最初发布于 2012 年,2015 年及 2025 年 9 月 15 日均有更新。

Hacker News 最新zahrevsky2026/11/6 · 今天12 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

2012年9月17日 | 2025年9月15日更新 本文是《Three-way git merging and meld》的更新版本,2015年又更新过一次(感谢Eric Drechsel)。 虽然我是个vim爱好者,但涉及到git合并时,我会用一款出色的工具Meld,而不是vim。它是一个用Python写的GTK应用,展示diff的能力非常强。我尤其喜欢Meld展示同一行内改动的方式(会高亮行内的差异部分),还有带语法高亮的可编辑文本面板,以及用箭头图标可视化合并冲突的功能。 我之前一直没把Meld当作三方合并工具,直到Tomek Bury指出Meld支持三方合并。这个功能在主页上没有宣传,甚至程序本身(帮助命令行输出页面)里也没提。后面再细说。 三方合并的基本思路是把第三个合并来源引入进来,所以除了传统的LOCAL和REMOTE(或者你习惯叫MINE和THEIRS)之外,还多了一个:BASE。也就是git中两个提交的共同父提交。还没看出问题在哪? 手动做三方合并需要四个面板,因为你要同时看到LOCAL、REMOTE、BASE,以及你实际要合并的那个文件。在git的场景下,就是: test.txt test.txt.LOCAL test.txt.REMOTE test.txt.BASE 典型的三方合并工具会在上方展示LOCAL、BASE和REMOTE之间的差异,同时在下方提供一个额外的文本面板。比如,vimdiff稍作调整就能实现这种四面板合并(你需要把合并缓冲区窗口移到屏幕底部)。这种方式的另一个好例子是Perforce(p4merge)。 请注意,工作流程和三面板合并工具略有不同——你通常不会去动中间那个文件(BASE),而是手动编辑底部(合并后)的文件。至少我不知道有哪个工具能让你从LOCAL、BASE或REMOTE面板可视化地合并代码块,除了vim的getdiff和putdiff功能。但那不算可视化。 如果你启动三面板合并工具(比如meld、kdiff3以及大多数其他工具),你通常看到的是LOCAL、正在合并的文件和REMOTE。你看不到的是BASE文件,也就是它在被任何一方修改之前的样子。 幸运的是Meld支持标签页,所以你还是能看到一些东西。我把git配置成在Meld中打开三个标签页。第一个看BASE和LOCAL之间的差异。第二个看BASE和REMOTE。第三个是常规的:LOCAL、合并后的文件、REMOTE。配置很简单: [merge] tool = mymeld [mergetool "mymeld"] cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $MERGED $REMOTE 这就是我所说的带标签页的传统双向合并。既然我前面提到Meld支持三方合并,那还有另一个选项。 当git冲突样式设置为“diff3”时,Meld会在展示BASE内容的行上打印“(??)”。这个模式下,LOCAL和REMOTE文件是只读的,这也很方便。因此可以把git配置成使用这种三方合并: [merge] tool = mymeld conflictstyle = diff3 [mergetool "mymeld"] cmd = meld $LOCAL $BASE $REMOTE -o $MERGED --auto-merge 注意--auto-merge选项是Meld 1.7.0加入的,它会在启动后自动合并所有不冲突的代码。 你也可以把两种方式结合起来,因为有时候并排对比会更好。我把最终的配置叫做带标签页的三方合并。 [merge] tool = mymeld conflictstyle = diff3 [mergetool "mymeld"] cmd = meld $LOCAL $BASE $REMOTE -o $MERGED --diff $BASE $LOCAL --diff $BASE $REMOTE --auto-merge 这样你仍然可以用Meld的三窗口模式,但它会读取BASE文件的行来展示历史。你还可以用标签页做并排对比。 那么第三种方式启动Meld后是什么样子。第一个标签页显示我要合并进去的那个分支(比如“master”)的改动: 第二个类似,显示我要合并进来的分支(比如“feature”分支)的改动: 第三个(默认打开的)是传统的三面板布局,我就在这里干活。 有时候我想要在正在合并的文件(中间那个文件)里看到git的原始标记,就会用略有不同的配置。我单独配了一个合并工具,需要时显式使用。在少数情况下,通过meld可视化改动、再在编辑器里手动编辑文件,可能更快。 [merge] tool = mymeld_plain conflictstyle = diff3 [mergetool "mymeld_plain"] cmd = meld --diff $LOCAL $MERGED $REMOTE --diff $BASE $LOCAL --diff $BASE $REMOTE 今天就到这里。

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →