“ git checkout <文件名>”和“ git checkout -‐- <文件名>”之间的区别


Answers:


214

特殊的“选项” --表示“将这之后的每个参数作为文件名进行处理,无论它是什么样。” 这不是特定于Git的,它是通用的Unix命令行约定。通常,您使用它来阐明参数是文件名而不是选项,例如

rm -f      # does nothing
rm -- -f   # deletes a file named "-f"

git checkout1--意味着后续参数不是其可选的“ treeish”参数,用于指定所需的提交。

因此,在这种情况下,始终使用是安全的--,但是当要还原的文件的名称以开头或与分支的名称相同时,则需要使用-。分支/文件消除歧义的一些示例:

git checkout README     # would normally discard uncommitted changes
                        # to the _file_ "README"

git checkout master     # would normally switch the working copy to
                        # the _branch_ "master"

git checkout -- master  # discard uncommitted changes to the _file_ "master"

和选项/文件消除歧义:

git checkout -p -- README  # interactively discard uncommitted changes
                           # to the file "README"

git checkout -- -p README  # unconditionally discard all uncommitted
                           # changes to the files "-p" and "README"

如果您有一个名称以开头的分支,我不确定您会怎么做-。也许首先不要这样做。


在此模式下为1;“结帐”还可以做其他几件事。我从来没有理解过为什么git选择实现“放弃未提交的更改”作为“ checkout”子命令的模式,而不是像大多数其他VCS那样“还原”或“重置”,我认为这可能对git本身来说更有意义。


12
git checkout <名称>检出分支<名称>。git checkout-<name>签出文件<name>的索引版本。
dunni

3
谢谢,不幸的是,git文档并没有真正解释这一点
Carlton

1
关于“ Unix约定”:实际上,--作为选项和参数之间的分隔符已得到广泛实现。它适用于使用POSIX getopt(3)处理其命令行选项的任何程序/实用程序(请参阅参考资料man 3 getopt),使用的shell脚本getopt(1)以及自行实现该功能的某些程序,但不能保证通用
arielf

哈哈!我只是简单地读了一个示例方法,回想起如何放弃工作更改,而忘记了在其他命令行程序中看到此约定,并认为这--意味着“否定更改”(la C / C ++),此后一直在思考。快炸死!
underscore_d

对于像我这样的人:不要被master的名字弄糊涂,他的意思是文件名为master而不是分支。
HarsH

7

后面的所有内容--均视为文件名(而不是程序参数)。例如,如果您使用以破折号开头的文件名,则这一点很重要。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.