有没有一种方法可以执行“git checkout”,并*强制*将参数解释为分支名称?

9
你输入命令 "git checkout foo"。
如果存在名为 "foo" 的分支但没有该名称的文件,则切换到该分支 - 如果存在该名称的文件但不存在此类分支,则更新文件 "foo"。
但我想知道---是否有一种方法可以无条件地输入命令,以便Git始终将 "foo" 解释为无论如何都是分支名称的名称?这包括(但不限于)规定,如果没有名为 "foo" 的分支,则操作将失败,即使存在同名的文件。
那么 - 有任何方法可以做到这一点吗?
谢谢。

我不知道有一种明确检查分支的方法,但有一种方法可以明确地检查文件:git checkout -- master - Acey
4个回答

15

是的,根据参考资料,这里有这样的用法:

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

在你的情况下,这归结为:

git checkout foo --

这里,foo 对应于 <tree-ish>,而--表示此后的任何内容都是指文件名。因此,如果您在--之后不跟文件名使用上述命令,则会失败,如果没有名为foo的树状结构(分支)。

fatal: invalid reference: foo

1
谢谢。 :-) 我刚刚测试了你的建议,它非常好用。 :-) - Sophia_ES

2

刚刚查看了git 2.1.2的行为,发现checkout命令总是将名称解释为分支名。但是使用./foo可以强制其作为文件处理。

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

如果您想强制参数成为分支,以便即使有一个匹配的文件,也不会更新它,您可以尝试使用git checkout -B foo foo来欺骗git。 如果foo存在,git将检出并将分支指针更新为自身。 如果不存在,则不会创建新的分支,因为缺少起始点。


2
您可以先添加一个显式检查分支名称是否存在:
git show-ref --verify --quiet refs/heads/foo && git checkout foo

这将确保分支存在,如果存在,就检查它。是的,有一定的竞态条件(分支可能会被删除),但希望在实践中不是问题。

有更好的方法可以找到本地git分支是否存在吗?


非常感谢。 :-) 如果我可以选择两个最佳答案,我也会选择你的答案——因为它是一个非常接近第二好的答案。而且,竞争条件是决定胜负的关键——尽管在任何给定时间这不太可能成为问题,但是 (a) 如果我将其用作解决方案,经过的时间越长,这种罕见情况导致问题的可能性就越大;(b) 尽管这个问题很小,但其他人提供了一个完全没有这个问题的答案。因此,你的答案非常接近第二名,但仍然只能获得第二名。 - Sophia_ES
@Sophia_ES:我同意你的观点——Yawar的回答更好。 :) - John Zwinck

-1

请尝试以下命令,这对我有效。

$ git checkout <existing_branch>
$ git checkout -b <new_branch>
$ git checkout branch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接