是否需要Git rm从repo中删除文件?

时间:2017-11-01 21:23:16

标签: git

如果我使用本地操作系统命令或在IDE中重命名或删除文件,似乎Git意识到这一点,我就能够提交删除,就好像我已经更改了文件的内容但我可能做错了。所以我的问题是,在我在本地删除文件之后,Git知道了什么,我是否必须使用IDE 执行删除执行Git rm以从Git中删除文件回购?

编辑:为了更清楚地说明实际情况:现在我已经删除了文件,在我的例子中,Eclipse(我本以为透明地处理整个git的事情)或者只是使用Windows命令行,我仍然可以使用Git rm?它似乎没有用。

4 个答案:

答案 0 :(得分:1)

所以我认为这是一个理解你的工作目录和GIT阶段之间差异的练习。

我们将您的工作目录视为您的操作系统目录。您可以使用OS命令(rm,IDE等)删除文件。 GIT知道您的工作目录。

阶段是GIT用于在最终提交之前审核更改的“缓存”。 (前 git status 屏幕)

话虽如此,执行 git rm 将从“工作目录”和“舞台”中删除该文件。

执行操作系统'rm'只会从工作目录中删除。这将要求您执行'git add'。更新您的阶段以准备最终提交。

无论哪种方式都很好,但我很好奇是否有“最佳实践”。

我希望这有帮助!

玩得开心,

-Nick

答案 1 :(得分:0)

如果Git知道某个文件,那么它会故意跟踪它的删除。简单地从Git中删除它将允许它在以后的日期复活。

如果您不希望Git知道某个文件,那么使用git rm --cached是从当前阶段删除它的合适方法。你需要将它与适当的.gitignore文件结合起来,以便Git知道永远不会再次进行它。

答案 2 :(得分:0)

好吧,如果你用rm命令删除了文件,并且你想从GIT repo中删除它。然后你必须使用git add; git commit -m“remove”。

但是如果你将使用git rm命令,那么git将删除该文件并将其添加到staging,然后下次你将激活git commit。它将从repo中删除。因此,如果使用此命令,则无需将其显式添加到暂存中。

答案 3 :(得分:0)

这里有几个有些合理的答案,但没有人谈到几个关键点。我会把它们放在第一节标记下面。

请注意,如果您想查看可能在各种提交中出现和消失的文件的历史记录(即提交时),您通常必须告诉git log文件名是文件名称,而不是其他任何内容:

git log --all --full-history -- path/to/file.java
例如

--将文件路径名与其他参数分开,因此Git知道不要尝试将path/to/file.java转换为修订说明符。 (将显示具有删除文件效果的提交,但您不一定知道为什么。将--name-status添加到git log选项以获取该信息。 )

您无法从Git存储库中删除文件(主要是)

问题是存储库没有保存文件。存储库包含提交

现在,提交保持文件是正确的,但是你也不能,大多数不能,并且通常不删除提交。提案(大部分)是永久性的,(完全)是不可改变的。这意味着如果文件存在于提交c0ffee1deadcab中,则它存在于永久这两个提交中。

该文件可能存在,也可能不存在于其他提交中。当你让Git签出提交feedb0b时,文件x.java会存在吗? (稍微过于简单的简单)答案是:它会在feedb0b中,而不是在git rm中。

git add的作用部分是从Git的索引中删除文件,该文件也称为临时区域。当您进行 next 提交时,无论何时,只要它获得了任何大的难看的哈希ID,那么索引现在中的任何文件都将是那个下次提交。

如果您从工作树中删除了一个文件,这是您工作的地方,那么您的索引并未受到影响。 Git将此索引放在您的工作树和提交之间,以便它可以惹恼您。 :-)嗯,这不是真正的原因,但这是最初的影响:索引充当了烦恼。这就是为什么你必须不断运行git add x.javax.java将文件git rm --cached x.java从工作树中复制到索引中,以便它可以在下次提交。

一旦复制到索引中,文件就会保留在索引中,直到某些内容被删除。使用x.java会将git rm x.java从索引中删除。使用--cached,即没有git add x.java,会将其从索引中删除,将其从工作树中删除。如果它已经从你的工作树中消失了,那么两个命令都会做同样的事情(仅从索引中删除)。

奇怪的是,如果您已将其从工作树中删除,.gitignore也会将其从您的索引中删除!这对于“添加”来说是一个奇怪的含义。请注意,在现代Git中,“添加所有文件”将以这种方式“添加”删除的文件(在2.x之前的Git中默认不执行此操作)。

只要文件在您的索引中,它也将在您下一次提交中。

关于未跟踪文件的一些注意事项

只要索引中的任何特定文件,它就会成为未跟踪的文件。实际上,这是“未跟踪文件”的定义:未跟踪文件是索引中没有的任何文件。

每当你有未跟踪的文件时,Git都会对你抱怨。它不断提醒你:嘿,这个文件没有跟踪,那个,还有这五个!您可以通过在git rm <file>文件中列出这些未跟踪的文件来告诉Git停止抱怨。这有两件事:

  • 它关闭了投诉;和
  • 如果您使用“添加所有文件”操作,它会使Git 添加这些文件。

如果已经存在 只有当文件当前未跟踪时,文件的忽略条目才有意义。

由于索引随着时间的推移而发生,执行{{1}}并提交会使文件无法跟踪,但只要您检出其中包含该文件的旧提交之一,文件返回到索引和工作树。该文件现在再次跟踪。因此,“跟踪”或“未跟踪”始终是文件是否在您的索引现在中的问题。这不是你可以永远回答的事情。

这也是您无法从存储库中删除文件的部分原因。您可以从下一个提交中删除它,并且从该提交中工作的任何人都不会拥有该文件。但是,任何使用某些其他提交的人都可能拥有该文件。

(你可以删除提交,但这很棘手。)