如果添加或删除了以下表达式,我正在尝试使用git diff
查找某个文件类型的两个版本之间的差异:
(****)
根据K-Frame,我正在寻找参数-G
。所以我尝试了以下内容:
git diff -G '\(\*\*\*\*\)' -- *.fileEnding
不幸的是它不起作用,并且还返回了文件中的所有其他差异。我对正则表达式不是很熟悉。
编辑:我认为需要对我的问题稍微具体一点:现在我有以下情况:一个文件的更改与正则表达式匹配,更改没有。在我的脚本中,我正在尝试做这样的事情(伪代码):if((git diff -G '\(\*\*\*\*\)' -- *.fileEnding)==(git diff -- *.fileEnding)) print "Only changes in (****)";
如果某些文件只有(****)中的更改而其他文件有不同的更改,则可以正常工作。但是,如果一个文件同时存在
,它就无法正常工作答案 0 :(得分:1)
Git的git diff
就是不这样做。
该文档具有误导性。
-G
参数对git diff
绝对没有任何作用。相反,-G
实际上是git log
(及其姐妹命令git rev-list
的参数,以及调用其他命令的任何命令;但最好只用{{1}来考虑它我认为)。
git log
和git diff
命令共享他们的一些文档(足够合理 - 他们共享一些代码,特别是差异生成代码{{1}用于比较任何一个提交到其父())。
当git log
选择提交时,您可以告诉它选择一些特定的提交(在已由修订说明符进行的选择中)。 git log
参数就是一个这样的选择器,就像非常相似的git log
参数一样。默认情况下,-G
采用字符串而不是正则表达式;但您可以添加-S
以使-S
采用正则表达式。文档有一个示例,该示例直接引用--pickaxe-regex
:
-G<正则表达式>
查找补丁文本包含添加/删除行的差异 匹配< regex>。
说明
-S
和之间的区别git log
,考虑在同一个文件中使用以下差异进行提交:-S<regex> --pickaxe-regex
-G<regex>
会显示此提交,但+ return !regexec(regexp, two->ptr, 1, ®match, 0); ... - hit = !regexec(regexp, mf2.ptr, 1, ®match, 0);
不会(因为该字符串的出现次数没有变化)。
While git log -G"regexec\(regexp"
命令不是git log -S"regexec\(regexp" --pickaxe-regex
命令。
一般情况下,git diff
的工作方式是传递一个起始提交 - 例如一个哈希ID,或一个分支或标记名称 - 并且它:
依此类推,一直回到第一次提交(或者当你厌倦了寻找并退出寻呼机时)。换句话说,至少对于这些简单的情况,有一个循环:
git log
如果您添加git log
,则“显示”步骤会包含while (there is a commit $commit)
parent = resolve_hash_id($commit + "^")
show($commit)
commit = $parent
的输出。
请注意-p
比较正好两个提交(嗯,有一种特殊的差异称为组合差异用于合并提交,但是{{1默认情况下不会显示它们,git diff $parent $commit
的正常用法也不会显示。 git diff
的两个提交是父级和子级。如果您自己运行git log
,则可以选择任意两个任意提交......但是当您这样做时,git diff
会完全忽略任何git log
或git diff
个参数。 (可能应该抱怨他们的存在。)
git diff
和-G
的目的是影响-S
的正常行为。通常,当我们按照-G
的方式按顺序查看提交时,我们对特定文件的特定更改更感兴趣< / em>(或文件集)。我们可以使用-S
或git log
告诉git log
:生成差异,但是如果它没有更改,则根本不显示提交。< / em>这样我们只看到那些有这些变化的提交。 (添加文件名,例如-G
,也会将差异限制为这些文件。与-S
和git log
不同, 部分 使用git log stop..start -- path/to/file1.txt
。)
如果您不知道自己需要哪些修订,可以使用-S
(或其面向脚本的姐妹命令-G
)来筛选候选人。在这里,您可以使用git diff
。你现在不必得到差异,但如果你愿意,你也可以。如果git log
不仅可以获得可能的候选人,而且实际上可以获得正确的候选人,那么您已经完成了,您可以在这里停止。
如果您仍然有太多的候选人并需要完全差异来进一步削减它们,那么现在可以对第一步(git rev-list
或-G
获得的哈希ID运行-G
)。对于每个提交,您必须选择将其与之进行比较的提交:可能是候选列表中的某些提交,或者可能是在此特定候选项之前或之后的提交。现在您不再拥有git diff
工具:要搜索差异,您需要一些外部搜索工具,例如git log
。由你来写这部分。
答案 1 :(得分:0)
公认的答案是错误的,说-G
对git diff
不起作用。它绝对可以做到:
git diff -G '\(\*\*\*\*\)'
在数百个已更改的文件中,将仅返回带有(****)
作为其更改之一的文件。
原始张贴者(我认为)承认了这一点,但希望不要看到同一文件中的其他更改。只需说明git diff
确实有-G
,并且它可以完成困难的工作(在git 2.20.1中进行了测试)。使用-G
仅显示更改的文件,而使用grep仅显示那些文件中的所需部分,将产生很少的误报:
git diff -G '\(\*\*\*\*\)' -- *yml | grep -n1 '(\*\*\*\*)'
将仅显示文本(****)
已更改的行,以及一些上下文(足以查看其更改内容)。
另请参阅https://stackoverflow.com/a/53471974/1028376与diff一起使用-G
。