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


82

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

$ git checkout xyz

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

Answers:


123

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 switchgit switch xyz即使您有一个文件xyz,含义仍然有效,
  • git restoregit restore xyz即使有分支,意义仍然有效xyz

另外,正如我在“为什么我的Git存储库为什么进入分离的HEAD状态? ”中所述,不再有意外的分离的HEAD。


1
IMO更好的解决方案:stackoverflow.com/a/9537923/1096596
BobbyA

@BobbyA我已经用一个更好的答案更新了答案
VonC

5

尽管VonC的解决方案有效,但我永远都记不住语法,因此我通常使用技术含量较低的解决方案:

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

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

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

更容易记住并且有效;-)


0

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并创建分支“ foo6

对于不需要dwim的用户,请使用--no-guess。在这种特殊情况下,它是无用的,因为“ git checkout --no-guess foo --”将失败。
但是它可以被脚本使用。

现在的手册页git checkout包括:

--no-guess:

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


在Git 2.26(2020年第1季度)之前,“ git checkout X”在不是X本地分支时并没有正确失败,但是可以命名多个远程跟踪分支(即,将其命名为创建相应本地分支的起点),这已经是更正的。

请参阅Alexandr Miloslavskiy()的commit fa74180commit 2957709(2019年12月30日(通过合并JUNIOÇ滨野- -提交d0e70cd,2020年2月5日)SyntevoAlex
gitster

checkout:不要在模糊的跟踪分支上还原文件

签字人:亚历山大·米洛斯拉夫斯基

为便于理解,以下是现有的良好方案:

  1. 没有文件“ foo”,没有本地分支“ foo”和一个单一的远程分支“ foo” 2git checkout foo将创建本地分支foo,请参阅提交70c9ac2以上这里讨论

  1. 一个文件“ foo”,没有本地分支“ foo”和一个单一的远程分支“ foo” 2git checkout foo会抱怨,看到提交be4908f以上

此修补程序可防止出现以下情况:

  1. 拥有一个文件' foo没有本地分支' foo'和多个远程分支' foo'2.git checkout foo将成功...还原文件内容foo

也就是说,添加另一个遥控器会突然显着改变行为,这充其量是令人惊讶的,最坏的情况下可能不会被用户注意到。
请参阅上面的提交be4908f,它给出了一些实际的投诉。

据我了解,修复上面的be4908f提交在此处讨论)时,忽略了多个远程对象的情况,而回退文件的整个行为从来都不是预期的:

  • 上面的commit 70c9ac2引入了意外的行为。
    以前,从no-a-ref到pathspec都有回退。这是合理的备用。
    之后,还有另一个从模糊远程到pathspec的回退。
    我了解这是复制和粘贴的监督。
  • 上面的提交be4908fdie()在分支和文件之间存在歧义时添加。
    多个跟踪分支的情况似乎被忽略了。

新的行为:如果没有本地分支和多个远程候选对象,则公正die()并且不要尝试还原文件是否存在(防止出现意外情况)(改善错误消息)


在Git 2.30(Q1 2021)中,“ git checkoutman学会了使用checkout.guess配置变量并相应地启用/禁用其“ --[no-]guess”选项。

请参阅commit 64f1f58(2020年10月7日)和ef09e7d(2020年10月6日)由Denton Liu(Denton-L提交
(由Junio C gitsterHamano合并--commit 0e41cfa中,2020年10月27日)

checkout:学会尊重 checkout.guess

签字人:刘丹顿

的当前行为git checkout/switch--guess默认情况下当前启用的行为。
但是,某些用户可能不希望这种情况自动发生。
不用强迫用户--no-guess每次手动指定,而是向这些命令教授checkout.guess配置变量,该变量使用户可以选择设置默认行为。

教导完成脚本以识别新的配置变量,并禁用DWIM逻辑(如果将其设置为false)。

git config现在在其手册页中包括:

checkout.guess

为and中的--guessor--no-guess 选项提供默认值。请参阅 和。git checkoutgit switchgit switchgit checkout

git checkout现在在其手册页中包括:

--guess是默认行为。使用--no-guess禁用它。

可以通过checkout.guess配置变量设置默认行为。

git switch现在在其手册页中包括:

可以通过checkout.guess配置变量设置默认行为。


-3

你错了。它将结帐xyz分支。

要签出文件,您需要使用command git checkout -- xyz。如果没有相同名称的分支,Git仅允许您使用文件快捷方式。

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


9
我为什么要问这个问题是否会发生?我正在发生在我身上。通常在签出分支时,响应为Switched to branch 'xyz',但是在我的情况下,没有响应。这是签出文件时的常见情况。另外,我看到的输出git branch -va可以得出结论,没有发生任何此类更改。
venky 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.