我的git repo中有一个名为xyz的文件,碰巧我也有一个名为xyz的分支,现在我在master上,但是我想 checkout 到分支xyz,使用的命令很简单
$ git checkout xyz
但是这会把xyz checkout 到现在的HEAD,我该怎么把我的分支改成xyz呢?
xyz
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剂量:
--
<remote_branchname>
git checkout name
而且它的行为并不总是相同的,因此使用“--”可以提供一个清晰的歧义消除。2019年8月更新,Git 2.23+git checkout is too confusing并替换为:
git checkout
*git switch:意味着即使你有一个xyz文件git switch xyz也能工作,*git restore:这意味着即使您有分支xyz,git restore xyz也将工作。
git switch
git switch xyz
git restore
git restore xyz
另外,正如我在“Why did my Git repo enter a detached HEAD state?“中解释的那样,没有更多意想不到的分离头部。
6tdlim6h2#
虽然VonC的解决方案有效,但我总是记不住语法,所以我通常使用技术含量较低的解决方案:
$ (cd somedir && git checkout my-branch)
或者,如果没有任何子目录:
$ (cd .git && git -C .. checkout my-branch)
它更容易记忆,也更有效;-)
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日)
git checkout frotz
frotz
pclouds
gitster
checkout
当在commit 70c9ac2中添加 checkout dwim时,当满足某些条件时,它仅限于dwim,否则返回默认 checkout 行为。事实证明,后退可能会让人困惑。转变的条件之一
到
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
git checkout foo --
foo
对于不需要dwim的用户,可以使用--no-guess,在这种情况下它是无用的,因为"git checkout --no-guess foo --"将失败。但是它可以被脚本使用。git checkout的手册页现在包括:
--no-guess
git checkout --no-guess foo --
--no-guess:
如果存在同名的远程跟踪分支,请不要尝试创建分支。在Git 2.26(Q1 2020)之前,当X不是本地分支,但可以命名多个远程跟踪分支(即被dwimmed为创建相应本地分支的起始点)时,"git checkout X"没有正确地失败,这一问题已经得到纠正。参见commit fa74180、commit 2957709(2019年12月30日)和Alexandr Miloslavskiy ( SyntevoAlex )。(由Junio C Hamano -- gitster --合并至commit d0e70cd,2020年2月5日)
X
git checkout X
SyntevoAlex
签署人: Alexandria ·米洛斯拉夫斯基为了便于理解,以下是现有的良好场景:1.* 没有 * 文件"foo",* 没有 * 本地分支"foo"和 * 单个 * 远程分支"foo"
git checkout foo
之前,有从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.guess
--[no-]guess
Denton-L
签署人:刘敦git checkout/switch的当前行为是--guess当前默认启用。然而,一些用户可能不希望这自动发生。与其强迫用户每次手动指定--no-guess,不如教这些命令使用checkout.guess配置变量,让用户可以选择设置默认行为。指导完成脚本识别新的配置变量,并在DWIM逻辑设置为false时禁用它。git config现在在其手册页中包括:
git checkout/switch
--guess
git config
为git checkout和git switch中的--guess或--no-guess选项提供默认值。请参见git switch和git checkout。git checkout现在在其手册页中包括:--guess是默认行为。请使用--no-guess禁用它。默认行为可通过checkout.guess配置变量设置。git switch现在在其手册页中包括:默认行为可通过checkout.guess配置变量设置。
7kjnsjlb4#
你错了。它将在xyz分支结账。要 checkout 一个文件,你需要使用命令git checkout -- xyz。如果没有同名的分支,Git只允许你使用文件的快捷方式。有关详细信息,请参见git checkout --help。
git checkout -- xyz
git checkout --help
4条答案
按热度按时间bjg7j2ky1#
如commit a047faf(git1.8.4.3+)所示,你也可以尝试:
(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
:这意味着即使您有分支xyz
,git restore xyz
也将工作。另外,正如我在“Why did my Git repo enter a detached HEAD state?“中解释的那样,没有更多意想不到的分离头部。
6tdlim6h2#
虽然VonC的解决方案有效,但我总是记不住语法,所以我通常使用技术含量较低的解决方案:
或者,如果没有任何子目录:
它更容易记忆,也更有效;-)
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 行为。
事实证明,后退可能会让人困惑。
转变的条件之一
到
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
的手册页现在包括:如果存在同名的远程跟踪分支,请不要尝试创建分支。
在Git 2.26(Q1 2020)之前,当
X
不是本地分支,但可以命名多个远程跟踪分支(即被dwimmed为创建相应本地分支的起始点)时,"git checkout X
"没有正确地失败,这一问题已经得到纠正。参见commit fa74180、commit 2957709(2019年12月30日)和Alexandr Miloslavskiy (
SyntevoAlex
)。(由Junio C Hamano --
gitster
--合并至commit d0e70cd,2020年2月5日)checkout
:不还原不明确跟踪分支上的文件签署人: Alexandria ·米洛斯拉夫斯基
为了便于理解,以下是现有的良好场景:
1.* 没有 * 文件"
foo
",* 没有 * 本地分支"foo
"和 * 单个 * 远程分支"foo
"git checkout foo
将创建本地分支foo
,请参见commit 70c9ac2 above、discussed here。以及
1.有 * 一个 * 文件"
foo
",* 没有 * 本地分支"foo
",有 * 一个 * 远程分支"foo
"git checkout foo
将出现问题,请参见commit be4908f above此修补程序可防止出现以下情况:
1.有 * 一个 * 文件"
foo
",* 没有 * 本地分支"foo
",* 有多个 * 远程分支"foo
"git checkout foo
将成功...还原文件foo
的内容!也就是说,添加另一个遥控器会突然显著改变行为,这充其量是一个惊喜,最坏的情况下可能会被用户忽视。
请参见commit be4908f above,它给出了一些现实世界中的抱怨。
据我所知,commit be4908f above(discussed here)中的修复忽略了多个远程的情况,并且回退到恢复文件的整个行为从来都不是故意的:
之前,有从not-a-ref到pathspec的回退,这是合理的回退。
之后,还有另一个从ambiguous-remote到pathspec的回退。
我知道这是一个复制和粘贴疏忽。
die()
。多个跟踪分支的情况似乎被忽略了。
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 checkout
和git switch
中的--guess
或--no-guess
选项提供默认值。请参见git switch
和git checkout
。git checkout
现在在其手册页中包括:--guess
是默认行为。请使用--no-guess
禁用它。默认行为可通过
checkout.guess
配置变量设置。git switch
现在在其手册页中包括:默认行为可通过
checkout.guess
配置变量设置。7kjnsjlb4#
你错了。它将在xyz分支结账。
要 checkout 一个文件,你需要使用命令
git checkout -- xyz
。如果没有同名的分支,Git只允许你使用文件的快捷方式。有关详细信息,请参见
git checkout --help
。