Difference between "git checkout <filename>" and "git checkout -​- <filename>"

http://norbauer.com/notebooks/code/notes/git-revert-reset-a-single-file

I have found a post.

But still don't know what is the difference between

  1. git checkout <filename>

  2. git checkout -- <filename>

In what situation I should use first one and second one respectively?

63548 次浏览

特殊的“选项”--意味着“将此点之后的每个参数作为文件名处理,不管它看起来是什么样子”这不是特定于 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"

如果你有一个名字以 -开头的 树枝,我不确定你会怎么做。也许一开始就不要这么做。


在这种模式下,“ checkout”还可以做其他一些事情。我一直不理解为什么 git 选择实现“丢弃未提交的更改”作为“ checkout”子命令的一种模式,而不是像大多数其他 VCSes 那样“恢复”或“重置”,我认为“重置”在 git 自己的术语中可能更有意义。

--之后的任何内容都被视为文件名(而不是程序参数)。例如,如果文件名以破折号开头,这一点就很重要。