Git:无法检出分支-错误:pathspec'…'与git已知的任何文件都不匹配


704

我不确定为什么我无法检出我以前处理过的分支。请参阅以下命令(注意:co是的别名checkout):

ramon@ramon-desktop:~/source/unstilted$ git branch -a
* develop
  feature/datts_right
  feature/user_controlled_menu
  feature/user_controlled_site_layouts
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/develop
  remotes/origin/feature/datts_right
  remotes/origin/master
ramon@ramon-desktop:~/source/unstilted$ git co feature/user_controlled_site_layouts 
error: pathspec 'feature/user_controlled_site_layouts' did not match any file(s) known to git.

我不确定这是什么意思,而且在Google上找不到我能理解的任何内容。

我如何结帐该分支,我该怎么做才能打破这一分支?

更新

我找到了这篇文章,跑步git show-ref给了我:

97e2cb33914e763ff92bbe38531d3fd02408da46 refs/heads/develop
c438c439c66da3f2356d2449505c073549b221c1 refs/heads/feature/datts_right
11a90dae8897ceed318700b9af3019f4b4dceb1e refs/heads/feature/user_controlled_menu
c889b37a5ee690986935c9c74b71999e2cf3c6d7 refs/heads/master
c889b37a5ee690986935c9c74b71999e2cf3c6d7 refs/remotes/origin/HEAD
e7c17eb40610505eea4e6687e4572191216ad4c6 refs/remotes/origin/develop
c438c439c66da3f2356d2449505c073549b221c1 refs/remotes/origin/feature/datts_right
c889b37a5ee690986935c9c74b71999e2cf3c6d7 refs/remotes/origin/master
23768aa5425cbf29d10ff24274adad42d90d15cc refs/stash
e572cf91e95da03f04a5e51820f58a7306ce01de refs/tags/menu_shows_published_only
429ebaa895d9d41d835a34da72676caa75902e3d refs/tags/slow_dev

.git目录上的UPDATEuser_controlled_site_layouts位于中refs/heads/feature folder):

$ ls .git/refs/heads/feature/
datts_right  user_controlled_menu  user_controlled_site_layouts
$ cat .git/refs/heads/feature/user_controlled_site_layouts
3af84fcf1508c44013844dcd0998a14e61455034

更新于 git show 3af84fcf1508c44013844dcd0998a14e61455034

$ git show 3af84fcf1508c44013844dcd0998a14e61455034
commit 3af84fcf1508c44013844dcd0998a14e61455034
Author: Ramon Tayag <xxx@xxxxx.xxx>
Date:   Thu May 12 19:00:03 2011 +0800

    Removed site layouts migration

diff --git a/db/schema.rb b/db/schema.rb
index 1218fc8..2040b9f 100755
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
 #
 # It's strongly recommended to check this file into your version control system.

-ActiveRecord::Schema.define(:version => 20110511012647) do
+ActiveRecord::Schema.define(:version => 20110503040056) do

   create_table "attachments", :force => true do |t|
     t.string   "name"
@@ -205,15 +205,6 @@ ActiveRecord::Schema.define(:version => 20110511012647) do
     t.integer  "old_id"
   end

-  create_table "site_layouts", :force => true do |t|
-    t.string   "name"
-    t.text     "description"
-    t.text     "content"
-    t.integer  "site_id"
-    t.datetime "created_at"
-    t.datetime "updated_at"
-  end
-
   create_table "site_styles", :force => true do |t|
     t.text     "published"
     t.datetime "created_at"


如果您这样做,是否可行git checkout refs/heads/user_controlled_site_layouts
马克·朗伊尔

2
马克-不,仍然会出现相同的错误。
拉蒙·塔亚格

1
看到您的更新后,我不确定您是如何在其中显示分支的,而在中git branch -a却没有git show-ref。该文件.git/refs/heads/feature/user_controlled_site_layout实际存在吗?如果是这样,有什么用cat .git/refs/heads/feature/user_controlled_site_layout
马克·朗伊尔

1
我遇到了同样的错误,我从另一个存储库创建了分支,然后尝试将该分支签出到另一个存储库。所以我因为不同的仓库而得到了它。
库山Gunasekera

Answers:


947

尝试git fetch使您的本地存储库从github获取所有新信息。它仅接收有关新分支的信息,而无需实际代码。之后,git checkout应该可以正常工作。


18
为了进一步澄清,git fetch当你需要你的本地库与远程库同步,但你是有用的想要的修改合并到你的工作文件夹。
马克·拉卡塔

138
如果克隆具有多个远程服务器,git checkout Branch则无法使用。对于多个远程,仅“分支”名称是含糊的,并且需要指定远程/分支。该命令git checkout -b branch remote/branch在这种情况下有效。
Umair Ishaq

1
我设法以某种方式创建了本地“ master”,因此尽管“ git fetch”使我离得更近,但在切换到远程master(“ git checkout”)之前,我必须先删除本地master(“ git branch -d master”)。主”)。万一这对像我这样愚蠢的人有帮助!
杰米·布朗

1
@ Aleks,这不是公认的答案,因为它与OP的问题无关。他无法再签出先前在本地签出(即创建)的分支。仅仅因为其他人遇到了其他更基本的问题,并且对此答案提出了质疑(这对于拥有两天以上工作经验的git用户来说是微不足道的,并且众所周知)并不意味着OP应该接受它。
Michael Johnston

11
git fetch可以胜任。但是它可能无法从远程获取所有分支。您需要设置获取匹配模式。git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"请参考:stackoverflow.com/questions/11623862/…–
Jichao

363

尝试签出新分支时出现此错误:

错误:pathspec“分支名称”与git已知的任何文件都不匹配。

当我尝试时git checkout origin/<BRANCH-NAME>,我得到了独立的HEAD:

(与来源/分离)

最后,我执行了以下操作来解决此问题

git remote update
git fetch 
git checkout --track origin/<BRANCH-NAME>

15
使用此“签出”命令,我会收到此消息:致命:无法更新路径并同时切换到分支'foo'。
NEOline 2015年

1
手动修改远程地址后,我无法签出新分支。“ git remote update”似乎可以解决问题。
马丁

没有“ git remote update”,它将无法正常工作。谢谢!
克里斯蒂安·茨维塔诺夫

git checkout --track origin/staging fatal: git checkout: --track and --no-track require -bgit版本
1.5.6.5

使用下一个命令而不是第三命令git checkout -b staging --track origin/staging
Ivan Borshchov '17

152

对于远程且没有本地跟踪分支的分支,我收到此错误。即使我确定我已经通过一个简单的方法签出了远程分支

git checkout feature/foo

过去,要解决此错误,我不得不

git checkout -t -b feature/foo origin/feature/foo

我也不知道我为使自己陷入那种境地做了什么。


1
不幸的是,我没有将其推送到远程git服务器。
拉蒙·塔亚格

这对我有用。它发生在FC10计算机上的git v 1.6上。
FractalSpace

26
Git通常会猜测远程分支要签出,但是当使用多个远程分支时,似乎不再能够这样做。资料来源:makandracards.com/makandra/…–
Elijah Lynn

1
做git checkout功能/ foo而不是git checkout foo对我
Alejandro Moreno 2014年

这开始发生在我身上(在一个有许多远程控制和数百个分支的存储库中,从中我已经成功地从源中检查了3年的分支),这让我感到困惑。经过检查,我发现我添加了一个新的遥控器,并在文本编辑器中使用复制/粘贴操作完成了它,而不是使用git命令,并且忘记更改fetch = +refs/heads/*:refs/remotes/origin/*行以匹配新的遥控器名称。大声笑。也许这发生在makandra身上了吗?因为修复了它之后,即使我有很多遥控器,再次签出分支都可以从原点获得它。
Michael Johnston

90

如果您使用删除了分支git branch -D yourbranchname并再次拉/克隆了您的仓库,则可能需要再次创建本地分支。

尝试:

git checkout -b yourbranchname

即使文件已更改,并且您希望将其推送到新创建的分支,此选项也始终有效。
Nerius Jok

这是一个很有帮助的评论,因为尽管我在这里与OP共享相同的问题/问题,但所提供的答案是一种简单的情况。不幸的是,在我的情况下,我以前只创建了一个本地分支,然后按照@Francisco Alvarez的说明删除了它,所以无论我在这里如何尝试其他解决方案,我都无法拉出新的远程分支。这个答案节省了我的培根。
大卫,

60

我有同样的问题,并从此链接获得了一些信息:git fetch不会获取所有分支

所以现在,我可能不确定这种情况如何发生,至少我们可以解决它:

步骤1.检查您的“ remote.origin.fetch”设置,应该像这样

$ git config --get remote.origin.fetch

+ refs / heads / private_dev_branch:refs / remotes / origin / private_dev_branch

步骤2.更改“ remote.origin.fetch”以获取所有内容

$ git config remote.origin.fetch“ + refs / heads / *:refs / remotes / origin / *”

$ git config --get remote.origin.fetch

+ refs / heads / *:refs / remotes / origin / *

然后,您可以尝试“ git pull”(也许“ git fetch origin”也可以,但是我没有尝试)来获取所有分支。


@onionjake是正确的,很抱歉,我没有检查所有详细信息中的问题。只是我在尝试“ git checkout <existed_branch>”的相同操作时得到了相同的错误消息,但实际上与创建者的问题不同-创建者可以在本地看到分支,而我却看不到。我的答案可能解决了谁没有提前获取所有分支的问题。但不是发起人问题的情况。
bearzyj

3
包括我在内的许多人都收到此错误,因为他们可以使用--branch标志克隆存储库,因此,即使在git fetch之后,他们也无法获得其他分支,也无法从远程签出任何内容。这样可以解决此问题。谢谢!
Orif Khodjaev

非常感谢你。我正在使用tensorflow的devel docker镜像,它将分支限制为特定版本。设置提取配置后,现在我可以结帐了。
Michael_Zhang

24

Git Windows用户要注意-如果没有--icase-pathspecsor或GIT_ICASE_PATHSPECS = 1 env var设置,则git pathspecs区分大小写,在这种情况下

git checkout origin/FooBranch "Some/Path/To/File.txt"

与...不同

git checkout origin/FooBranch "some/path/to/file.Txt"

1
需要注意的一件事是,从文档中尚不清楚,该--icase-pathspecs参数需要首先或至少在此之前出现-C <path>
sonyisda1 '18


19

我在切换分支机构时遇到了问题。

我在当前分支上做了一个git pull,然后尝试签出新分支,它成功了

git pull // on your old branch git checkout <new_branch>


确实有用:)
vikifor


13

我遇到了同样的问题,因为我使用过git clone --depth=1,这意味着--single-branch

做一个完整的git clone将修复它。


感谢您指出。这与我面临的问题完全相同。谢谢
Mukesh Kumar

可能不需要完整的克隆。如果分支是在最初克隆该存储库之后由其他人创建的,则会出现此错误,因为本地存储库没有有关此新分支的任何信息。只需切换到master并执行git pull。然后尝试签出新分支。
Yasin

12

在执行以下操作时得到了此信息:

  • 使用的IntelliJ IDE,连接到git
  • 创建一个新文件,并添加到git
  • 重命名新文件

当我尝试检入目录时,出现此错误。

修理:

我在git扩展中打开了仓库。我看到文件(具有旧名称)已上演。但是,由于它不再存在,因此无法提交。

我只是取消暂存该文件。

然后,我将文件(这次正确命名)重新添加到git中,并提交而没有错误。


有趣的是,即使它不在intellij中,它仍然可以与TortoiseGit一起使用
MarianKlühspies15

3
这对我很有帮助。我使用SourceTree查找文件的f * ck r并取消暂存。
Vinchenzo

10

我今天有这个问题,我试图git checkout foo和GOTerror: pathspec 'foo' did not match any file(s) known to git.

原来我是在错误的仓库中。因此,我们汲取了教训:在吓坏之前检查一下您要查看的存储库。


Ha-是的,这是我-从Jira票证在Bitbucket中创建了分支,没有注意到它是在某个随机回购中创建的分支
Keir

旁注:我正在使用多个遥控器,其中一个设置正确,而另一个指向错误的存储库。太好了 感谢您的提醒,当我执行git remote -v
Dreamling


8

我通过修改我的git配置文件来修复它。检查您的git目录中的配置文件- .git\config

以前有

[remote "origin"]
url = http://git.xyz.com/abc-group/pqr.git
fetch = +refs/heads/develop:refs/remotes/origin/develop

我通过将其修改为

[remote "origin"]
url = http://git.xyz.com/abc-group/pqr.git
fetch = +refs/heads/*:refs/remotes/origin/*

请注意,头部仅指向一个分支,因此找不到对其他现有分支的引用,因此将其更改为*,以便检查源中的所有内容。


谢谢,伙计,数小时的努力,最后我找到了您的解决方案。
Sunil Lulla

8

尝试通过以下方式签出分支时出现此错误:

git checkout branchX

我以前没有检查过。它仅在明确说明遥控器时有效:

git checkout --track origin/branchX

这样做的原因是,我在git config中配置了2个不同的遥控器(起源+其他)。由于我不需要第二个遥控器,因此将其删除并打开,它就可以了。通过以下方式设置默认遥控器的替代方法:

checkout.defaultRemote=origin

没有为我工作


我添加了此答案,因为所有其他建议的答案都对我不起作用,因此我希望这对具有相同原因(2个遥控器)的人有所帮助。
RS1980

7

在Windows操作系统上,默认情况下安装了git

core.ignorecase = true

这意味着git repo文件将不区分大小写,要更改此文件,您需要执行以下命令:

\yourLocalRepo> git config core.ignorecase false

您可以在.git \ config文件中找到此配置


7

url从另一个.git/config文件复制了远程源,因此我的新.git/config文件在本[remote "origin"]节的以下行丢失

fetch = +refs/heads/*:refs/remotes/origin/*

固定以上行 error: pathspec 'master' did not match any file(s) known to git.


6

我遇到了同样的问题。. foo当我尝试执行以下操作时,我以为分支已命名:

git checkout foo

我得到:

error: pathspec 'foo' did not match any file(s) known to git.

然后,我尝试使用完整的分支名称:

git checkout feature/foo

然后为我工作。


5

如果在Windows上发生,则可能是文件名大小写问题。

我今天遇到了这个错误-我创建了一个新文件,添加到GIT中,然后我将文件名中的一个字母从低位更改为高位,然后我什么都做不了-提交,还原,从存储库中删除文件。

我发现的唯一解决方案是将文件添加到GIT时再次将文件名更改回完全相同的大小写,然后执行GIT还原以从GIT删除此文件,然后根据需要再次更改文件名。进行这些更改之后,我可以承诺回购,然后继续进行而不会出现任何问题。


这有所帮助,但应该提及通过进行重命名git mv。猜猜您已经这样做了,因为通过我的IDE(IntelliJ PhpStorm)失败了……
Dennis98,2015年

5

在我的情况下,我有两个分支1)master(用于实时服务器)2)dev(测试服务器)。我设置了多个遥控器以在各自的服务器上推送代码。当我尝试切换分支时,出现如下错误error: pathspec 'master' did not match any file(s) known to git.

您可以通过看到它们git remote -v。我删除了其他遥控origin器,git remote remove <remote-name>

然后 git fetch

现在我可以通过结帐了git checkout <branch-name>


5

当我第一次玩git时遇到了同样的问题。尝试我的第一次提交时...

git commit -m 'first commit!'

我收到了OP提到的错误...

error: pathspec 'commit!'' did not match any file(s) known to git.

我以为我可能在提交消息中使用关键字来混淆git,所以我尝试了其他几个字并收到了相同的错误。

最后,我在消息中使用了双引号...

git commit -m "first commit!"

结果证明是成功的...

[master (root commit) 0000000] first commit!
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 dummyDoc.txt

5

我犯了一个愚蠢的错误,即在提交时不提供-m标志(大声笑发生)

git commit -m "commit message in here"

同样的情况。只是忘了“ -m”会得到相同的错误味精。
Niuya

5

我有一个根本原因

我有一个脚本,该脚本基本上在所有分支中的“ PRJ-1234”中搜索所有与jira issue key相匹配的分支,以在匹配的分支上执行git branch checkout命令

在我的情况下,问题是2个或多个分支共享相同的jira密钥,因此导致我的脚本因上述错误而失败

通过删除旧的未使用的分支并确保只有一个分支的jira键引用已解决该问题

这是我的代码,以防有人要使用它

git remote update
git fetch --all --prune 
git branch -r --list *$1* | xargs git checkout --force

另存为 switchbranch.sh

然后从终端使用 ./switchbranch.sh PRJ-1234


对我来说,这也是正确的上游路径/名称,包括获取所有远程标记以及“ git fetch --all --tags --prune”,找到正确的名称:“ git branch -a | grep some_upstream”之前与全路径作为检查出来“的git结帐-f --track -b new_branch遥控器/上行/ some_upstream_branch”
kisna

4

这些答案都不能解决我的问题:

Nikolai@CALIGARI-7 ~/Documents/NetBeansProjects/Version (master)
$ git log --format=oneline
b9cc6a9078312865280fb5432a43e17eff03a5c6 Formatted README
288772f36befe6bd60dd41b8185f1e24e0119668 Updated README documentation
d2bdbe18f4169358d46fad50eacfb89786df3bf8 Version object v3.0.0-SNAPSHOT
a46b1910a3f548b4fa254a6055d25f68d3f217dd VersionFactory is now Platform agnostic
24179ae569ec7bd28311389c0a7a85ea7b4f9594 Added internal.Platform abstraction
252b684417cf4edd71aed43a15da2c8a59c629a7 Added IPlugin implementation for Sponge
e3f8d21d6cf61ee4fc806791689c984c149b45e3 Added IPlugin implementation for Bukkit
aeb403914310b4b10dee9e980cf64472e2bfda79 Refactored Version.java
ef50efcff700c6438d57f70fac30846de2747a7e Refactored TesterFactory
a20808065878d4d28657ae362235c837cfa8e625 Added IPlugin abstraction
9712a3575a70060d7ecea8b62bb5e888fdc32d07 Heavily refactored Tester
02d025788ae740dbfe3ef76a132cea8ca4e47467 Added generic Predicate<T> interface
9c565777abea9be6767dfdab4ab94ed1173750dd Minor refactoring of testCompareTo()
2ff2a28c221681e256dcff28770782736d3a796a Version object v2.0.1
d4b2e2bd830f77cdbc2297112c2e46b6555d4393 Fix compareTo()
05fe7e012b07d1a5b8de29804f96d9a6b24229a1 Make compareTo() fail
6e85371414357a41c1fc0cec0e75adba92f96832 Fix VersionFactory passing null
c1fd1f032f87d860d5ed9d6f6679c9fa522cff8d Version object v2.0
62c3a92c008a2ed11f0a4d016080afc3541d0700 Version object v1.2
c42e9e617128085e872c51b4d977a04e48d69e8f Deprecated, doc'd, future-proofed getNm


Nikolai@CALIGARI-7 ~/Documents/NetBeansProjects/Version (master)
$ git checkout 3a796a
error: pathspec '3a796a' did not match any file(s) known to git.

我正尝试回过头来为构建提交Version object v2.0.1。幸运的是,我想到了尝试使用整个哈希代码的想法,它起作用了!这意味着我使用了错误的哈希码结尾。

Nikolai@CALIGARI-7 ~/Documents/NetBeansProjects/Version (master)
$ git checkout 2ff2a
Note: checking out '2ff2a'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 2ff2a28... Version object v2.0.1

Nikolai@CALIGARI-7 ~/Documents/NetBeansProjects/Version ((2ff2a28...))
$

如上所示,对于部分哈希码,您必须提供前端,而不是后端。


4

在Android Studio中重命名未提交的文件后,发生了我的事。

即使它不再存在,Git似乎在其存储库中也有旧版本。

fetch, pull, checkout, add all and so on did not help in my case!

因此,我打开了TortoiseGit的Git GUI,向我显示了引起麻烦的确切文件。

之后,我从存储库中删除了文件

git rm -r --cached /path/to/affected/file

而且问题消失了


3

就我而言,我已重命名了文件以更改文件的大小写,即SomeFile.js-> someFile.js

我认为这与问题有关。进行git fetch无法解决问题。

我将文件从项目中移出,进行了提取,并在没有文件的情况下进行了推送。然后,我进行了一次获取,将它们添加回去,然后进行了推送,然后它起作用了。我不知道是否需要所有这些步骤,但最终确实有效。


在没有重命名的文件的情况下进行推送,然后再发布git add文件对我
有用



2

对我来说,我的凭证有问题


在尝试了一些答案之后,其中一个帮助我解决了这个问题:

运行git fetch引发以下错误:

无法解析主机:bitbucket.org

我要做的就是强迫我的IDE(在我的情况下为VS Code)记住我的凭据:

git config --global credential.helper wincred

Git立即同步所有更改,并且git checkout <branche>现在可以正常工作!


1

pathspec error在git-bash上得到了相同的结果。我在Windows上使用Tortoise git来切换/签出分支。

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.