Git checkout双破折号的含义

Git checkout双破折号的含义,git,git-checkout,Git,Git Checkout,在这个git命令中,文件名前面的双破折号是什么意思 git checkout --ours -- path/to/file.txt git checkout --theirs -- path/to/file.txt 它们是强制性的吗?相当于 git checkout --ours path/to/file.txt git checkout --theirs path/to/file.txt 假设我的Git存储库中有一个名为path/to/file.txt的文件,我想恢复对它的更改 git c

在这个git命令中,文件名前面的双破折号是什么意思

git checkout --ours -- path/to/file.txt
git checkout --theirs -- path/to/file.txt
它们是强制性的吗?相当于

git checkout --ours path/to/file.txt
git checkout --theirs path/to/file.txt

假设我的Git存储库中有一个名为
path/to/file.txt
的文件,我想恢复对它的更改

git checkout path/to/file.txt
现在假设文件名为
master

git checkout master
哎呀!这反而改变了分支。
--
将要签出的树与要签出的文件分开

git checkout -- master
如果某个怪物在我们的存储库中添加了一个名为
-f
的文件,这也会对我们有所帮助:

git checkout -f      # wrong
git checkout -- -f   # right

这在中有记录。

双破折号“-”表示“命令行结束标志”,即它告诉前面的命令不要尝试解析命令行选项之后的内容。

注意,如果参数包含通配符(
*
),则您不需要使用“
--
”,因为Git 2.5(2015年第2季度)

帮助“
git
”命令行约定捕获键入错误路径的一种启发式方法是确保命令行后面部分中的所有非rev参数都是工作树中的文件名,但这意味着必须始终使用“
--
”消除“”的歧义,因为没有一个神智正常的人会创建一个名为星号的文件

Git2.5放松了启发式,用通配符字符串声明,用户可能想给我们一个pathspec

git checkout 'a*'
# same as
git checkout -- 'a*'
参见(2015年5月2日)作者。
(于2015年5月19日被合并)

:使用通配符时,避免使用“
--
” 当命令行中缺少“
--
”且命令可以同时使用revs和path时,如果一个参数可以同时被视为扩展SHA-1和path,则需要“
--
”或git拒绝继续。
它目前的实施方式如下:

  • (1) 如果参数为rev,则它不能存在于工作树中
  • (2) 否则,它必须存在于工作树中
  • (3) 否则,
    --
    ”是必需的
这些规则适用于文本路径,但当涉及非文本pathspec时,它几乎总是要求用户添加“
--
”,因为它失败(2)和(1)很少满足(以“
*.c
”为例,如果有一个名为“
*.c
”的引用,则满足(1)

此修补程序通过考虑任何有效(
*
)通配符pathspec“存在于工作树中”来稍微修改规则。
规则变成:

  • (1) 如果arg是rev,则它必须存在于工作树中,或者不是有效的通配符pathspec
  • (2) 否则,它要么存在于工作树中,要么是通配符pathspec
  • (3) 否则,
    --
    ”是必需的
在新规则中,当涉及通配符pathspec时,大多数情况下都不需要“
--


在Git2.26(2020年第1季度)中,用于区分修订版和路径规范的消歧逻辑已经过调整,因此反斜杠转义的glob特殊字符在“通配符是路径规范”规则中不计算在内

参见(2020年1月25日)作者。
(由年合并,2020年2月12日)

:处理“通配符是路径规范”规则中的反斜杠 报告人:David Burström
签字人:杰夫·金

提交(
pathspec
:避免使用通配符时需要“
--
”,2015-05-02)允许:

没有双破折号

但它用来检查通配符的规则实际上会查找任何glob-special。
这太自由了,因为这意味着实际上不进行任何通配符匹配的模式,如“
a\b
”,将被视为pathspec

如果磁盘上确实有这样一个文件,那大概就是您想要的。
但如果您不这样做,结果会令人困惑:我们不会说“
没有这样的路径a\b
”,而是静静地接受它作为一个pathspec,它很可能与任何内容都不匹配(或者至少与您的意图不匹配)。
同样,查找路径“
a\*b
”根本不会扩展搜索范围;它只能找到一个条目,“
a*b

此提交将规则切换为仅在全局元字符将扩展搜索时触发,这意味着这两种情况现在都将报告错误(当然,您仍然可以使用“
--
”消除歧义;我们只是收紧DWIM启发式)

()

请注意,我们根本没有在中测试原始功能。
因此,此修补程序不仅测试这些转角情况,还为现有行为添加了回归测试


这是一个shell表达式。请参阅@iltempo:Git与之略有不同。对于Git,它将树与路径分开,以防树和路径看起来相同。@Dietrich_Epp。我懂了。感谢您的澄清。其中还记录了一个副本,但这个副本至少可以通过查询“git double dash”进行谷歌搜索。这适用于许多bash命令,而不仅仅是git命令,是吗?@NHDaly:是的,是的。然而,术语注释:“Bash”只有几个命令(可能是20个左右),大多数命令都是与Bash分开的程序。实际上,它是POSIX标准的一部分,
--
可用于将选项与其他参数分开,因此您将在诸如
cp
mv
之类的命令上看到它(它们不是Bash的一部分)。你知道为什么在
checkout
命令文档中没有正确描述此语法吗?@DietrichEpp在一些地方,它被列为
checkout
命令的一个可能参数,但文档中没有解释它的用途或使用原因……这就是我最终来到这里的原因。@DietrichEpp Correct,但是在谈到堆栈溢出之前,阅读了语法(和示例),我仍然不明白为什么会或不想使用
--
。作为一个非linux背景的人,这并不明显。对我来说,这似乎是一个语法spe
git rev-parse '*.c'