如何使用glob放弃对多个文件的未分级更改?
EG。放弃folder1
或匹配filename*
中所有文件的更改。
答案 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
。例如,如果您有filename1
和filenameX
,则运行 shell :
git checkout -- filename1 filenameX
和 Git 永远不会看到全局字符*
。
在这些shell中,您可以改为运行:
git checkout -- 'filename*'
此处的引号保护*
不受shell的影响,因此将文字字符串filename*
传递给Git。此时 Git 将展开filename*
,并使用一组不同的规则:它匹配索引中的实际内容。
这大多没有任何区别。但是假设filename*
与filename.py
和filename.pyc
匹配,当以.pyc
结尾的所有文件名都被忽略时。 shell 将在工作树中找到这两个文件并将两个名称都传递给Git,Git会抱怨索引中不存在filename.pyc
,因此Git无法执行{{ 1}}就可以了。
如果您将git checkout
传递给 Git ,它会在索引中查找,匹配*
,看不到任何filename.py
,只检查filename.pyc
,没有错误投诉。
请记住,在Git中,每个文件都有三个版本一直处于活动状态:
filename.py
是HEAD: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用户交谈。)