2010-11-10 18 views
17

我经常使用gnu-utils补丁和diff。使用Git,我经常这样做:是否有知道缩进的diff工具(补丁)?

git diff 

往往是简单的变化产生大的补丁,因为这改变了,例如,添加的if/else循环,这里的一切都向右缩进唯一的。

查看这样的修补程序可能很麻烦,因为只有逐行手动比较才能指示在缩进代码内是否有任何实质性更改。我们可能只会谈论几行代码,或者关于几十个(或更多)的嵌套代码。 (我知道:这样一个假设的大函数可以更好地分成更小的函数,但那不在重点之内)。

当代码块中的唯一更改是缩进并让开发人员知道的时候,GNU diff/patch无法知道吗?

是否有任何其他差异工具这样操作?

编辑:好,有--ignore-space-change但当时我们是在一个要么/或情况:要么我们有一个人更可读的补丁或者我们有一个完整的补丁,机器会知道如何阅读。我们难道不能在两全其美的情况下使用更加精细的diff工具吗?它可以让人们看到他们的空间变化,同时允许机器完全应用补丁?

回答

17

使用GNU diff,您可以通过-b--ignore-space-change忽略修补程序中空白量的变化。

如果您使用emacs并发送了补丁,您还可以使用M-x diff-ignore-whitespace-hunk来重新格式化该补丁以忽略特定块中的空白区域。或者diff-refine-hunk突出显示角色层次上的变化,这往往会指出变化的“肉”。

至于应用补丁,您可以使用带有GNU补丁的-l--ignore-whitespace来忽略标签和空格的变化。请注意Python代码:-)

+2

+1了解更多git diff -b> my.patch也可以工作,但这很有用,但输出如果我们能够得到问题双方的最佳结果,例如有一个带有3种类型的线的补丁文件(相应地着色):没有改变的线条,已经改变的线条( - 或+)以及仅仅缩进的线条......机器都会知道如何应用该补丁,并且人类会更好地理解它。 – augustin 2010-11-10 11:55:20

2

我不知道git diff。但是不同的工具不仅能够理解缩进,而且实际上您的目标语言中的任何布局更改都是我们的Smart Differencer

此工具以与编译器相同的方式解析代码的前后版本,并比较得到的语法树,因此它不受空白变化(除了诸如Python缩进之类的语义上重要的空白之外)的任何种类的,插入或删除的注释,甚至在常量上改变基数。

结果是通过语言结构(表达式,语句,声明,块,方法等)的程序员编辑操作(“移动,插入,删除,复制,重命名”)而不是“插入行“或”删除行“。

2

对于什么是价值,使用Git difftool与像meldxxdiff工具使得差异更具有可读性。

0

我尝试不会像其他一些更改一样提交文件范围内的缩进更改。我在之前或之后的单独提交中提交缩进更改,并提交“仅更改缩进”消息。“,以便清楚说明,以便不需要进行手动差异检查,以查看是否有其他内容发生了变化。