在 git difftool 中打开要修改的 repo 文件而不是 tmp 文件

open repo file instead of a tmp file to modify in git difftool

git difftool --tool=vimdiff --no-prompt HEAD~1 HEAD

git 将打开 vim,左右两个临时文件。有没有办法强制打开右边的repo文件,让我直接修改?

否:因为您选择了两个特定的提交,所以没有要更改的文件

这么说似乎有点奇怪。它实际上 有点奇怪,直到你意识到关于提交的事情:虽然提交确实包含文件,1 它们包含的文件是 冻结。 None 可以更改。它们是提交的,任何提交的内容都与提交本身一样永久,2并且完全只读。

当然,当您使用 Git 时,您可以 更改文件。如果没有,将很难使用 Git。但那些不是 committed 文件:那些是 work-tree 副本。如果您指示 git difftool --tool=vimdiff 使用这些文件作为操作的一侧,它已经直接打开了这些文件。为此:

git difftool --tool=vimdiff <options> <commit>

其中 <options> 包含您的 --no-prompt,而 <commit> 可能又是 HEAD~1,例如。

(与 git diff 一样,可以告诉 git difftool 比较两个提交,或将一个提交与当前工作树进行比较。没有将提交与当前比较的选项index 内容。此答案的其余部分未提及索引,但索引包含每个文件的 third 副本。提交中的文件位于一种特殊的、只读的、仅 Git 格式。工作树中的文件采用有用的格式,因此您可以直接阅读或编辑它们。index[=57 中的文件=] 位于中途区域,在冻结的 HEAD 提交和正常的工作树之间:索引副本未冻结,但仍然 Git-only 和压缩。 Git 使 new 从索引副本提交,这就是为什么你必须一直保持 运行 git add。)


1从技术上讲,提交并不包含文件,而是引用 文件。这些文件使用一系列间接存储:提交指向 tree 对象,它给出文件的名称、模式和内容的哈希 ID;然后树中的哈希 ID 指向保存文件内容的 Git blob 对象。这允许两个不同的树(可能具有不同的模式或不同的文件集)重新使用现有的冻结文件内容,并允许不同的提交(可能具有不同的作者或时间戳)重新使用现有的冻结树,重新使用现有的冻结文件提交。这只是 Git 用来保存大量 space 的几个技巧之一,即使每个提交都存储了每个文件的完整副本:在引擎盖下,有很多重新-使用旧文件。

2一个提交通常永远存在,但是如果每个有一些提交的人——由一些哈希 ID 标识——同意永远停止使用那个提交 并将其从历史列表中取出,Git 最终将真正忘记提交。如果有人不同意,他们可以很容易地重新引入提交,事实上,这是默认的。因此,一旦提交被传播到其他 Git 存储库,就很难永久删除它们,因为要永久删除它们,您必须从 every Git 拾取它们的存储库。