Git:从分支中删除不需要的未跟踪文件

时间:2018-03-29 00:51:04

标签: git merge

我从master更新了我的分支,并且有一些在master上删除的文件,但仍保留在我的本地并显示为未跟踪的文件。我想删除这些文件 - 即确认我不再希望它们在我的本地。

我已经尝试了git rm <file>但这没有做任何事情 - 当我运行git status时没有任何消息也没有变化。

我已经尝试从master(git checkout -- <file>)检出文件,但当然我收到一条消息,说主文件中不存在该文件。

我已尝试投放git clean -n,但收到了很多关于Would not remove <file>的消息。

我还尝试删除分支git branch -D <branch-name>并提取新版本,但仍然会遇到相同的合并冲突。

有人知道我能做什么吗?

2 个答案:

答案 0 :(得分:3)

TL; DR

这个问题似乎没有意义。未经跟踪的文件已经存在,因此无需删除。更准确地说,未跟踪文件是工作树中的文件,但不在索引中。因此,Git只是让它坐在那里,大多数忽略它,除了两件事:

  • Git一直抱怨未被跟踪,例如在git status输出中。
  • 使用任何意味着“添加所有内容”的选项运行git add,例如git add .,会将添加到索引,以便现在跟踪它。

要停止这两种令人烦恼的情况,人们会在.gitignore个文件中列出特定的未跟踪文件名或名称模式。请注意,.gitignore不会导致文件 未跟踪;它只是关闭了Git关于工作树的文件,并确保“添加所有”跳过该文件。

未跟踪文件是不在索引中的文件。索引是它自己独立的东西:它不是一个分支,它不是一个工作树。相反,它是您通过 staging 更新的文件构建您打算进行的 next 提交的地方。这就是它有时被称为临时区域的原因。它还具有索引和缓存工作树的效果,因此其名称为 index ,第三个名称为缓存

请注意,索引是一种生动的东西:它的内容随着时间的推移而变化,特别是在您检查特定提交时,或者去创建新的提交。但是,在任何情况下,索引都不是分支的一部分,因此“从分支中删除未跟踪的文件”没有立即意义。但我们还需要在此处列出“分支”所指的的含义:见What exactly do we mean by "branch"?

请注意,分支名称指向一个特定的提交。如果您运行git checkout name,则表示您正在查看名称​​ name 所指向的特定提交。签出提交的行为填写索引,所以现在索引包含一些文件集,现在 我们可以讨论某个文件是否存在索引,因此是或不是未跟踪。 (未跟踪这个词比跟踪更常见,但似乎很明显跟踪文件 的文件>在索引中。)

如果在git checkout name之后跟踪了一些路径 P ,则运行git rm P后跟git commit将进行提交,并更改 name ,以便识别此新提交。这个新提交将在签出时保留索引的 P out ,并在必要时将其从索引中删除。现在, name 标识了一条路径 P 未跟踪的提交。如果你的意思是上面的“分支”,那么这就是你的答案。

另一方面,如果你的意思是“分支”这个词包含名称可以访问的所有提交,或者沿着这些名称的某些东西,你就会遇到更棘手的问题。您根本无法更改任何现有提交。您可以进行一系列新提交,您认为它们比原始提示“更好”:例如,您可以进行一系列新提交,其中没有一个提交路径 P ,然后停止使用所有旧提交并开始仅使用这些新提交。这就是许多人称之为重写历史记录:更改由某些分支名称标识的提交集,以便这些新的和改进的提交与所有原始提交不同。这种历史重写的缺点是你必须让所有这些存储库的克隆用户将所有的用法切换到新的提交;否则旧的承诺会继续回来,就像某种可怕疾病的坏情况一样。

答案 1 :(得分:0)

  

我已经尝试过运行git clean -n但是我收到很多消息说不会删除。

-n表示dry-run,即实际上不删除任何内容,只显示将要执行的操作。,该消息只是告诉您这一事实。

如果要删除未跟踪的文件,则应使用命令git clean -dxf

来自git clean

的联系人页面的Quatation
  

-d

     

除了未跟踪的文件外,还删除未跟踪的目录。如果未跟踪的目录由不同的git存储库管理,则默认情况下不会删除它。如果你真的想删除这样的目录,请使用-f选项两次。

     

-f, - force

     

如果git配置变量clean.requireForce未设置为false,则除非给定-f或-n,否则git clean将拒绝运行。

     

-x

     

不要使用从.gitignore(每个目录)和$ GIT_DIR / info / exclude读取的标准忽略规则,但仍然使用-e选项给出的忽略规则。这允许删除所有未跟踪的文件,包括构建产品。这可以使用(可能与git reset一起使用)来创建一个pristine工作目录来测试一个干净的构建。