GIT从存储库中删除后会自动删除本地文件吗?

时间:2017-04-05 19:31:46

标签: git

GIT从存储库中删除后会自动删除本地文件吗?在我的情况下,如下所述,看起来答案是否定的。那么诀窍是什么?它取决于文件被删除的方式吗?

我的情况;我有一个同事克隆我们的主仓库,然后他创建了一个分支,然后他删除了一个包含数百个文件的目录。然后他提交了一个pull请求,我合并到master,然后我检查了主repo的web-view,那个目录是GONE。 PERFECT。

接下来,我试图"同步"我的分支机构,我试图从Master"更新而且,STILL,该目录仍然位于我的LOCAL文件系统中。 GitHub桌面说我的分支是"同步"与主人。好吧......也许是。但为什么Git不从我的本地文件夹中删除文件?它们在存储库中不再存在!

2 个答案:

答案 0 :(得分:1)

Git不删除任何文件。您可以从给定提交中删除特定文件,但它们将保留在repo中,除非您使用git filter-branchBFG等类似工具将其完全删除

要验证您是否拥有最新版本,请使用此命令:

git log ^master origin/master

如果您未与远程

完全同步,它将显示提交
  

接下来,我试图"同步"我的分支机构,我试图从Master"更新

假设你做了一个git pull origin master,两个分支之间不应该有任何变化,所以上面的命令应该什么也不返回。

答案 1 :(得分:0)

要了解这一切是如何工作的,为什么 Git删除文件时,你必须同时掌握三个想法:

  • Git商店,在存储库中,提交

    每次提交都是工作树类型的快照;见下文。它本身就完整了。一旦你提交,它永远不会改变。它(数学上)设计为不可能改变:身份 - "真实名称" - 任何提交都是该提交内容的加密校验和。这意味着,如果您更改提交中的任何文件的任何位,或添加任何新文件或删除任何旧文件,您获得的是一个新的不同的提交,具有不同的名称。

  • Git存储库有一个工作树

    提交中的文件格式只是Git本身可以使用的。如果Git从不允许您编辑,查看和以其他方式使用您的文件,那将毫无用处。因此,每个存储库都有一个工作树,它基本上是Git将这些文件扩展为其正常形式的地方,因此计算机上的所有其他程序 - 您自己 - 都可以使用它们。

    < / LI>
  • Git存储库有索引

    工作树和提交是完全不同的,但您可以将工作树转换为提交,或提交到工作树。 Git的索引是&#34;之间的中间位置。工作树和提交。 Git在暴露这个东西时很不寻常:其他版本控制系统有时候会有喜欢 Git的索引,但大多数都会隐藏它。 Git没有。

    无论如何,索引是所有这一切的关键。

如果您正在编写新提交,那么描述和思考索引的最佳方式是您构建下一个提交。这有很多原因,有些比其他原因更好,而且很多都与速度有关(提取旧的或提交新的提交)。但是,Git提供了几个关键功能通过索引,这会强制您知道它是什么以及如何使用它。

特别是,在许多计算系统中,我们希望或需要在工作树中保留永远不会提交的文件。例如,对于编译语言,我们有源代码,然后是编译器输出文件。项目可能具有特定于站点的配置。有很多很好的理由想要将未版本化的文件与版本化文件混合在一起(在某些情况下,它们甚至可能是版本化的,但与源代码分开 - 但Git在这里并不是很有帮助。)

因此,索引是一种中间人,位于永久提交和临时但有用的东西之外的Git工作树之间。除了让您为 next 提交暂存文件之外,索引还会跟踪您从当前提交中提取的文件。 (更确切地说,它会跟踪您拥有的每个文件的版本,这是Git设法尽可能快的方式之一。)

以下是关于删除内容的答案

当你从一个提交移动到另一个提交时,你使用git checkout的某些提交而不是当前的提交,以及所谓的< em>快进多种git merge - Git将从您的工作树中删除任何文件:

  • 位于索引
  • 但是新提交的索引的错误

然后添加到您的工作树任何文件:

  • 在新提交中
  • 但您的索引
  • 中的尚未

换句话说,索引不仅可以让您构建 next 提交,还会记住您工作树中的内容。如果从(先前当前)提交badc0ffee移动到(新当前)提交faceacafe,并且您的索引表示您拥有文件{{deadc0de3的版本zorg.py 1}} badc0ffee,但新提交faceacafe zorg.py,Git将删除zorg.py

要使所有这些工作正常,您的索引必须与您在更改之前的当前提交相匹配。

花哨的GUI前端可能隐藏或试图隐藏您的索引。这通常是一个错误,因为它对正确的Git操作非常重要。

一些额外的附注

上面提到了Git为你提供的在修改文件时检查提交的保护措施(称为&#34;脏工作树&#34;或&#34;脏索引&#34;)。假设你不这样做 - 你永远不会修改一些工作树文件,然后,故意或偶然地,无法分阶段(git add)和/或提交它们 - 你的索引总是匹配您当前的提交。要更改提交,Git会更改索引中的文件;并且在此过程中,它会在工作树中更改这些文件,而那些文件。

如果您故意设置脏索引和/或工作树,Git会尝试让您更改提交。只有当新提交中存储相同版本的相同版本的相同的版本时,才会成功,并且#34;脏了&#34;。这恰好适用于,因为 Git只会更新那些在索引中错误的文件&#34;对于新提交。有关此问题的更多内容,请参阅Git - checkout another branch when there are uncommitted changes on the current branch