【问题标题】:Is there a way to tell git which lines to treat as modified in the diff?有没有办法告诉 git 哪些行在差异中被视为已修改?
【发布时间】:2021-02-08 19:51:13
【问题描述】:

我已经修改了一个文件(碰巧在 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 略短,所以最终产生的差异略小。但是,为了使我的提交更易于理解,如果 diff 看起来更像这里的第一个示例,则更可取的是,以明确相关更改是对方法 b

我的问题是:有没有什么方法可以手动编辑 Git 在我进行此更改时选择的块,以便我可以创建一个提交,其差异看起来像第一个示例而不是第二个示例?

【问题讨论】:

  • 这是命令行差异的限制。在这种情况下,使用 GUI 差异工具是更好的选择。

标签: git diff git-diff


【解决方案1】:

我的问题是:有没有什么方法可以手动编辑 Git 在我进行此更改时选择的块,以便我可以创建一个提交,其差异看起来像第一个示例而不是第二个示例?

没有;提交不存储 diffs,它们存储文件在当前时间点的 snapshots。所以你不能“创建一个提交”,它的差异看起来是某种方式;相反,当您查看差异时,它会立即创建。

这意味着每个 git 客户端在查看您的提交时,都需要了解如何根据自己的喜好显示差异。没有这样的机制可以告诉 git 客户端您希望它如何被看到。

您的提交的查看器可以使用多种选项来指示他们希望如何查看更改,但没有一种机制可以可以用来告诉他们您希望他们如何看到变化。

【讨论】:

  • 谢谢你 - 我曾认为单个提交包含修改后的行(即或多或少你在git show 时看到的内容),所以这让我更清楚地了解了 Git确实有效。
【解决方案2】:

看看git diff --help。有很多选项可以指定 git 将使用哪种 diff 算法。

   --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".

我不知道它们之间的区别是什么,但我会开始看那里。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-21
    • 2016-08-13
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 2012-01-26
    相关资源
    最近更新 更多