git:撤消函数中的更改

标签 git

当我们执行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/

相关文章:

php - 将完全没有 VCS 的生产站点迁移到 Git

git - GnuTLS接收错误(-110): The TLS connection was non-properly terminated

git - 有没有办法将 SourceGear Vault 导入/导出到 Git

git - 如何在 git 日志中查询 Co-Authored-By

git - 创建预推 Hook 以进行 lint/测试

git - 为所有子文件夹设置 git 配置值

git - 如何在 Git bash 中更改 git 帐户?

git - 使用标签同步树

git - 为 Git fork 更新 go Assets 路径

git - 无法在 Git 中添加子模块