存在相同名称的文件时,Git更改分支
我的git仓库中有一个名为xyz的文件。 巧合的是,我还有一个名为xyz的分支。 目前,我在master上,但是我想结帐到xyz分支。 使用的命令很简单
$ git checkout xyz
但这会将文件xyz
签出到当前的HEAD。 如何将分支更改为分支xyz
?
如commit a047faf(git 1.8.4.3+)所示,您也可以尝试:
git checkout xyz --
(注意:Git 2.21,Q1 2019将更清楚错误消息)
可以清楚地看出--
部分是分支或提交,而--
之后的所有内容都必须是路径(此处未提供路径)。 有关双连字符约定,请参见此处。
如果您尝试不使用“ --
”,则可能会或可能不会工作,如“为什么git checkout --
为什么不创建新的跟踪分支?”所示:
--
执行以下操作:
- 如果是本地分支或显式远程分支,请切换到该分支。
- 如果是跟踪路径,请重置它
- 如果是远程分支,请创建一个跟踪分支并切换到该分支。
而且它的行为并不总是相同的。 因此,“ --
”提供了明确的歧义。
尽管VonC的解决方案有效,但我永远都记不住语法,因此我通常使用技术含量较低的解决方案:
$ (cd somedir && git checkout my-branch)
或者,如果您没有任何子目录:
$ (cd .git && git -C .. checkout my-branch)
更容易记住并且有效;-)
Git 2.21(Q1 2019,4+年后)将澄清错误消息并提出建议
“ 2982384853796296216”(我最初建议不要使用双破折号)通过确保“ frotz
”不能同时解释为修订版和路径来避免歧义。
此安全性已更新,可以在从远程的远程跟踪分支“ git checkout --no-guess foo --
”中创建本地分支“ 29823848538130360360”时,在远程服务器上同时检查其唯一的远程跟踪分支“ frotz
”。
注意:“ dwim”(在下面使用)是“按照我的意思做”,当计算机系统试图预测用户的意图时,它会自动纠正一些琐碎的错误,而不是盲目地执行用户的显式但可能不正确的输入。
参见Nguyen Thai Ngoc Duy(--no-guess:
)的commit be4908f(2018年11月13日)。
(由Junio C Hamano合并---no-guess:
-在commit 8d7f9db中,2019年1月4日)
--no-guess:
:消除歧义的dwim跟踪分支和本地文件在提交70c9ac2中添加了checkout dwim时,仅当满足某些条件时,才将其限制为dwim,否则将恢复为默认的checkout行为。
事实证明,回退可能会造成混淆。
转向的条件之一
--no-guess:
至
--no-guess:
是
--no-guess:
不能作为文件存在。但是,当用户期望“
--no-guess:
”创建分支“git checkout --no-guess foo --
”并且碰巧有一个名为“frotz
”的文件时,git默默地还原“--no-guess:
”文件内容是没有帮助的。
这是在Git邮件列表中报告的,甚至在其他地方也被用作“ Git不好”的示例。我们通常尝试做正确的事情,但是当有多个“正确的事情”要做时,最好由用户决定。
检查这种情况,请用户消除歧义:
- “
--no-guess:
”将检出路径“ foo”- “
--no-guess:
”将dwim并创建分支“git checkout --no-guess foo --
” 6对于不希望使用dwim的用户,请使用
--no-guess:
。 特殊情况是因为“git checkout --no-guess foo --
”将失败。
但是它可以被脚本使用。
--no-guess:
的手册页现在包括:
--no-guess:
如果存在相同名称的远程跟踪分支,请勿尝试创建分支。
你错了。 它将结帐xyz分支。
要签出文件,您需要使用命令git checkout --help
。如果没有相同名称的分支,Git仅允许您使用文件的快捷方式。
有关详细信息,请参见git checkout --help
。