如何仅在本地忽略文件,该文件已在索引上?我不想从索引中删除文件,从而影响其他人。我尝试过的事情:
当文件被修改并尝试切换分支时,两个update-index命令都会出错。
$ git checkout myBranch
error: Your local changes to the following files would be overwritten by checkout:
myFile.json
Please commit your changes or stash them before you can switch branches.
Aborting
这个错误是因为"内容安全仍然是一个优先事项"根据{{3}}。有什么想法吗?
答案 0 :(得分:2)
问题变成:当您查看其他提交时
使用myFile.json
(不要在这里使用--skip-worktree
,它意味着速度黑客而不是绝对指令;请参阅Git - Difference Between 'assume-unchanged' and 'skip-worktree')告诉Git它不应该过于关注对工作树文件的修改。但是......他们是对工作树文件的修改。让我们说这个文件的路径是 P 。 Git保留了与--assume-unchanged
提交匹配的索引版本 - 让我们说这是或者将在我们查看它时,提交ID 1234567.工作树版本发生了变化,当你做各种Git操作,它"跳过工作树版本"并继续使用 P 的索引版本。这使您可以使用 P 的(未更改的)索引版本修改工作树 P ,甚至可以根据需要进行新的提交。
在任何情况下, P 的工作树版本都不再匹配 P 的索引版本。正如我们所提到的,您现在在提交1234567上,即HEAD
生成该哈希ID。
现在,我们发现Git要检查其他提交,即将git rev-parse HEAD
从提交1234567移动到提交fedcba9或其他什么,Git必须替换或删除 P 的索引版本。它可以做到这一点,但正如它当前编码的那样,它也会替换或删除 P 的工作树版本。
(切换到某些其他其他提交,例如说8888888 - 在中国非常幸运的提交 - 可能不需要触及 P的索引版本。在这种情况下,HEAD
会很乐意将git checkout
切换到该提交,然后再转回1234567.但是fedcba9并不是那么幸运。)
它"安全"替换或删除 P 的工作树版本当且仅当 P 的索引版本与HEAD
版本匹配时 P ,从那时起,您可以从旧的HEAD
获取 P 的版本,即我们示例中的1234567。但我们已经宣布 P 的工作树版本与HEAD
版本不匹配。 HEAD
标志不会改变此操作的(非)安全性;它只是意味着各种其他操作不会抱怨工作树版本与索引版本不匹配。
此时,您确定要从提交--skip-worktree
转移到提交1234567
。
提交fedcba9
包含 P 的版本, P 的索引版本与之匹配。 P 的工作树版本没有。
提交1234567
拥有 P 的不同版本,或者说 P 应该不再存在,并且您的索引版本为 P 与此不匹配。
结帐fedcba9
会将fedcba9
的 P 版本放入索引中,或从索引中删除 P 。动作应替换或删除 P 的工作树版本,以便您可以查看(或不在){{1 }}。它绝对不同于fedcba9
中的内容。
你喜欢来查看该文件的那个版本吗?如果是这样,将 P 的当前工作树内容保存到其他位置,将 P 恢复到索引/ HEAD提交中的内容,然后查看{{1 }}。现在,您将在工作树中看到fedcba9
中的内容。您保存在其他地方 P 将在其他地方安全。
你不关心该文件版本中的内容,并希望保留现在的内容?如果是这样,将 P 的当前工作树内容保存到其他位置,将 P 恢复到索引/ HEAD提交中的内容,然后查看{{1 }}。然后使用保存的其他副本覆盖工作树中的任何内容。
Git不会为你选择其中任何一个,但你自己很容易做到。你只需要决定哪一个,然后再做。