标识与上一个git提交位置相对应的当前文件/行

标识与上一个git提交位置相对应的当前文件/行,git,diff,Git,Diff,假设我在git存储库中有一个分支。分支的历史记录可能如下所示: A <- [...] <- Z A我将从git log-S开始。将该行作为-S的参数。如果该行没有更改,则应该找到它 从“git日志”手册页: -S<string> Look for differences that change the number of occurrences of the specified string (i.e. addition/deletio

假设我在git存储库中有一个分支。分支的历史记录可能如下所示:

A <- [...] <- Z

A我将从
git log-S
开始。将该行作为-S的参数。如果该行没有更改,则应该找到它

从“git日志”手册页:

   -S<string>
       Look for differences that change the number of occurrences of the
       specified string (i.e. addition/deletion) in a file. Intended for
       the scripter’s use.

       It is useful when you’re looking for an exact block of code (like a
       struct), and want to know the history of that block since it first
       came into being: use the feature iteratively to feed the
       interesting block in the preimage back into -S, and keep going
       until you get the very first version of the block.

       Binary files are searched as well.
-S
查找更改事件发生次数的差异
文件中指定的字符串(即添加/删除)。打算
编剧的使用。
当您寻找一个精确的代码块(如
结构),并想知道该块的历史,因为它第一次
产生:迭代地使用该特性为
前图像中有趣的块返回到-S,并继续
直到你得到第一个版本的块。
二进制文件也会被搜索。

我建议的最简单答案是:

检查机器的输出

git diff A Z -- src/index.js
您可以手动检查它,或使用脚本处理输出,以发现第122行是如何在
a
Z
之间移动的,并查看差异


如果上述线路的演变过于复杂,您可能需要检查:

git log A..Z -p -- src/index.js
# or :
git log A..Z --reverse -p -- src/index.js

您将看到所述文件的所有单独演变,同样,您可以计算初始行122如何演变,直到
Z

我使用
git bull
解决了我的问题,并采用了torek建议的相反方法。这适用于我的用例,因为我试图在git存储库中的文件旁边显示元数据,所以我知道我希望找到的原始位置的行集。假设
A
Z
的祖先提交,我们可以执行以下操作:

git-fns Z--api/v3/views.py

这将为文件中的每一行提供提交哈希、原始树路径和行号,例如

481daae85d6 api/v3/files/views.py   2   4) from rest_framework.response import Response
^           ^                       ^   ^
$1          $2                      $3  $4
让我们将一个位置表示为
:@
。这向我们展示了
Z:api/v3/views。py@4
最初显示为
481daae85d6:api/v3/files/views.py:2

最后一步:我们在
A
中确定的位置
p
可能不是包含该行的原始提交,这将导致错误否定。导入这些元注释时,我们可以对提交中的特定行执行另一个git任务,以确定原始提交:

git-fns-L,A--

然后我们可以将注释存储在返回的提交散列上,而不是
A


这里的开放性问题是这是否足够:即使一行稍微修改了,代码注释也可能仍然相关,而这种方法会导致这些注释“丢失”。

感谢您的回答——我对找到相应的行很感兴趣,即使它被更改了。例如,原始行可能是
let x=123
,我希望找到匹配行,即使它已更改为
const x=123
let x=456
。话虽如此,我不确定“同一条线”的定义是否清晰。我希望我们能应对一些变化!另外,当行只是在文件中移动时,这是否适用?出现的次数将保持不变。Git总是向后工作,因此如果您确定Z中的行的位置,然后让Git计算A中的行的位置,那么任务就容易多了。
Git dull
命令在内部执行此类操作。不过,我认为没有一种简单的方法可以公开计算出的行号。
git log
命令也可以使用
-L
实现这一点,但是
git log
中的算法不如
git
中的算法好。尽管如此,
git log
还是几乎满足了您的需求,只是方向不对(Z到A)。我试图解决的问题是显示代码上的注释,即使代码会随时间变化。因此,我认为,继续向后工作将是相当低的绩效;也许我可以把它藏起来。谢谢你的主意!