Git放弃使用glob更改多个文件

时间:2018-03-10 09:45:20

标签: git

如何使用glob放弃对多个文件的未分级更改?

EG。放弃folder1或匹配filename*中所有文件的更改。

1 个答案:

答案 0 :(得分:1)

Git可以自己进行glob扩展,也可以让你的shell为Git进行glob扩展。

短语丢弃非分​​段更改表示您希望将暂存版本复制回工作树。在这种情况下,evolutionxbox's answer in a comment是正确的:

git checkout -- filename*
例如

。这告诉Git将文件从索引复制到工作树。但是,重要的是要注意,这里正在扩展filename*的人或者是什么。

全球扩张:谁扩大了它?

在像sh或bash这样的命令行shell中,扩展filename*的是 shell 。 shell查看您的工作树,查看哪些文件与模式filename*匹配,并最终使用扩展结果运行git checkout。例如,如果您有filename1filenameX,则运行 shell

git checkout -- filename1 filenameX

Git 永远不会看到全局字符*

在这些shell中,您可以改为运行:

git checkout -- 'filename*'

此处的引号保护*不受shell的影响,因此将文字字符串filename*传递给Git。此时 Git 将展开filename*,并使用一组不同的规则:它匹配索引中的实际内容。

这大多没有任何区别。但是假设filename*filename.pyfilename.pyc匹配,当以.pyc结尾的所有文件名都被忽略时 shell 将在工作树中找到这两个文件并将两个名称都传递给Git,Git会抱怨索引中不存在filename.pyc,因此Git无法执行{{ 1}}就可以了。

如果您将git checkout传递给 Git ,它会在索引中查找,匹配*看不到任何filename.py ,只检查filename.pyc,没有错误投诉。

血腥细节:三个版本以及如何复制每个版本

请记住,在Git中,每个文件都有三个版本一直处于活动状态:

  • filename.pyHEAD:README.txt的已提交版本,永久保存在当前提交的哈希ID下。
  • README.txt索引又名暂存区又名缓存:0:README.txt的另一个副本。 (这个东西有三个名字,要么是因为它非常重要 - 它是 - 或者因为最初选择的名字是没有意义的。:-))
  • README.txt只是工作树中的普通文件,您可以在其中实际查看和编辑它。

README.txt命令只是将git add的工作树版本复制到README.txt版本中,以便通过在<{1}}版本中更新来进行提交索引。

这种使用:0:README.txt的{​​{1}}使Git复制到另一个方向:工作树的索引。

如果有非分段更改,则表示工作树版本与分阶段版本不同。分阶段版本开始匹配git checkout版本。但是,如果您对文件运行-- <names>,则可以使所有三个版本不同:HEAD:版本来自当前提交,并且暂存版本为介于那个和工作树版本之间的那种。使用git add -p会将暂存版本复制到工作树。

您还可以使用HEAD:从当前提交复制到索引。这使得分阶段版本(例如git checkout -- <name>)与git reset -- <name>版本匹配。

并且,您可以使用:0:README.txt任何提交复制到索引。当你这样做时,Git坚持将索引版本复制到工作树。

摘要

HEAD:README.txt将文件工作树复制到暂存区域(又名索引,又称缓存)。

git checkout HEAD -- <name>将文件 git add提交,复制到暂存区域,而不会触及工作树。 git reset -- <path>部分非常重要。当且仅当某些HEAD看起来像-- <path>选项时,才需要--。请注意,当您提供<path>参数时,这种git reset与没有路径的git reset完全不同!

<path>索引/暂存区域复制到工作树。如果git reset看起来像git checkout -- <path>选项,如果它看起来像分支名称(如果您有一个名为{{1}的文件,那么--是必需的}?),所以总是使用它是明智的。

<path>从指定的提交中复制文件。您可以在此处使用git checkout,或任何提交哈希,分支名称或标记名称等等。这些文件此时进入 索引工作树。

请注意,当您提供master参数时,这两种git checkout <commit-specifier> -- <path>HEAD非常不同!

(Git的这种倾向,在git checkout<path>之类的动词下填充了截然不同的动作,这是一个坏主意,但我们有点坚持它。你可以使用包装器,例如,http://www.saintsjd.com/2012/01/a-better-ui-for-git/,但它很难与其他Git用户交谈。)