在Git中, - (破折号)意味着什么?

时间:2014-03-30 21:21:14

标签: git

在阅读Git命令的手册页时,您经常会看到一个可选的--(短划线)。根据我的经验,--不是必需的,没有任何区别。你什么时候需要它?一般来说它是什么意思,因为它出现在如此多的命令中?

2 个答案:

答案 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 67feca3commit 51b4594commit 19e8789Jeff 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