首页 > 解决方案 > 修改了多个文件,只推送了几个文件

问题描述

我有几个问题,如下所述。请建议。场景 1:在目录 1 中,我有 File1、File2、File3。我已经修改了所有三个文件。但我只想将 File1 和 File3 推送到 Git Repo。并保留 Files2 中的更改,但不推送到 Git Repo。我怎样才能做到这一点 ?问候 RG

标签: gitpush

解决方案


Git 不推送文件。Git 推送提交。提交确实包含文件,但您要么得到整个提交,要么没有。

每个提交都代表所有文件的完整快照。但是 Git 不会根据您的工作树中的内容进行新的提交。您的工作树(或工作树)是您可以处理文件的区域,因此得名。这些文件在计算机上具有日常形式。

但是,在使用 Git 时,始终存在每个文件的三个活动副本1。第一个副本是您现在正在使用的提交中的副本。第一个副本无法更改,就像任何现有提交都无法更改一样。第三个副本是您的工作树中的副本,您可以处理/使用它:它可以更改。在这种情况下,有趣的是在当前提交和工作树之间的中间那个。可以使用 替换此中间副本git add

这个中间副本(再次参见脚注 1)位于 Git 所称的不同地方,即indexstaging area或(这些天很少)cache。它开始匹配提交。当您git checkout进行某些特定的提交时,Git:

  • 将提交中的所有文件复制到索引中(再次参见脚注 1),并且
  • 将索引中的所有文件复制到您的工作树中,以便您可以查看和使用它们。

当您在工作树中进行更改时,索引中的副本不会发生任何变化。最终,您必须git add在更新的工作树文件上运行。此命令将工作树文件复制回索引中。

对索引的一个很好(但不完整)的简短描述是它包含您提议的 next commit。使用git add将文件从工作树复制到索引中会更新您提议的下一次提交。

当您运行时git commit,Git 会为您当时索引中的所有文件拍摄一个新快照。这包括在签出提交时复制索引中的所有未更改的内容,以及您使用.git add

新的快照,由你当时和那里的索引中的内容组成——即,从你提议的提交中——现在成为你当前的提交。现在,您当前的提交和您的索引再次像往常一样匹配。

您更改但未更改的工作树中的任何文件在您的工作树中git add保持不变。

您现在可以git push提交新的提交。如果您将git pushing 到的另一个 Git 接受它们,则该 Git 现在具有新的提交。这些新提交具有您制作的快照。没有任何人可以更改这些快照中的任何内容——无论是您、您的 Git 还是其他任何人。每个提交都由其哈希 ID 唯一标识。当您(或任何人)进行该提交时创建的该哈希 ID 将永远保留给提交,而不是其他。但是现在另一个 Git有了这些提交,通过他们的哈希 ID,其他 Git 的任何用户都可以git checkout通过其哈希 ID 或他们可能选择用于这些哈希 ID 的任何名称来提交其中一个:分支名称、标签名称等。

请注意,git status工作方式是运行两个比较:

  • 首先,它将当前(或HEAD)提交中所有文件的副本与索引中的副本进行比较。无论哪里都是一样的,git status什么都不说。但是,无论哪里有不同git statusstaged for commit

  • 然后,git status将索引中所有文件的所有副本与工作树中的所有副本进行比较。无论哪里都是一样的,git status什么都不说。但是,无论哪里有不同git statusnot staged for commit

因此,即使您无法直接看到索引,也可以使用git status. 每当git status安静时,索引匹配。每当git status嘈杂时,某些文件的索引副本或多个副本与已提交和/或工作树副本或多个副本不同。


1从技术上讲,索引包含对每个文件的内部 Git blob 对象的引用,而不是每个文件的文字副本。如果需要,在文件上运行将创建一个新的 blob,然后将适当的引用放入索引中,而不是实际将文件物理复制到索引中。但是,除非您开始尝试and ,否则您无法分辨出其中的区别。git addgit ls-files --stagegit update-index


推荐阅读