当我们进行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
中找不到开关。
想同时考虑两种情况:未分阶段进行的更改和为提交而分阶段进行的更改。
感谢您抽出宝贵的时间阅读此书。
答案 0 :(得分:2)
当我们执行
git diff
时,它很好地向我们显示了diff以及行号以及行所在的函数...
是的,但这全都基于技巧。 :-)
首先,git diff
找到一个编辑序列(请参阅我对How does git generate diff in files?的回答中的链接)。然后,它使用编辑序列声明这是您所做的,即使实际上不是您所做的,也就是如果应用于相同的输入,它只会完成相同的事情。 / p>
然后,考虑到Git的变化是从M到N的影响行,Git会通过数量小于或等于M的行进行正则表达式搜索(实质上是测试每行,从M开始,移动朝向第1行)。 These regular expressions are built in to the Git source.您可以根据the gitattributes documentation中的说明(某种程度上)设置自己的名称(搜索“定义自定义的大标题”)。如果表达式与该行匹配,则文本将包含在@@
之后。
当我执行
git add
时,它还会同时存储这些函数引用吗?
否:git add
仅将文件的工作树版本复制到索引中,替换之前索引中的任何版本。但是请注意,git add -p
运行a Perl script。该脚本的功能非常不同。阅读它,以确切地了解它的作用以及作用方式。
还要考虑的是,我们有
git log -L<func_name>:file_name
,不确定如何运行。
也使用正则表达式匹配技巧在文件中查找函数。
是否可以撤消特定功能的更改?我在
reset
中找不到开关。
当前不是。为此,您可以修改Perl脚本,因为git reset -p
还会调用相同的perl脚本。不幸的是,内置正则表达式没有导出-因此您可以阅读用户的配置以检查 custom 正则表达式,但是否则,您将不得不将内置正则表达式重新编码到Perl中脚本。
要求Git人员增强userdiff代码以能够作为管道命令或通过git config --get
公开内置正则表达式可能是合理的。当然,您还应该意识到,这些正则表达式通常是实际解析器所做的近似。 (由于宏替换,类似C的语言特别成问题-您必须先通过适当的预处理程序运行整个输入,然后才能真正找到标记。)
请注意,Perl脚本的安装版本称为git-add--interactive
,位于git --exec-path
打印的“ git-core”目录中。由于它是脚本,因此很容易修改。不过,将脚本复制到您自己的脚本目录中的新名称(例如,名为git-my-fancier-script
,然后以git my-fancier-script
的形式调用)可能是最明智的选择。