Git如何查看功能的更改历史记录/删除?

时间:2017-05-17 18:13:47

标签: php git gitlab

我正在尝试找到在某个时间点删除的功能。我尝试使用git log -L :<funcname>:<file>找到已删除的函数。结果最终为fatal: -L parameter '<funcname>' starting at line 1: no match

例如,如果我正在搜索函数findMe

我输入git log -L :findMe:index.php

index.php

 <?php
 class stuff {.....}
 class otherStuff{....}
 class moreStuff{
   public function test(){...}
   public function findMe() {....}
   public function test1() {....}
 }
?>

结果fatal: -L parameter '<funcname>' starting at line 1: no match

参考git log

  

-L:&lt; funcname&gt;:&lt; file&gt;

     

如果“:<funcname>”代替<start><end>,则它是一个正则表达式,表示从匹配<funcname>的第一个funcname行的范围,直到下一个funcname行。 “:<funcname>”从上一个-L范围的末尾搜索(如果有的话),否则从文件的开头搜索。 “^:<funcname>”从文件开头搜索。

3 个答案:

答案 0 :(得分:0)

-L只能查找正在显示的文件版本中存在的内容。

(您引用的错误消息表明您将文字字符串<funcname>传递给您的命令,而不是字符串findMe。但是,如果当前不再存在findMe或指定版本的index.php-L无论如何都无法找到它。)

要查找更改字符串或正则表达式的出现次数的提交,或影响与字符串或正则表达式匹配的行,请使用{{1} }或git log -S。请注意,git log -G默认采用字符串,而-S采用正则表达式(总是)。要使-G搜索正则表达式而不是简单字符串,请添加-S。您可以将此类搜索限制为特定路径(根据需要设置多个路径名,与--pickaxe-regex匹配,必须搜索一个文件)。

因此,如果-L曾经存在findMeindex.php中不再存在,则命令:

index.php

将找到所有更改此提交的提交,因为它将从git log -S findMe --full-history -- index.php 中的一个或多个实例发送到index.php中的零个匹配项。但请注意,添加路径名index.php会启用历史记录简化。使用index.php禁用此简化,以便您可以找到删除它的所有提交,而不仅仅是某些提交(如果删除通过,有时会失败)合并)。

答案 1 :(得分:0)

git log -L仅在文件的最高级别上搜索功能名称。您可以使用该命令查看任何类或类外任何函数的历史记录,但不幸的是,它无法在类内找到函数。

最好的办法是git log -L :moreStuff:index.php,然后在输出中搜索功能日志。

答案 2 :(得分:0)

使用Git 2.30(Q1 2021)应该更容易。
以前,“ git blame -L :funcname -- pathman在定义了userdiff驱动程序的路径上不能很好地工作。

请参见commit 3af31e8commit 88894aacommit 9466e38commit 180d641commit 0cce88fcommit a4514a4commit fd5c74e,{{3} }(2020年11月1日)通过commit f9c8d8c
(由Philippe Blain (phil-blain)Junio C Hamano -- gitster --中合并,2020年11月18日)

commit 3f6dc9c:使用funcname驱动程序责怪userdiff

签名人:Philippe Blain

blame :: cmd_blame中,我们将'sb''结构blame_scoreboard'的'path'字段作为'path'自变量发送给'{ {3}}”,但尚未设置“ sb.path”;几行之后,将其设置为局部变量'path'。在第1137行。

如果我们指责一个函数名,即blame.c line-range.c::parse_range_arg,则仅在“ path”中使用此“ parse_range_arg”自变量,并且在这种情况下,它被发送到'parse_range_funcname',在这里它用于确定是否应为上述userdiff使用<path>驱动程序来匹配给定的函数名。 >

由于尚未设置'path,因此从未使用过userdiff驱动程序,因此我们使用默认的funcname regex,它通常不适用于设置为使用特定userdiff驱动程序的路径,并且因此我们要么匹配一些无关的线,要么死于

fatal: -L parameter '<funcname>' starting at line 1: no match  

git blame -L :<funcname> <path> man学会指责git blame中的funcname(“ {{1} }:log -L的语法以:pattern:file查找,2013-03-28,Git v1.8.4-rc0-man)。

在某些其他字段初始化时,通过在“ funcname”中更早地初始化“ sb.path”来启用使用特定userdiff驱动程序的路径的函数名,以便在传递给“ { {1}}”。