在阅读Git命令的手册页时,您经常会看到一个可选的--
(短划线)。根据我的经验,--
不是必需的,没有任何区别。你什么时候需要它?一般来说它是什么意思,因为它出现在如此多的命令中?
答案 0 :(得分:41)
git中的双短划线 - 对于不同的命令意味着不同的东西,但通常它将选项与参数分开。
git 具体来说, - 取决于您使用的子命令。它通常将子命令参数(如git checkout中的分支名称)与修订版或文件名分开。有时它完全是可选的,仅用于防止异常文件名被解释为程序选项。
例如
git checkout。要检查“提交”(在手册中称为“tree-ish”,因为您实际上可以指定一系列对象类型),请使用
git checkout 提交
要将结帐细化为一两个文件,请使用 - 将“tree-ish”参数与您要查看的“文件名”分开。
< / LI>git commit。要提交“索引”中的任何内容(例如,您通过 git add 暂存的内容,请简单发出git commit命令。
git commit [-m message]
要忽略您通过 git add 添加的内容并在特定文件中提交更改,请使用 git commit - filename
git add。要提交以“ - ”或“ - ”开头的文件,您必须告诉git add停止读取参数,并开始阅读文件名。 ' - '就是这样。
git add - -myfile
如果您需要了解其具体含义,则需要检查您使用的任何git命令的手册页。
答案 1 :(得分:1)
这个问题要求对所有git命令中的双破折号有一个概念上的理解。
双破折号表示选项已结束,对于Git来说,这被认为“不够”。
在Git 2.24(2019年第三季度)中,命令行解析器学习了“ --end-of-options
”表示法:
脚本编写者首先在命令行上对选项集进行硬编码,然后强制命令将最终用户输入视为非选项的标准约定是使用“ --
”作为分隔符,但不适用于使用“ --
”作为revs和pathspec之间的分隔符的命令。
请参见commit 67feca3的commit 51b4594,commit 19e8789,Jeff King (peff
)(2019年8月6日)。
(由Junio C Hamano -- gitster
--在commit 4a12f89中合并,2019年9月9日)
revision
:允许--end-of-options
结束选项解析目前尚没有可靠的方法来告诉Git某个特定选项是一个修订版本,而不是一个选项。
因此,如果您有分支“refs/heads/--foo
”,则不能只说:git rev-list --foo
您可以说:
git rev-list refs/heads/--foo
但是,如果您不知道refname,尤其是如果您是从其他地方传递值的脚本,则此操作会失败。
在大多数程序中,可以使用“--
”结束选项解析,如下所示:some-prog -- "$revision"
但这不适用于版本解析器,因为“
--
”在这里已经很有意义:它将版本与路径规范分开。
因此,我们需要一些其他标记来将选项与修订分开。此补丁引入了“
--end-of-options
”,其目的是:git rev-list --oneline --end-of-options "$revision"
无论“ $ revision”中的内容如何,它都可以工作(嗯,如果您说“
--
”,它可能会失败,但是它不会做危险的事情,例如触发意外的选项)。这个名字很冗长,但这可能是一件好事。它旨在用于脚本调用,在这些脚本中,可读性比简洁性更重要。
一种选择是引入显式选项来标记修订,例如:
git rev-list --oneline --revision="$revision"
比此提交要多更多信息(因为它甚至使诸如“-”之类的东西变得愚蠢)。但是在git和其他命令中已经很好地建立了使用诸如“
--
”之类的分隔符的模式,并且使某些脚本编写任务更加简单,例如:git rev-list --end-of-options "$@"
parse-options:允许
--end-of-options
作为“-”的同义词。修订选项解析器最近了解了
--end-of-options
,但是对于所有调用者来说,这还不够。
其中的一些,例如git-log
,使用parse_options()
挑选出一些选项,然后将其余的部分喂给setup_revisions()
。
对于这些情况,我们需要阻止parse_options()
在看到--end-of-options
时找到更多选项,并将该选项保留在argv
中,以便setup_revisions()
也可以看到它。 / p>与我们处理“
--
”的方法相同。我们甚至可以piggy带PARSE_OPT_KEEP_DASHDASH
的处理,因为任何想要 保留一个会想保留另一个。
示例:
git update-ref refs/heads/--source HEAD &&\
git log --end-of-options --source