git difftool --tool=vimdiff --no-prompt HEAD~1 HEAD
git将打开vim,在左侧和右侧带有两个临时文件。有没有办法强制打开右侧的repo文件,以便我可以直接对其进行修改?
答案 0 :(得分:1)
否:因为您选择了两个特定的 commits ,所以没有要更改的文件。
这似乎有点奇怪。实际上, 有点奇怪,直到您意识到关于提交的事情:提交确实包含文件,而 1 包含的文件却被冻结了。它们都无法更改。它们是 committed ,并且任何提交的内容都与提交本身一样永久, 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 内容。此答案的其余部分未提及索引,但索引包含每个文件的 1/3 副本。内部提交的文件位于特殊的只读Git中-only格式。工作树中的文件采用有用的格式,因此您可以直接读取或编辑它们。 index 中的文件位于HEAD
之间的中间区域在冻结的地方提交,在正常的工作树上提交:索引副本未冻结,但仍然是仅Git且已压缩。Git从索引副本提交 new 提交。您必须一直保持运行git add
。)
1 从技术上讲,一次提交并没有包含这些文件,而是引用这些文件。这些文件使用一系列间接存储:提交指向 tree 对象,这些对象给出文件的名称,模式和内容的哈希ID。然后树中的哈希ID指向保存文件内容的Git blob对象。这允许两个不同的树(可能具有不同的模式或不同的文件集)重用现有的冻结文件内容,并允许不同的提交(可能具有不同的作者或时间戳记)重用现有的冻结树,从而重用现有的冻结文件提交。即使每次提交都存储每个文件的完整副本,这只是Git用来节省大量空间的几种技巧之一:在幕后,大量重复使用旧文件。 >
2 提交通常可以永久存在,但是如果每个拥有提交的人(由某个哈希ID标识)同意永远停止使用该提交并将其取出在历史列表中,Git最终会忘记真正的提交。如果任何人不同意,他们可以轻松地重新引入该提交,实际上,这是默认设置。因此,一旦将提交分散到其他Git存储库中,就很难永久删除它们,因为要永久删除它们,您必须将它们从每一个 Git存储库中删除。 / p>