什么做“git checkout \ *”和“git commit - ”完成?

问题描述:

我看到git checkout \*git commit -参考online tutorial。这些成就是什么? (这似乎不是很直观,从该名男子页。)什么做“git checkout *”和“git commit - ”完成?

+2

你最好首先考虑这个问题,然后发布它,而不是一遍又一遍地重新编写问题的主要部分。 – Zereges

如果你发出命令

git checkout * 

则执行git checkout之前,你的shell将扩大*水珠。例如,如果你有文件A.TXTb.txt,并c.txt,外壳会在运行它之前展开,以

git checkout a.txt b.txt c.txt 

。相反,当您使用\*时,*会被转义并直接传递给git checkout

从手册页:

git checkout [-p|--patch] [<tree-ish>] [--] <paths> 

当<路径>或--patch给出,GIT中结帐确实开关 分支。它更新 中索引文件或命名为< tree-ish >(通常是提交)的工作树中的命名路径。在这种情况下, -b和--track选项毫无意义,导致其中任何一个都会导致错误。在更新工作树之前,参数 可用于指定特定的树(即提交,标记或树)以更新给定路径的索引。

在这里,他正在逃避glob \*,以防止bash扩大它;所以它可以被git用来扩展索引中的内容。

EDIT(后问题更新):

git commit -, 'canonical version': 它只是一个错字(注意如何,只是旁边键)commit -m '...' .....

实际上git commit --file -会从标准输入读取它的输入,当用于管道来自其他命令的数据时;但它不是你的例子中的意图。

+0

我现在明白,在传递给git之前,传递“\ *”可以防止bash从glob扩展。但我仍然不明白git在做什么。你是什​​么意思“所以它可以被git用来扩展索引中的内容”? – George

+0

你有你的工作目录包含文件; git索引包含一个文件列表(已添加到索引的文件)。如果你做'git checkout *''bash会将'*'与当前工作目录匹配,展开命令并执行'git checkout file1 file2 file3 ...'。如果你使用'git checkout \ *',git将会收到glob,并将它与索引中的列表进行匹配,执行上面黄色框中描述的操作,所有匹配的文件(在本例中都是这些文件)。 –