当我们执行git diff
时,它很好地向我们展示了差异以及行号和行所在的函数:
@@ -614,10 +636,10 @@ def write_my_name(name):
.
.
- len(name),
+ len(getattr(resume, name)),
当我执行 git add
时它也存储这些函数引用吗?
还要考虑的是,我们有 git log -L<func_name>:file_name
,不确定这是如何工作的。我的猜测是对正在存储的函数的引用?
如果以上问题的答案是肯定的。是否可以撤消特定功能中的更改?我无法在 reset
中找到开关.
想考虑两种情况:未暂存的更改和已暂存的更改以供提交。
感谢您花时间阅读本文。
最佳答案
When we do a
git diff
, it very well shows us the diff along with the line numbers and the function in which the lines fall ...
是的,但这一切都是基于一个技巧。 :-)
首先,git diff
找到一个编辑序列(请参阅我对 How does git generate diff in files? 的回答中的链接)。然后它使用编辑序列来声明这就是您所做的,即使这实际上不是您所做的 - 如果应用于相同的输入,这只是一个将完成相同的事情的更改。
然后,考虑到 Git 将更改呈现为影响 M 到 N 行,Git 对数量小于或等于 M 的行进行正则表达式搜索(本质上,测试每一行,从 M 开始,移动朝向第 1 行)。 These regular expressions are built in to the Git source.您可以设置自己的,如 the gitattributes documentation 中(稍微)记录的那样。 (搜索“定义自定义 block 头”)。如果表达式与该行匹配,则文本将包含在 @@
之后。 .
When I do a
git add
is it also storing these function references?
编号:git add
只是将文件的工作树版本复制到索引中,替换索引中之前的任何版本。但请注意,git add -p
运行a Perl script 。该脚本做了一些非常不同的事情;阅读它以准确了解它的作用以及它是如何做到的。
Also to consider, we have
git log -L<func_name>:file_name
, not sure how that works.
这也使用正则表达式匹配技巧来查找文件中的函数。
Is it possible to undo changes in a particular function? I am unable to find a switch in
reset
.
目前还不是。为此,您可以修改 Perl 脚本,因为git reset -p
还调用相同的 perl 脚本。不幸的是,内置正则表达式不会导出,因此您可以读取用户的配置来检查自定义正则表达式,但否则您必须将内置正则表达式重新编码到 Perl 中脚本。
请求 Git 人员增强 userdiff 代码以使其能够作为管道命令或通过 git config --get
可能是合理的。 ,公开内置的正则表达式。当然,您还应该意识到这些正则表达式通常是真实解析器所做的近似值。 (类 C 语言由于宏替换而特别成问题 — 您必须通过适当的预处理器运行整个输入,然后才能真正找到标记。)
请注意,已安装的 Perl 脚本版本名为 git-add--interactive
并位于 git --exec-path
打印出的“git-core”目录中。由于它是一个脚本,因此很容易修改。不过,最明智的做法可能是将该脚本复制到您自己的脚本目录中的新名称,例如名为 git-my-fancier-script
,然后将其调用为 git my-fancier-script
.
关于git:撤消函数中的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54113794/