我的git仓库中有一个名为xyz的文件。巧合的是,我还有一个名为xyz的分支。目前,我在master上,但是我想结帐到xyz分支。使用的命令很简单
$ git checkout xyz
但这会将文件签出xyz
到当前的HEAD。我如何将分支改为分支xyz
?
Answers:
如commit a047faf(git 1.8.4.3+)所示,您也可以尝试:
git checkout xyz --
(注意:Git 2.21,Q1 2019会更清楚该错误消息)
这将清楚地表明该xyz
部分是分支或提交,而后面的所有内容都--
必须是路径(此处未提供路径)。有关双连字符约定,请参见此处。
如果您尝试不使用' --
',则可能会或可能不会起作用,如“为什么git checkout<remote_branchname>
不创建新的跟踪分支? ”所示:
git checkout name
确实:
- 如果是本地分支或显式远程分支,请切换到该分支。
- 如果是跟踪路径,请重置它
- 如果是远程分支,则创建一个跟踪分支并切换到该分支。
而且它的行为并不总是相同的。因此,“ --
”提供了明确的歧义。
更新2019年8月,Git 2.23+
git checkout
太混乱了,被替换为:
git switch
:git switch xyz
即使您有一个文件xyz
,含义仍然有效,git restore
:git restore xyz
即使有分支,意义仍然有效xyz
。另外,正如我在“为什么我的Git存储库为什么进入分离的HEAD状态? ”中所述,不再有意外的分离的HEAD。
尽管VonC的解决方案有效,但我永远都记不住语法,因此我通常使用技术含量较低的解决方案:
$ (cd somedir && git checkout my-branch)
或者,如果您没有任何子目录:
$ (cd .git && git -C .. checkout my-branch)
更容易记住并且有效;-)
Git 2.21(Q1 2019,4+年后)将澄清错误消息并提出建议
“ git checkout frotz
(没有我最初建议的双破折号)通过确保' frotz
'不能同时被解释为修订和路径来避免歧义。
frotz
当从遥控器的远程跟踪分支“ ”中创建本地分支“ frotz
”时,已更新此安全性以检查远程服务器中唯一的远程跟踪分支“ ” frotz
。
注意:“ dwim”(以下使用)是“按我的意思做”,当计算机系统试图预期用户打算做什么时,将自动纠正一些琐碎的错误,而不是盲目地执行用户的显式但可能不正确的输入。
见提交be4908f(二〇一八年十一月一十三日)由阮泰玉维战(pclouds
)。
(通过合并JUNIOÇ滨野- gitster
-在提交8d7f9db,2019年1月4日)
checkout
:消除dwim跟踪分支和本地文件的歧义
在提交70c9ac2中添加了checkout dwim时,仅当满足某些条件时,才将其限制为dwim,否则返回默认的checkout行为。
事实证明,回退可能会造成混淆。
转向的条件之一
git checkout frotz
至
git checkout -b frotz origin/frotz
是
frotz
必须不存在的文件。
但是当用户期望“
git checkout frotz
”创建分支“frotz
”并且碰巧有一个名为“frotz
”的文件时,git默默还原frotz
文件内容并没有帮助。
这是在Git邮件列表中报告的,甚至在其他地方也被用作“ Git不好”的示例。
我们通常尝试做正确的事情,但是当有多个“正确的事情”要做时,最好由用户决定。
检查这种情况,请用户消除歧义:
- “
git checkout -- foo
”将检出路径“ foo”
git checkout foo --
”将dwim并创建分支“ foo
” 6对于不需要dwim的用户,请使用
--no-guess
。在这种特殊情况下,它是无用的,因为“git checkout --no-guess foo --
”将失败。
但是它可以被脚本使用。
现在的手册页git checkout
包括:
--no-guess:
如果存在相同名称的远程跟踪分支,请勿尝试创建分支。
在Git 2.26(2020年第1季度)之前,“ git checkout X
”在不是X
本地分支时并没有正确失败,但是可以命名多个远程跟踪分支(即,将其命名为创建相应本地分支的起点),这已经是更正的。
请参阅Alexandr Miloslavskiy()的commit fa74180,commit 2957709(2019年12月30日)。(通过合并JUNIOÇ滨野- -在提交d0e70cd,2020年2月5日)SyntevoAlex
gitster
checkout
:不要在模糊的跟踪分支上还原文件签字人:亚历山大·米洛斯拉夫斯基
为便于理解,以下是现有的良好方案:
- 有没有文件“
foo
”,没有本地分支“foo
”和一个单一的远程分支“foo
” 2git checkout foo
将创建本地分支foo
,请参阅提交70c9ac2以上,这里讨论。
和
- 有一个文件“
foo
”,没有本地分支“foo
”和一个单一的远程分支“foo
” 2git checkout foo
会抱怨,看到提交be4908f以上
此修补程序可防止出现以下情况:
- 拥有一个文件'
foo
,没有本地分支'foo
'和多个远程分支'foo
'2.git checkout foo
将成功...还原文件内容foo
!
也就是说,添加另一个遥控器会突然显着改变行为,这充其量是令人惊讶的,最坏的情况下可能不会被用户注意到。
请参阅上面的提交be4908f,它给出了一些实际的投诉。
据我了解,修复上面的be4908f提交(在此处讨论)时,忽略了多个远程对象的情况,而回退文件的整个行为从来都不是预期的:
- 上面的commit 70c9ac2引入了意外的行为。
以前,从no-a-ref到pathspec都有回退。这是合理的备用。
之后,还有另一个从模糊远程到pathspec的回退。
我了解这是复制和粘贴的监督。
- 提交ad8d510(来自“无法使用多个遥控器进行签出”),并在此处进行了讨论,注意到了意外的行为,但选择了半文档化该文档,而不是禁止该文档,因为该补丁系列的目标集中在其他方面。
- 上面的提交be4908f
die()
在分支和文件之间存在歧义时添加。
多个跟踪分支的情况似乎被忽略了。
新的行为:如果没有本地分支和多个远程候选对象,则公正
die()
并且不要尝试还原文件是否存在(防止出现意外情况)(改善错误消息)。
在Git 2.30(Q1 2021)中,“ git checkout
” (man)学会了使用checkout.guess
配置变量并相应地启用/禁用其“ --[no-]guess
”选项。
请参阅commit 64f1f58(2020年10月7日)和ef09e7d(2020年10月6日)由Denton Liu(Denton-L
)提交。
(由Junio C gitster
Hamano合并--在commit 0e41cfa中,2020年10月27日)
checkout
:学会尊重checkout.guess
签字人:刘丹顿
的当前行为
git checkout/switch
是--guess
默认情况下当前启用的行为。
但是,某些用户可能不希望这种情况自动发生。
不用强迫用户--no-guess
每次手动指定,而是向这些命令教授checkout.guess
配置变量,该变量使用户可以选择设置默认行为。教导完成脚本以识别新的配置变量,并禁用DWIM逻辑(如果将其设置为false)。
git config
现在在其手册页中包括:
checkout.guess
为and中的
--guess
or--no-guess
选项提供默认值。请参阅 和。git checkout
git switch
git switch
git checkout
git checkout
现在在其手册页中包括:
--guess
是默认行为。使用--no-guess
禁用它。可以通过
checkout.guess
配置变量设置默认行为。
git switch
现在在其手册页中包括:
可以通过
checkout.guess
配置变量设置默认行为。
你错了。它将结帐xyz分支。
要签出文件,您需要使用command git checkout -- xyz
。如果没有相同名称的分支,Git仅允许您使用文件快捷方式。
有关git checkout --help
详细信息,请参见。
Switched to branch 'xyz'
,但是在我的情况下,没有响应。这是签出文件时的常见情况。另外,我看到的输出git branch -va
可以得出结论,没有发生任何此类更改。