Git 如何仅在本地忽略跟踪的文件
如何仅在本地忽略已在索引中的文件?我不想从索引中删除该文件,从而影响其他人。我尝试过的事情:Git 如何仅在本地忽略跟踪的文件,git,Git,如何仅在本地忽略已在索引中的文件?我不想从索引中删除该文件,从而影响其他人。我尝试过的事情: 已将文件添加到.git\info\exclude git更新索引--假定myFile.json未更改 git更新索引--跳过工作树myFile.json 当文件被修改并试图切换分支时,这两个更新索引命令都会出错 $ git checkout myBranch error: Your local changes to the following files would be overwritten b
- 已将文件添加到.git\info\exclude
- git更新索引--假定myFile.json未更改
- git更新索引--跳过工作树myFile.json
$ 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
这一错误是因为“内容安全仍然是一个优先事项”,根据。有什么想法吗?问题变成了:当您签出其他提交时,希望myFile.json
发生什么
背景
使用--skip worktree
(这里不要使用--假设unchanged
,它的意思是一种速度攻击,而不是一个绝对指令;请参阅)告诉Git不应该太关心对工作树文件的修改。但是它们是对工作树文件的修改。假设这个文件的路径是P。Git留下了与头匹配的索引版本
commit让我们假设这个是,或者在我们查看它时将是,commit ID 1234567。工作树版本会发生变化,当您执行各种Git操作时,它会“跳过工作树版本”并继续使用P的索引版本。这允许您使用P的(未更改的)索引版本修改工作树P,甚至进行新的提交(如果您愿意)
在任何情况下,您的p的工作树版本不再与您的p的索引版本匹配。正如我们所指出的,您现在正在提交1234567,即,git rev parse HEAD
生成该散列ID
现在,我们发现Git要签出另一个提交,即从提交1234567移动HEAD
到提交fedcba9或其他任何东西,Git必须替换或删除p的索引版本。它可以这样做,但正如它当前编码的那样,这也会替换或删除p的工作树版本
(切换到其他一些提交,比如说88888888-在中国,一个非常幸运的提交可能不需要触摸p的索引版本。在这种情况下,git checkout
会很高兴切换到该提交,然后再切换到1234567。但fedcba9就没那么幸运了。)
当且仅当p的索引版本与p的头版本匹配时,替换或删除p的工作树版本是“安全的”,因为这样您就可以从旧的头中,即在我们的示例中从1234567中获得p的版本。但是我们已经声明了P的工作树版本与HEAD
版本不匹配。--skip worktree
标志不会更改此操作的(un)安全性;这只是意味着其他各种操作不会抱怨工作树版本与索引版本不匹配
那么,你想让P怎么样?
此时,您肯定希望从commit1234567
移动到commitfedcba9
Commit1234567
保存p的一个版本,并且p的索引版本与之匹配。您的工作树版本的P没有
Commitfedcba9
持有不同版本的p,或者说p不应该再存在,而您的p的索引版本与此不匹配
签出fedcba9
将把fedcba9
的p版本放入索引,或从索引中删除p。这两种操作都应该替换或删除P的工作树版本,以便您可以查看fedcba9中的内容(或不在fedcba9上)。它绝对不同于1234567
中的内容
您想查看该文件的版本吗?如果是这样,请将P的当前工作树内容保存到其他位置,将P恢复到索引/头提交中的内容,然后签出fedcba9
。现在,您将在工作树中看到fedcba9
中的内容。你在别处保存的P在别处是安全的
您是否不关心该文件版本中的内容,并希望保留现在的内容?如果是这样,请将P的当前工作树内容保存到其他位置,将P恢复到索引/头提交中的内容,然后签出fedcba9
。然后用保存在别处的副本覆盖工作树中的任何内容
Git不会为您选择这两个选项中的任何一个,但您可以自己选择。你只需要决定哪一个,然后去做。问题变成了:当你签出其他提交时,你希望myFile.json
发生什么
背景
使用--skip worktree
(这里不要使用--假设unchanged
,它的意思是一种速度攻击,而不是一个绝对指令;请参阅)告诉Git不应该太关心对工作树文件的修改。但是它们是对工作树文件的修改。假设这个文件的路径是P。Git留下了与头匹配的索引版本
commit让我们假设这个是,或者在我们查看它时将是,commit ID 1234567。工作树版本会发生变化,当您执行各种Git操作时,它会“跳过工作树版本”并继续使用P的索引版本。这允许您使用P的(未更改的)索引版本修改工作树P,甚至进行新的提交(如果您愿意)
在任何情况下,您的p的工作树版本不再与您的p的索引版本匹配。正如我们所指出的,您现在正在提交1234567,即,git rev parse HEAD
生成该散列ID
现在,我们发现Git要签出另一个提交,即从提交1234567移动HEAD
到提交fedcba9或其他任何东西,Git必须替换或删除p的索引版本。它可以这样做,但正如它当前编码的那样,这也会替换或删除p的工作树版本
(切换到其他一些提交,例如888888)