问题描述
我修改了一个文件(在 Ruby 中,碰巧,但我的问题实际上是关于 Git)通过将一个方法向上移动文件。这是一个伪差异:
class A
# some stuff
+ def b
+ end
+
private
def a
end
-
- def b
- end
end
然而,git 坚持将这种变化定义为:
class A
# some stuff
- private
-
- def a
- end
-
def b
end
+
+ private
+
+ def a
+ end
end
即。它认为 private
关键字和方法 a
已下移。
这在描述文件如何更改方面同样正确,但它几乎也没有传达更改的意图。甚至可能有点令人困惑:更改的结果是使方法 b
成为公共方法,但这种差异使它看起来好像更改了方法 a
。
我认为 Git 选择了这个差异是因为方法 a
比方法 b
略短,所以这最终会产生一个略小的差异。但是,为了使我的提交易于理解,最好让差异看起来更像这里的第一个示例,以明确相关更改是针对方法 b
。
我的问题是:是否有任何方法可以手动编辑 Git 在我进行此更改时选择的大块内容,以便我可以创建一个提交,其 diff 看起来像第一个示例而不是第二个示例?
解决方法
我的问题是:是否有任何方法可以手动编辑 Git 在我进行此更改时选择的大块内容,以便我可以创建一个提交,其 diff 看起来像第一个示例而不是第二个示例?
没有;提交不存储差异,它们存储文件在当前时间点的快照。所以你不能“创建一个提交”,它的差异看起来像某种方式;相反,差异是在您查看时立即创建的。
这意味着每个 git 客户端在查看您的提交时都需要了解如何根据您的喜好显示差异。没有这样的机制来告诉 git 客户端你希望它如何被看到。
提交的查看者可以使用多种选项来指示他们希望如何看到更改,但是没有机制可以你可以用来告诉他们你希望他们如何看到变化。
,看看git diff --help
。有很多选项可以指定 git 将使用哪种差异算法。
--diff-algorithm={patience|minimal|histogram|myers}
Choose a diff algorithm. The variants are as follows:
default,myers
The basic greedy diff algorithm. Currently,this is the default.
minimal
Spend extra time to make sure the smallest possible diff is produced.
patience
Use "patience diff" algorithm when generating patches.
histogram
This algorithm extends the patience algorithm to "support low-occurrence common elements".
我不知道它们之间有什么区别,但我会开始寻找。