Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
您能定义在git comit中文件的哪些部分应该被视为已更改吗?_Git - Fatal编程技术网

您能定义在git comit中文件的哪些部分应该被视为已更改吗?

您能定义在git comit中文件的哪些部分应该被视为已更改吗?,git,Git,假设我的git repo中有一个CSS文件,具有以下规则集: .myClass { color: red; background: #0f0; } 现在我在上面添加了另一个规则集,如: .myOtherClass { color: red; background: #000; font: "Comic Sans", Wingdings, sans-serif; } .myClass { color: red; bac

假设我的git repo中有一个CSS文件,具有以下规则集:

.myClass {
    color: red;
    background: #0f0;
}
现在我在上面添加了另一个规则集,如:

.myOtherClass {
    color: red;
    background: #000;
    font: "Comic Sans", Wingdings, sans-serif;
}

.myClass {
    color: red;
    background: #0f0;
}
当我去提交时,我希望它显示我已经在现有规则集之上添加了新的规则集。但是,git似乎认为我已经将
myClass
更改为
myOtherClass
,下面的
颜色为红色我添加了:

    background: #000;
    font: "Comic Sans", Wingdings, sans-serif;
}

.myClass {
    color: red;
这两个都是对更改的准确描述,但是说我添加了一个新的规则集更容易理解


有什么方法可以手动告诉git这就是我想要描述更改的方式吗?

首先,我要提到的是,使用您的示例和git版本2.27.0,我已经得到了您想要的匹配。不过,还有其他一些样本问题更大。对于这个答案的其余部分,我假设你有一个

您可以尝试使用Git的另一个内置diff算法。您也可以对启发式算法(as)大惊小怪,但请注意,这些算法只是在计算完差异后在差异上滑动一个窗口:它们不会改变出现的差异块集。如果这些都不起作用,那么,除了添加一个新的diff算法,或者对现有算法进行修改之外,就没有其他的事情要做了,至少在Git本身是这样。git difftool方法,它是运行其他命令的一种方法,而不是git内置的diff

同样,每个Git提交实际上只存储每个文件的完整快照。当您使用
git diff
或任何其他类似工具来比较两个提交时,git将找出两个提交中的哪些文件是“相同的文件”,但内容不同,并将它们提供给某个diff引擎。diff引擎的工作是提出一些操作集,修改左侧文件以生成右侧文件(我喜欢在这里使用左侧和右侧,而不是新旧的,因为您可以向后输入文件以获得“反向补丁”)

现有的diff引擎对代码一无所知。他们只是在对号入座。线条
颜色:红色相互匹配,行>代码> } /代码>相互匹配,空行相互匹配。

现在Git中有两个diff引擎:默认或
myers
diff和
patience
diff。这两个引擎都有一些细微的修改:
minimal
删除了插入
myers
的快捷方式,使其运行更快,和
直方图
修改
耐心
以包含
耐心
完全丢弃的行


有关patience diff的概述,请参见实际算法,该算法通过剥离“虚拟”线(如空白线和闭合支撑线)来工作,这些线匹配得太频繁。直方图修改并没有完全去除这些线条,但在决定是否匹配这些线条时,赋予它们较低的权重。从理论上讲,直方图在这些情况下应该可以很好地工作,但是Git的实现在很长一段时间内都存在一个bug。

Git不会在“更改”中进行通信。它不会“思考”你“改变”了什么。它存储整个文件。“别担心,开心点!”马特,这不完全是真的。默认情况下,每次提交都是整个树的快照。但是,
git diff
仍将计算问题中描述的diff。(在某一点上,包文件将结晶一些差异的概念,尽管我不确定这是否真的会影响到这个问题,超出了计算所需显示的效率)。@nHaskins您可以使用
git difftool
选择一个特定的语言感知工具来计算两个文件之间的差异。据我所知,没有。但是,可能会使用一个详细和描述性的提交消息?我不能用你的例子重现,但这在过去确实发生过。您是否尝试了
--缩进启发式
选项(或者
--无缩进启发式
选项)?您是否使用了
--diff算法的不同可能值?