在Git中,“-”(破折号)是什么意思?

阅读有关Git命令的手册页时,通常会看到一个可选的--(破折号)。 以我的经验,这不是必需的--945,并且没有区别。 您什么时候需要它? 考虑到它出现在这么多命令中,它通常意味着什么?

SerMetAla asked 2020-06-27T22:23:56Z
2个解决方案
45 votes

git中的双破折号git checkout <commit>对不同的命令来说意味着不同的意思,但通常它将选项与参数分开。

特别是在git中,git checkout <commit>的含义取决于您将其与哪个子命令一起使用。 它通常将子命令参数(例如git checkout中的分支名称)与修订或文件名分开。 有时它是完全可选的,仅用于防止将不寻常的文件名解释为程序选项。

例如

  • git checkout <commit>.要检出“提交”(在手册中称为“ tree-ish”,因为实际上可以指定一系列对象类型),请使用

    git checkout <commit>

    要将检出缩小为一个或两个文件,请使用git log -- filename将“ tree-ish”参数与要检出的“文件名”分开。

  • git log -- filename。要提交“索引”中的所有内容(即,通过-登台的内容),只需发出--命令。

    git log -- filename [-m消息]

    要忽略通过git log -- filename添加的任何内容,并在特定文件中提交更改,请使用-

  • git log -- filename.要提交名称以---开头的文件,必须告诉git add停止读取参数,并开始读取文件名; --做到了。

    git log -- filename

  • git log -- filename.要查看提交历史记录,仅限于影响文件使用的提交

    git log -- filename

如果需要了解它的特定含义,则需要检查手册页以查找所使用的任何git命令。

Dave answered 2020-06-27T22:25:14Z
1 votes

这个问题要求对所有git命令中的双破折号有一个概念上的理解。

双破折号表示选项已结束,对于Git来说,它已经被认为“不够”。

使用Git 2.24(2019年第三季度),命令行解析器了解了“ --”表示法:

脚本编写者首先在命令行上对选项集进行硬编码,然后强制命令将最终用户输入视为非选项的标准约定是使用“ --”作为分隔符,但这不适用于命令 使用“ PARSE_OPT_KEEP_DASHDASH”作为转速和路径规格之间的分隔符。

请参阅Jeff King(--)的commit 67feca3,commit 51b4594,commit 19e8789(2019年8月6日)。
(由Junio C Hamano合并----在4a12f89次提交中,2019年9月9日)

--:允许PARSE_OPT_KEEP_DASHDASH结束选项解析

当前没有一种可靠的方法来告诉Git某个特定选项是一个修订,而不是一个选项。
因此,如果您有分支“ --”,则不能只说:

--

你可以说:

--

但是,如果您不知道refname,尤其是如果您是从其他地方传递值的脚本,那将失败。
在大多数程序中,可以使用“ --”结束选项解析,如下所示:

--

但这对修订分析器不起作用,因为“ --”在那里已经很有意义:它将修订与路径规范分开。
因此,我们需要一些其他标记来将选项与修订分开。

此修补程序引入了“ --”,它可用于该目的:

--

不管“ $ revision”中的内容如何,它都可以工作(好吧,如果您说“ --”,它可能会失败,但是它不会做任何危险的事情,例如触发意外的选项)。

名字很冗长,但这可能是一件好事。 它应用于可读性比简洁性重要的脚本调用。

一种选择是引入显式选项来标记修订,例如:

--

这比该提交提供的信息要多得多(因为它甚至使诸如“-”之类的东西变得愚蠢)。 但是在git和其他命令中已经很好地建立了使用诸如“ --”之类的分隔符的模式,这使一些脚本编写任务更加简单:

--

parse-options:允许--作为“-”的同义词

修订选项解析器最近了解了--,但是对于所有调用者来说,这还不够。
其中一些选项(例如PARSE_OPT_KEEP_DASHDASH)使用parse_options()选择一些选项,然后将其余选项提供给setup_revisions()
对于这些情况,我们需要阻止parse_options()在看到--end-of-options时找到更多选项,并将该选项保留在argv中,以便setup_revisions()也可以看到它。

让我们像处理“ --”一样处理它。 我们甚至可以piggy带 处理PARSE_OPT_KEEP_DASHDASH,因为任何想要 保留一个会想保留另一个。

例:

git update-ref refs/heads/--source HEAD &&\
git log --end-of-options --source
VonC answered 2020-06-27T22:27:48Z
translate from https://stackoverflow.com:/questions/22750028/in-git-what-does-dash-dash-mean