Git检出:更新路径与切换分支不兼容


467

我的问题与切换分支时出现致命Git错误有关。

我尝试使用命令获取远程分支

git checkout -b local-name origin/remote-name

但我收到此错误消息:

致命:git checkout:更新路径与切换分支不兼容。
您是否打算签出无法解析为提交的“来源/远程名称”?

如果我手动创建一个分支,然后拉出远程分支,则它的工作原理与创建新克隆并检出分支一样。

为什么在我使用的存储库上不起作用?


1
自该命令的第一个实例(触发错误消息)以来发生了什么变化?
VonC

git init git fetch git fetch git://blabla.com/dir1/Project.git

Answers:


739

我相信当您尝试签出本地git repo还不知道的远程分支时会发生这种情况。尝试:

git remote show origin

如果您要检出的远程分支位于“新的远程分支”下,而不是“已跟踪的远程分支”下,则需要先获取它们:

git remote update
git fetch

现在应该可以工作了:

git checkout -b local-name origin/remote-name

7
这为我解决了问题,而不是上面的任意答案。
Jessedc

21
该名称应为“ git fetch REPOSITORY_NAME”,以获取该存储库上的所有分支。
Mike Thomsen,2010年

1
不必要。git fetch将从所有远程存储库中获取所有分支。
Michael Grinich 2010年

4
万一别人斗争与这一切的彻底疯狂:GIT获取产地/ BRANCHNAME是作为的git获取相同的。前者只是导致“新的(下一个访存将存储在远程/原点中)”显示在通过git remote show origin可见的列中。
亚历山大·凯利特

7
如果您要为您显式添加的远程服务器执行此操作(除了origin以外的任何操作),则需要先执行操作,git remote update然后您的提取操作才会获取该远程服务器。否则,您会收到类似“ Did you intend to checkout 'upstream-repo/master' which can not be resolved as commit?将其添加到答案中”这样的消息,并节省了人们宝贵的时间来阅读仅适用于来源的相同答案。
Bruno Bronosky

150

备用语法,

git fetch origin remote_branch_name:local_branch_name

12
这对我有用。我的远程分支名称不是来源。我不知道这是否有所作为,因为我一直在喝伏特加酒。
Rimian 2012年

13
这不仅是一种替代语法,而且在git checkout -b branch_name origin / branch_name不起作用时可以使用
codercake 2012年

1
这也解决了我运行“ git checkout --track origin / remote-branch”时的问题,该问题最初与修复前的OP产生相同的错误。谢谢!
kakyo

1
在运行经过验证的答案后为我工作。
2013年

2
是的,我怀疑--depth原始克隆的限定词在这里可能有问题。我成功了,git fetch remote_branch_name:local_branch_name但所有其他建议都失败了。
John Kelleher 2015年

46

在尝试了我可以在该线程中阅读的大部分内容而没有成功之后,我偶然发现了这一点: 远程分支未出现在“ git branch -r”中

原来,我的.git / config文件不正确。经过简单的修复后,所有分支都出现了。

来自

[remote "origin"]
    url = http://stash.server.com/scm/EX/project.git
    fetch = +refs/heads/master:refs/remotes/origin/master

[remote "origin"]
    url = http://stash.server.com/scm/EX/project.git
    fetch = +refs/heads/*:refs/remotes/origin/*

绝招


4
这确实是一个奇怪的配置。它告诉git只从远程获取master分支。
Ikke

3
如果可以的话,我将投票10次!-克隆时,这似乎是新git所做的事情
mpapis 2013年

2
我有同样的问题,这使我发疯。任何人都看不到远程分支机构,请检查此!
卡洛斯·格拉纳多斯

感谢上帝的回答:)
Sacha

头脑=吹牛!谢谢!
Chiranjib

12

不确定这是否对您的问题有帮助或与您的问题完全相关,但是如果您尝试从远程存储库中仅获取和签出单个分支,则可以使用以下git命令解决问题:

url= << URL TO REPOSITORY >>
branch= << BRANCH NAME >>

git init
git remote add origin $url
git fetch origin $branch:origin/$branch
git checkout -b $branch --track origin/$branch

11

以上都不对我有用。我的情况略有不同,我的远程分支不是起源。但在另一个存储库中。

git remote add remoterepo GIT_URL.git
git fetch remoterepo
git checkout -b branchname remoterepo/branchname

提示:如果在以下输出中看不到远程分支,git branch -v -a则无法检出它。

确认在1.7.5.4上工作


arf,只是意识到VirtualStaticVoid具有相同的解决方案!
Olivier Refalo

+1代表git branch -v -a:我有一个配置错误的遥控器,fetch = +refs/heads/*:refs/remotes/master/*即使调用了该遥控器,它也会说upstream
keflavich

7

对我来说,有效的是:

git fetch

它将所有引用拉到您的计算机上,用于远程上所有分支。那我就可以

git checkout <branchname>

而且效果很好。与最高投票答案相似,但更简单。


4

我怀疑没有名为remote-name的远程分支,但是您无意中创建了一个名为origin / remote-name的本地分支。

您是否可能在某些时候输入了:

git分支的起源/远程名称

从而创建一个名为origin / remote-name的本地分支?输入以下命令:

git checkout来源/远程名称

您将看到:

切换到分支“来源/远程名称”

这意味着它实际上是一个错误命名的本地分支,或者

注意:移至不是本地分支机构的“原点/返工”
如果您想通过此结帐创建新分支,则可以这样做
(现在或以后),再次将-b与checkout命令一起使用。例:
  git checkout -b 

这意味着它确实是一个远程分支。


3

它不是很直观,但是对我来说效果很好...

  mkdir remote.git & cd remote.git & git init
  git remote add origin $REPO
  git fetch origin $BRANCH:refs/remotes/origin/$BRANCH        

然后运行git branch --track命令...

  git branch --track $BRANCH origin/$BRANCH

2

对我来说我有错别字,我的远程分支不存在

使用git branch -a到列表远程分支机构


1

可以将您的问题链接到另一个SO问题“结帐问题”吗?

即:与以下问题有关的问题:

  • 旧版本的Git
  • 一种奇怪的签出语法,应该是:git checkout -b [<new_branch>] [<start_point>][<start_point>]指的是在其处启动新分支的提交的名称,'origin/remote-name'并非如此。
    (而git branch确实支持start_point是远程分支的名称)

注意:checkout.sh脚本显示的内容是:

  if test '' != "$newbranch$force$merge"
  then
    die "git checkout: updating paths is incompatible with switching branches/forcing$hint"
  fi

就像语法git checkout -b [] [remote_branch_name]既重命名了分支又重置了新分支的新起点,这被认为是不兼容的。


问题已经解决了。git checkout -b本地名称远程/远程分支确实有效
Ikke

1
有趣的是,自该命令的第一个实例(触发错误消息)以来发生了什么变化?
VonC

1

在获取了无数次之后,仍然添加了遥控器,尽管这些斑点在池中。事实证明,无论出于何种原因都不应该给--tags选项git remote add。您可以从.git / config中手动将其删除,以使git fetch创建引用。

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.