在git difftool中打开repo文件而不是tmp文件进行修改

z31licg0  于 2023-02-07  发布在  Git
关注(0)|答案(2)|浏览(144)

git difftool --tool=vimdiff --no-prompt HEAD~1 HEAD
git会打开vim,左右两边有两个临时文件,有没有办法强制打开右边的repo文件,这样我就可以直接修改了?

jm81lzqq

jm81lzqq1#

否:因为您已经选择了两个特定的 * 提交 *,所以 * 没有要更改的文件 *。
这样说似乎有点奇怪,实际上确实有点奇怪,直到你意识到关于提交的这件事:当提交包含文件时,它们所包含的文件是 * 冻结的 *。它们中的任何一个都不能被改变。它们是 * 提交的 *,并且任何提交的内容都和提交本身一样是永久的,并且完全只读。
当然,当你使用Git的时候,你有一些文件是可以修改的,如果你不这样做,你就很难使用Git了,但是这些文件不是已经提交的文件:这些是 work-tree 副本。如果您指示git difftool --tool=vimdiff使用这些文件作为操作的一端,则它已经直接打开了这些文件。要执行此操作:

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

例如,其中<options>包括您的--no-prompt,而<commit>可能又是HEAD~1
(As对于git diffgit difftool可以被告知比较两个提交,或者比较一个提交和当前工作树。没有选项可以比较一个提交和当前的 index 内容。这个答案的其余部分没有提到索引,但是索引保存了每个文件的 * 第三个 * 副本。提交中的文件位于一个特殊的,只读的,Git only格式。工作树中的文件格式很有用,所以你可以直接读取或编辑它们。index 中的文件位于HEAD提交和工作树之间,在HEAD提交中文件被冻结,在工作树中文件正常:索引副本被解冻,但仍然是Git专有的,并且是压缩的。Git从索引副本中生成 new commit,这就是为什么你必须一直运行git add
1从技术上讲,提交并不包含文件,而是引用文件。文件是通过一系列间接方式存储的:提交指向 tree 对象,该对象给予文件名、模式和内容的哈希ID;然后树中的hash ID指向保存文件内容的Git *blob对象 *。(可能具有不同的模式或不同的文件集)以重新使用现有的冻结文件内容,并且允许不同的提交(可能具有不同的作者或时间戳)来重用重用现有冻结提交的现有冻结树。这只是Git用来保存大量空间的几个技巧之一,即使每次提交都保存了每个文件的完整副本:在引擎盖之下,有大量的旧文件重用。
[2]一个提交通常会永久存在,但如果每个拥有某个提交的人(由某个哈希ID标识)都同意 * 永远停止使用该提交 * 并将其从历史列表中移除,Git最终会真正忘记该提交。如果有人不同意,他们可以很容易地再次引入该提交,事实上,这是默认设置。因此,一旦提交被传播到其他Git仓库,就很难永久删除它们,因为要永久删除它们,你必须从 * 每个 * 接收它们的Git仓库中删除它们。

pod7payv

pod7payv2#

是的。请使用此选项:

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

相关问题