有没有办法做“git checkout”和* force *参数被解释为分支名称?

时间:2014-11-11 01:24:41

标签: git git-checkout

您输入命令" git checkout foo"。

如果有一个名为" foo"但是没有该名称的文件,它切换到分支 - 如果有一个名称的文件而没有这样的分支,它会更新文件" foo"。

但我想知道---有没有办法输入命令,以便Git无条件地解释" foo"作为一个分支的名称,不管是什么?这包括(但限制)规范,如果没有名为" foo"的分支,即使存在该名称的文件,操作也会失败。

那么 - 有没有办法做到这一点?

感谢。

3 个答案:

答案 0 :(得分:14)

是的,从参考资料中可以看出这种用法:

git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>…

在您的情况下,归结为:

git checkout foo --

此处,foo对应<tree-ish>--表示此后的任何内容都指的是文件名。因此,如果您使用上面的命令(在--之后没有文件名),如果没有名为foo的tree-ish(分支),它将失败:

fatal: invalid reference: foo

答案 1 :(得分:2)

刚刚检查了git 2.1.2的行为,checkout总是将名称解释为分支名称。您可以使用./foo强制将其强制为文件。

在您的情况下,git checkout foo将始终尝试切换到分支foo

如果要强制参数为分支,那么即使文件匹配它没有更新,也可以尝试使用git checkout -B foo foo欺骗git。如果存在foo,git会将其检出并更新分支指针。如果它没有,则不会创建新分支,因为缺少起点。

答案 2 :(得分:1)

如果分支名称首先存在,您可以添加显式检查:

git show-ref --verify --quiet refs/heads/foo && git checkout foo

这将确保分支存在,如果存在,请检查它。是的,存在竞争条件(分支可以在两者之间删除),但希望这在实践中不是问题。

Is there a better way to find out if a local git branch exists?