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

sc4hvdpw  于 2023-02-28  发布在  Git
关注(0)|答案(4)|浏览(127)

我的git repo中有一个名为xyz的文件,碰巧我也有一个名为xyz的分支,现在我在master上,但是我想 checkout 到分支xyz,使用的命令很简单

$ git checkout xyz

但是这会把xyz checkout 到现在的HEAD,我该怎么把我的分支改成xyz呢?

bjg7j2ky

bjg7j2ky1#

commit a047faf(git1.8.4.3+)所示,你也可以尝试:

git checkout xyz --

(Note:error message will be clearer with Git 2.21, Q1 2019
这就清楚地表明xyz部分是一个分支或提交,而--之后的所有内容必须是一个路径(这里没有提供路径)。
如果您尝试不使用' -- ',则可能会也可能不会工作,如“Why does git checkout <remote_branchname> not create new tracking branch?“所示:
git checkout name剂量:

  • 如果是本地分支或显式远程分支,则切换到该分支。
  • 如果它是跟踪路径,请将其重置
  • 如果是远程分支,则创建跟踪分支并切换到该分支。

而且它的行为并不总是相同的,因此使用“--”可以提供一个清晰的歧义消除。
2019年8月更新,Git 2.23+
git checkout is too confusing并替换为:

*git switch:意味着即使你有一个xyz文件git switch xyz也能工作,
*git restore:这意味着即使您有分支xyzgit restore xyz也将工作。

另外,正如我在“Why did my Git repo enter a detached HEAD state?“中解释的那样,没有更多意想不到的分离头部。

6tdlim6h

6tdlim6h2#

虽然VonC的解决方案有效,但我总是记不住语法,所以我通常使用技术含量较低的解决方案:

$ (cd somedir && git checkout my-branch)

或者,如果没有任何子目录:

$ (cd .git && git -C .. checkout my-branch)

它更容易记忆,也更有效;-)

dvtswwa3

dvtswwa33#

Git 2.21(Q1 2019,4年后)将澄清错误信息并提供建议
"git checkout frotz"(without any double-dash that I suggested initially通过确保"frotz"不能同时解释为修订和路径来避免歧义
此安全性已更新,当dwimming从远程的远程跟踪分支"frotz"创建本地分支"frotz"时,还检查远程中的唯一远程跟踪分支"frotz"。
注:"dwim" (used below) is "do what I mean",当计算机系统试图预测用户的意图时,自动纠正微小错误,而不是盲目地执行用户明确但可能不正确的输入。
参见Nguyễn Thái Ngọc Duy ( pclouds )commit be4908f(2018年11月13日)。
(由Junio C Hamano -- gitster --合并至commit 8d7f9db,2019年1月4日)

checkout:消除dwim跟踪分支和本地文件的歧义

当在commit 70c9ac2中添加 checkout dwim时,当满足某些条件时,它仅限于dwim,否则返回默认 checkout 行为。
事实证明,后退可能会让人困惑。
转变的条件之一

git checkout frotz

git checkout -b frotz origin/frotz

frotz不能作为文件存在。
但是,当用户期望"git checkout frotz"创建分支"frotz",而恰好有一个名为"frotz"的文件时,git静默地恢复"frotz"文件内容是没有帮助的
这在Git mailing list中报告,甚至用作an example of "Git is bad" elsewhere
我们通常会尝试做正确的事情,但当有多个"正确的事情"要做时,最好让用户来决定。
检查该病例,要求用户消除歧义:

  • "git checkout -- foo"将 checkout 路径"foo"
  • "git checkout foo --"将缩小并创建分支"foo" 6

对于不需要dwim的用户,可以使用--no-guess,在这种情况下它是无用的,因为"git checkout --no-guess foo --"将失败。
但是它可以被脚本使用。
git checkout的手册页现在包括:

--no-guess:

如果存在同名的远程跟踪分支,请不要尝试创建分支。
在Git 2.26(Q1 2020)之前,当X不是本地分支,但可以命名多个远程跟踪分支(即被dwimmed为创建相应本地分支的起始点)时,"git checkout X"没有正确地失败,这一问题已经得到纠正。
参见commit fa74180commit 2957709(2019年12月30日)和Alexandr Miloslavskiy ( SyntevoAlex )
(由Junio C Hamano -- gitster --合并至commit d0e70cd,2020年2月5日)

checkout:不还原不明确跟踪分支上的文件

签署人: Alexandria ·米洛斯拉夫斯基
为了便于理解,以下是现有的良好场景:
1.* 没有 * 文件"foo",* 没有 * 本地分支"foo"和 * 单个 * 远程分支"foo"

  1. git checkout foo将创建本地分支foo,请参见commit 70c9ac2 abovediscussed here
    以及
    1.有 * 一个 * 文件"foo",* 没有 * 本地分支"foo",有 * 一个 * 远程分支"foo"
  2. git checkout foo将出现问题,请参见commit be4908f above
    此修补程序可防止出现以下情况:
    1.有 * 一个 * 文件"foo",* 没有 * 本地分支"foo",* 有多个 * 远程分支"foo"
  3. git checkout foo将成功...还原文件foo的内容!
    也就是说,添加另一个遥控器会突然显著改变行为,这充其量是一个惊喜,最坏的情况下可能会被用户忽视。
    请参见commit be4908f above,它给出了一些现实世界中的抱怨。
    据我所知,commit be4908f abovediscussed here)中的修复忽略了多个远程的情况,并且回退到恢复文件的整个行为从来都不是故意的:

之前,有从not-a-ref到pathspec的回退,这是合理的回退。
之后,还有另一个从ambiguous-remote到pathspec的回退。
我知道这是一个复制和粘贴疏忽。

多个跟踪分支的情况似乎被忽略了。

    • 新行为:如果没有本地分支和多个远程候选项,则只需die(),且无论文件是否存在(防止意外)都不要尝试还原(改进错误消息)**。

在Git 2.30(2021年第一季度)中,"git checkout"(man)学会了使用**checkout.guess**配置变量,并相应地启用/禁用其"--[no-]guess"选项。
参见Denton Liu ( Denton-L )commit 64f1f58(2020年10月7日)和commit ef09e7d(2020年10月6日)。
(由Junio C Hamano -- gitster --合并到commit 0e41cfa,2020年10月27日)

checkout:学会尊重checkout.guess

签署人:刘敦
git checkout/switch的当前行为是--guess当前默认启用。
然而,一些用户可能不希望这自动发生。
与其强迫用户每次手动指定--no-guess,不如教这些命令使用checkout.guess配置变量,让用户可以选择设置默认行为。
指导完成脚本识别新的配置变量,并在DWIM逻辑设置为false时禁用它。
git config现在在其手册页中包括:

checkout.guess

git checkoutgit switch中的--guess--no-guess选项提供默认值。请参见git switchgit checkout
git checkout现在在其手册页中包括:
--guess是默认行为。请使用--no-guess禁用它。
默认行为可通过checkout.guess配置变量设置。
git switch现在在其手册页中包括:
默认行为可通过checkout.guess配置变量设置。

7kjnsjlb

7kjnsjlb4#

你错了。它将在xyz分支结账。
要 checkout 一个文件,你需要使用命令git checkout -- xyz。如果没有同名的分支,Git只允许你使用文件的快捷方式。
有关详细信息,请参见git checkout --help

相关问题