存在同名文件时的Git更改分支

存在同名文件时的Git更改分支,git,git-branch,git-checkout,Git,Git Branch,Git Checkout,我的git repo中有一个名为xyz的文件。巧合的是,我还有一个分支名为xyz。目前我在master上,但我想结帐到分支机构xyz。要使用的命令很简单 $ git checkout xyz 但这会将文件xyz签出到当前头部。我如何将我的分支更改为分支xyz?你错了。它将签出分支xyz 要签出文件,需要使用命令git checkout--xyz。 Git只允许在没有同名分支的情况下为文件提供快捷方式 有关详细信息,请参见git checkout--help。如(git 1.8.4.3+)所示,

我的git repo中有一个名为xyz的文件。巧合的是,我还有一个分支名为xyz。目前我在master上,但我想结帐到分支机构xyz。要使用的命令很简单

$ git checkout xyz

但这会将文件
xyz
签出到当前头部。我如何将我的分支更改为分支
xyz

你错了。它将签出分支xyz

要签出文件,需要使用命令
git checkout--xyz
。 Git只允许在没有同名分支的情况下为文件提供快捷方式

有关详细信息,请参见git checkout--help。

如(git 1.8.4.3+)所示,您还可以尝试:

git checkout xyz --
(注:附件)

这将清楚地表明
xyz
部分是一个分支或提交,而
--
之后的所有内容都必须是一个路径(此处不提供路径)。看

如果您尝试不使用“
--
”,则可能有效,也可能无效,如“”:

git签出名称
执行以下操作:

  • 如果是本地分支或显式远程分支,请切换到它
  • 如果是跟踪路径,请重置它
  • 如果是远程分支,请创建跟踪分支并切换到它
它的行为也不总是一样的。因此,“
--
”可以提供清晰的歧义消除


2019年8月更新,Git 2.23+

并替换为:

  • :意思是即使您有一个文件
    xyz
    ,git开关xyz也能工作
  • :意思是即使您有分支
    xyz
    ,git restore xyz也能工作

另外,正如我在“”中所解释的,没有更多意外的分离头。

当VonC的解决方案工作时,我永远记不起语法,因此我通常使用更低技术的解决方案:

$ (cd somedir && git checkout my-branch)
或者,如果您没有任何子目录:

$ (cd .git && git -C .. checkout my-branch)
它更容易记忆,也更有效;-)

Git 2.21(2019年第一季度,4年以上)将澄清错误信息并提出建议

git checkout frotz
”()通过确保“
frotz
”不能同时解释为修订和路径,避免了歧义

已更新此安全设置,以检查远程设备中的唯一远程跟踪分支“
frotz
”,何时从远程设备创建远程跟踪分支“
frotz
”的本地分支

注:当计算机系统试图预测用户打算做什么时,自动纠正细微错误,而不是盲目执行用户明确但可能不正确的输入

参见。
(于2019年1月4日合并)

签出
:消除dwim跟踪分支和本地文件的歧义 添加签出dwim后,当满足某些条件时,它仅限于dwim,否则返回默认签出行为

事实证明,倒退可能会令人困惑

转向的条件之一

git checkout frotz

是指
frotz
不能作为文件存在

但是,当用户期望“
git checkout frotz
”创建分支“
frotz
”并且碰巧有一个名为“
frotz
”的文件时,git的静默还原“
frotz
”文件内容没有帮助 这在中报告,甚至用作

我们通常会尝试做正确的事情,但当有多个“正确的事情”要做时,最好让用户自己决定

选中此情况,请用户消除歧义:

  • git签出--foo
    ”将签出路径“foo”
  • git checkout foo--
    ”将dwim并创建分支“
    foo
对于不需要dwim的用户,请使用
--无猜测
。这没用
特殊情况,因为“
git checkout--no guess foo--
”将失败。
但它可以被脚本使用

目前的方案包括:

如果存在同名的远程跟踪分支,请勿尝试创建分支


在Git 2.26(2020年第1季度)之前,“如果
X
不是本地分支,但可以命名多个远程跟踪分支(即,作为创建相应本地分支的起点),则未正确失败”,这一错误已被纠正

参见(2019年12月30日)作者 (于2020年2月5日合并)

:不在不明确的跟踪分支上还原文件 签字人:Alexandr Miloslavskiy

为便于理解,以下是现有的良好场景:

  • 没有文件“
    foo
    ”,没有本地分支“
    foo
    ”和单个远程分支“
    foo
  • git checkout foo
    将创建本地分支
    foo
    ,请参阅
  • 有一个文件“
    foo
    ”,没有本地分支“
    foo
    ”,还有一个远程分支“
    foo
  • git checkout foo
    将投诉,请参阅
  • 此修补程序可防止出现以下情况:

  • 有一个文件“
    foo
    ”,没有本地分支“
    foo
    ”和多个远程分支“
    foo
  • git checkout foo
    将成功。。。还原文件的内容
    foo
    也就是说,添加另一个远程设备会突然显著改变行为,这充其量只是一个惊喜,最坏的情况下用户可能不会注意到。
    请看,这给了一些现实世界的抱怨

    据我所知,fix in()忽略了多个远程设备的情况,而退回到恢复文件的整个行为从来都不是有意的:

    • 引入意外行为。
      在此之前,存在从not-a-ref到pathspec的回退。这是合理的回退。
      之后,还有另一个从远程到pathspec的回退。
      我知道这是复制粘贴
      git checkout -b frotz origin/frotz
      
      --no-guess: