git - 打开 repo 文件而不是 tmp 文件以在 git difftool 中修改

标签 git diff vimdiff

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

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

最佳答案

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

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

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

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

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

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


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

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

关于git - 打开 repo 文件而不是 tmp 文件以在 git difftool 中修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53311092/

相关文章:

git - 如何在 Visual Studio 2019 中执行 `git checkout`?

git - 你如何通过 pull 和 push http 来设置 cgit?

vim - 关闭待打开的 vim 窗口

linux - 相同的文本但非零差异

github - 将 GitHub 要点与其分支进行比较

vim - 将选项应用于Vim中所有打开的文件

svn - 将 vim-diff 配置为在用于 svn-diff 时显示不同的颜色

Git:如何列出从特定分支创建的所有分支?

python - 在德威,我如何提交到一个分支而不是 HEAD?

git - 从master merge 后,如何找出分支上的变化?