【问题标题】:Git: cannot checkout branch - error: pathspec '...' did not match any file(s) known to gitGit:无法签出分支 - 错误:pathspec '...' 与 git 已知的任何文件都不匹配
【发布时间】:2011-08-24 18:42:07
【问题描述】:

我不确定为什么我无法签出我之前工作过的一个分支。请参阅下面的命令(注意:cocheckout 的别名):

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 上找到任何我能理解的内容。

我如何签出那个分支,我可以做些什么来破坏它?

更新

我找到了this post,运行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 目录user_controlled_site_layoutsrefs/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?
  • 马克 - 不,仍然得到同样的错误。
  • 看到你的更新,我不确定你是如何得到一个出现在git branch -a 但不在git show-ref 中的分支。文件.git/refs/heads/feature/user_controlled_site_layout 真的存在吗?如果是这样,cat .git/refs/heads/feature/user_controlled_site_layout 给出了什么?
  • 我遇到了同样的错误,我从另一个仓库创建了分支并尝试将该分支签出到另一个仓库。所以我得到它是因为不同的回购。

标签: git


【解决方案1】:
$ cat .git/refs/heads/feature/user_controlled_site_layouts
3af84fcf1508c44013844dcd0998a14e61455034

您能否确认以下方法有效:

$ git show 3af84fcf1508c44013844dcd0998a14e61455034

可能是有人重写了历史并且该提交不再存在(无论出于何种原因)。

【讨论】:

  • 如果提交被该分支引用,怎么可能不再存在?
  • Magnus,我将您所问内容的输出添加到我的问题中。
  • 这确实是一个奇怪的问题。 “git show-ref --verify refs/heads/feature/user_controlled_site_layout”是否为您提供了有关可能是什么问题的更多信息?
  • 我刚收到fatal: 'refs/heads/feature/user_controlled_site_layout' - not a valid ref
【解决方案2】:

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

git checkout feature/foo

过去,为了解决这个错误,我不得不

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

我也不知道我做了什么让自己陷入这种境地。

【讨论】:

  • 很遗憾,我没有推送到远程git服务器。
  • 这对我有用。它发生在 FC10 机器上的 git v 1.6 上。
  • Git 通常会猜测远程分支来签出,但是当使用多个远程时,它似乎不再可以这样做。来源:makandracards.com/makandra/…
  • 做 git checkout feature/foo 而不仅仅是 git checkout foo 为我工作
  • 这开始发生在我身上(在一个包含许多遥控器和数百个分支的仓库中,我已经成功地从原点检查了 3 年的分支),我感到很困惑。经过检查,我发现我添加了一个新的遥控器,我在文本编辑器中使用复制/粘贴而不是使用 git 命令来完成它,并且忘记更改 fetch = +refs/heads/*:refs/remotes/origin/* 行以匹配新的遥控器名称。哈哈。也许这发生在makandra身上?因为在修复它之后,即使我有很多遥控器,再次签出分支也会从原点获取它。
【解决方案3】:

尝试git fetch,以便您的本地存储库从 Github 获取所有新信息。它只需要有关新分支的信息而没有实际代码。之后,git checkout 应该可以正常工作了。

你基本上看到了分支,但是你还没有本地副本!...

您可以简单地获取然后结帐到分支,使用以下命令来执行此操作:

git fetch
git checkout <Branch name here>

我还创建了下面的图片供您分享差异,看看 fetch 的工作原理,以及 pull 的不同之处:

【讨论】:

  • 为了进一步说明,git fetch 在您需要将本地存储库与远程存储库同步时很有用,但您不想将更改合并到您的工作中文件夹。
  • 如果克隆有多个遥控器,git checkout Branch 不起作用。对于多个遥控器,只有分支名称不明确,需要指定遥控器/分支。命令git checkout -b branch remote/branch 在这种情况下有效。
  • @Aleks 这不是公认的答案,因为它与 OP 的问题没有任何关系。他不能再签出一个分支他以前在本地签出(即创建)。仅仅因为其他有不同的、更基本的问题的人已经找到并赞成这个答案(对于任何有两天以上经验的 git 用户来说,这完全是微不足道的和众所周知的)并不意味着 OP 应该接受它。跨度>
  • git fetch 可以完成这项工作。但它可能无法从远程获取所有分支。您需要设置获取匹配模式。 git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*" 参考:stackoverflow.com/questions/11623862/…
  • git fetch 是一个离奇又疯狂的东西,要花 2 天多的时间来了解这些疯狂的小 tarpit。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    我遇到了同样的问题.. 当我尝试这样做时,我以为我有一个名为 foo 的分支:

    git checkout foo
    

    我得到了:

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

    然后我尝试了完整的分支名称:

    git checkout feature/foo
    

    然后为我工作。

    【讨论】:

      【解决方案6】:

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

      试试:

      git checkout -b yourbranchname
      

      【讨论】:

      • 此选项始终有效,即使文件已经更改并且您希望将它们推送到新创建的分支。
      • 这是一个有用的评论,因为虽然我在这里与 OP 分享了相同的问题/问题,但提供的答案假定情况很简单。不幸的是,在我的情况下,我之前只创建了一个本地分支,然后按照@Francisco Alvarez 的说明将其删除,所以无论我如何在这里尝试其他解决方案,我都无法拉出新的远程分支。这个答案救了我的培根。
      • 这终于为我工作了不可编辑的詹金斯配置,谢谢! (它们由其他 DSL 自动生成)
      【解决方案7】:

      Git Windows 用户要小心 - 如果没有 --icase-pathspecsGIT_ICASE_PATHSPECS = 1 env var setting,git pathspecs 将区分大小写,在这种情况下

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

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

      【讨论】:

      • 有一点需要注意,文档中并不清楚的是 --icase-pathspecs 参数需要先出现或至少在 -C &lt;path&gt; 之前出现
      【解决方案8】:

      这可能是上游重写历史记录时引起的。

      发生这种情况时,我会丢弃所有受影响的存储库,从上游克隆它们,然后使用“git format-patch”/“git am”将任何正在进行的工作从旧世界转移到新世界。

      【讨论】:

        【解决方案9】:

        我遇到了类似的问题。导致我陷入这个麻烦的是: 我有多个远程分支,我删除了包含代码的文件夹。 我做了一个get pull。 :

        git pull git@git.corp......
        

        然后我添加了远程存储库:

        git remote add upstream git@git.corp.......
        

        然后我尝试将分支更改为其他分支,例如 AAAA,但出现错误

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

        花了一个小时后,我找到了解决方案。 我再次删除了源文件夹。 然后我做了一个 git pull :

        git pull git@git.corp......
        

        然后我在将分支链接到远程存储库之前更改了分支:

        git checkout AAA
        

        然后我将它添加到远程存储库

        git remote add upstream git@git.corp......
        

        之后,我可以轻松切换分支。 虽然这不是标准方法,但在我尝试了上述所有选项后它对我有用。

        【讨论】:

          【解决方案10】:

          我在执行以下操作时得到了这个:

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

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

          修复:

          我在 git 扩展中打开了 repo。我看到文件(旧名称)已上演。但是由于它不存在了,所以无法提交。

          我只是取消暂存此文件。

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

          【讨论】:

          • 有趣的是,它仍然适用于 TortoiseGit,即使它不在 intellij 中
          • 这对我帮助很大。我使用 SourceTree 找到文件的 f*ckr 并取消暂存它。
          【解决方案11】:

          我今天遇到了这个问题我试图git checkout foo并得到error: pathspec 'foo' did not match any file(s) known to git.

          原来我进错了仓库。所以吸取了教训:在吓坏之前检查你正在查看的 repo。

          【讨论】:

          • 哈 - 是的,这就是我 - 从 Jira 票证中在 Bitbucket 中创建了分支,没有注意到它是在一些随机 repo 中创建的
          • 旁注:我正在使用多个遥控器,一个设置正确,另一个指向错误的仓库。太棒了感谢您的提醒,当我执行 git remote -v 时,我可以很容易地看到我的问题
          【解决方案12】:

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

          我今天遇到了这个错误 - 我创建了新文件,添加到 GIT,然后我将文件名中的一个字母从小写改成了大写,然后我什么都做不了 - 提交、还原、从 repo 中删除文件。

          我找到的唯一解决方案是在将此文件添加到 GIT 时再次将文件名更改回完全相同的情况,然后执行 GIT revert 以从 GIT 中删除此文件,然后根据需要再次更改文件名。在这些更改之后,我可以提交 repo,然后毫无问题地推送。

          【讨论】:

          • 这有帮助,但应该提到通过git mv 进行重命名。猜猜你是这样做的,因为通过我的 IDE (IntelliJ PhpStorm) 对我来说失败了......
          【解决方案13】:

          在 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
          

          问题就解决了

          【讨论】:

            【解决方案14】:

            在我的例子中,我重命名了一个文件,改变了文件的大小写,即 SomeFile.js -> someFile.js

            我认为这与问题有关。执行 git fetch 并不能解决问题。

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

            【讨论】:

            • 在没有重命名文件的情况下推送,然后发出 git add file 为我做了
            【解决方案15】:

            这些答案都没有解决我的问题:

            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...))
            $
            

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

            【讨论】:

              【解决方案16】:

              我在github桌面上在选择错误的repo时在github桌面上播放它。然后我将 repo 更改为正确的,但是当我尝试删除更改时出现此错误。这是因为这些是我错误选择的存储库中的新文件,但不是我想要更新的那个。

              我只是将 repo 选择器改回了我第一次错误选择的那个,然后我就能够删除更改。

              然后我将 repo 选择器更改为我想要的。

              【讨论】:

                【解决方案17】:

                在我的情况下,我没有做就进入子模块目录

                • git submodule init
                • git submodule update

                所以 git 被链接到确实错过了那个分支的父文件夹。

                【讨论】:

                  【解决方案18】:

                  当我尝试结帐新分支时遇到此错误:

                  错误:pathspec 'BRANCH-NAME' 与 git 已知的任何文件都不匹配。

                  当我尝试git checkout origin/&lt;BRANCH-NAME&gt; 时,我得到了分离的 HEAD:

                  (与原点分离/)

                  最后,我做了以下解决问题

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

                  【讨论】:

                  • 使用这个“checkout”命令我有这个消息:fatal: Cannot update paths and switch to branch 'foo' 同时。
                  • 手动修改远程地址后,无法签出新分支。 “git remote update”似乎可以解决问题。
                  • 没有“git远程更新”它不起作用。谢谢!
                  • git checkout --track origin/staging fatal: git checkout: --track and --no-track require -b git 版本 1.5.6.5
                  • 对我来说 git fetch 单独不起作用,但这个解决方案(包括 remote updatetrack origin 非常有效。
                  【解决方案19】:

                  我在 Windows 上使用 Git 时遇到了这个问题。就我而言,这是一个案例问题。 我已经向我的存储库添加并提交了一个文件,后来只更改了它的大小写。 为了解决这个问题,我重命名了文件以匹配原始大小写,并使用git mv 命令再次重命名。显然,这让 git 跟踪重命名。

                  注意:我使用的是 Cygwin。

                  【讨论】:

                    【解决方案20】:

                    在 Windows 操作系统上,git 默认安装

                    core.ignorecase = true
                    

                    这意味着 git repo 文件将不区分大小写,要更改它需要执行:

                    \yourLocalRepo> git config core.ignorecase false
                    

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

                    【讨论】:

                      【解决方案21】:

                      我上次遇到这个问题,我所做的就是删除与该分支相关的文件夹(或源代码)。

                      例如:分支 origin/foo 在本地创建文件夹 foo,所以我只是删除它并使用git fetch $ checkout 从远程获取代码。

                      或者您可以通过在本地创建与您要结帐的分支相同的文件夹来完成。

                      例如:在本地创建文件夹 foo,然后使用 Git 命令:git branch --set-upstream-to=origin/foo foo,仅此而已。使用git pull获取代码。

                      【讨论】:

                        【解决方案22】:

                        这也发生在我自己创建的两个本地分支的 Windows 上。 离开分行后,我无法结帐

                        bugfix_#303_multiline_opmerkingen_not_displaying_correctly_in_viewer

                        也没有

                        bugfix_339_hidden_​​fields_still_validated

                        您可以在下面的 Git bash 屏幕截图中看到。

                        当我尝试使用 Git GUI 时,我什至看不到分支。但是,当我使用 Pycharms git 工具时,我看到了这个:

                        因此,出于某种原因,Windows 决定在我的分支名称中添加一些难以辨认的字符,这就是它不起作用的原因。在 Pycharm 中重命名分支就可以了,所以猜想这也适用于其他 IDE。

                        【讨论】:

                          【解决方案23】:

                          我的情况是,我在“git branch ...:”之前运行“git fetch”,但得到了同样的错误。 然后我分析它并在我的分支名称中发现错误。修复它并成功切换到分支。

                          【讨论】:

                            【解决方案24】:

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

                            完成git clone 将修复它。

                            【讨论】:

                            • 感谢您指出。这与我面临的问题完全相同。谢谢
                            • 可能不需要完整的克隆。如果分支是在您最初克隆 repo 之后由其他人创建的,您会收到此错误,因为您的本地 repo 没有有关此新分支的任何信息。只需切换到 master 并执行 git pull。然后尝试检查新分支。
                            【解决方案25】:

                            一个可能的原因,如果您使用 MINGW*

                            windows 机器上工作
                            ISSUE
                            

                            检查您要签出的分支名称。Windows 省略字符 ' from branch name while parsing command。

                            例如:如果您有一个分支名称,例如 bugfix/some-'branch'-name

                            当您发出命令:&gt; git checkout bugfix/some-'branch'-name 时,它会将其解析为 bugfix/some-branch-name,注意它省略了 ' 字符。

                            REMEDY
                            

                            要检查这种分支名称,请在发出命令时添加转义字符

                            输入:&gt; git checkout bugfix/some-\'branch\'-name

                            那么它应该工作!

                            【讨论】:

                              【解决方案26】:

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

                              之类的错误

                              您可以通过git remote -v 看到它们。 我已经删除了除origingit remote remove &lt;remote-name&gt;之外的其他遥控器

                              然后git fetch

                              现在我可以通过git checkout &lt;branch-name&gt; 结帐分支。

                              【讨论】:

                                【解决方案27】:

                                我第一次玩 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
                                

                                【讨论】:

                                  【解决方案28】:

                                  这对我有用。它丢弃所有本地更改并将其重置为最后一次提交。

                                  git reset --hard
                                  

                                  【讨论】:

                                    【解决方案29】:

                                    我犯了一个愚蠢的错误,即在提交时没有提供 -m 标志(哈哈发生了)

                                    git commit -m "commit message in here"
                                    

                                    【讨论】:

                                    • 这里的情况相同。只是忘记“-m”得到相同的错误消息。
                                    【解决方案30】:

                                    由于您的功能分支存在于远程,因此损坏的是您的本地存储库。因此,删除您的本地存储库并重新克隆。现在'git checkout &lt;branch_name&gt;'应该适合你。

                                    【讨论】:

                                    • 删除回购是个坏建议。远程上不存在该分支,他将丢失该分支上的所有工作。
                                    猜你喜欢
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 2013-06-01
                                    • 1970-01-01
                                    • 2015-02-04
                                    • 1970-01-01
                                    • 2022-10-12
                                    • 2015-08-28
                                    • 1970-01-01
                                    相关资源
                                    最近更新 更多