67

我需要使用复杂的存储库配置。我有 5 个:

  1. 机器 1 上的远程中央存储库。
  2. 我笔记本上的本地存储库(机器 2)。
  3. 机器 3 上的裸存储库。
  4. 机器 3 上的存储库。
  5. 机器 4 上的存储库,我们在其中进行代码审查。

所以,我的理解是它是这样工作的:

  1. 在我的笔记本电脑(机器 2)上,我从位于机器 1 上的中央存储库中克隆/提取。
  2. 我将本地存储库推送到机器 3(使用裸存储库作为“中间”)。

现在我在机器 3 上做了一些更改,我想将这些更改推送到机器 4。以下是我需要遵循的说明:

  1. 在机器 3 上,在您的测试分支中完成所有工作,提交。
  2. 推送到机器 3 上的裸仓库:git push origin test-branch
  3. 在您的笔记本电脑上:从 machine-3 存储库中获取新提交:git fetch machine3
  4. 从机器 3 检查您的分支: git checkout -b test-branch machine-3/test-branch
  5. 从 machine-4 获取提交:git fetch origin
  6. git rebase 起源/主
  7. git push origin HEAD:refs/for/master

第 4 步有问题。我收到以下错误:

fatal: 'machine3/test-branch' is not a commit and a branch 'test-branch' cannot be created from it

添加

当我执行

git rev-parse machine3/test-branch

在我的笔记本电脑(机器 2)上,我得到:

machine3/test-branch
fatal: ambiguous argument 'machine3/test-branch': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
4

10 回答 10

148

对于那些在寻找答案时发现此问题的人fatal: 'origin/remote-branch-name' is not a commit and a branch 'local-branch-name' cannot be created from it,您可能还想先尝试一下:

git fetch --all

如果您git checkout -b local-branch-name origin/remote-branch-name没有fetch先 ing 运行,则可能会遇到该错误。

它说“不是提交”而不是像“分支不存在”这样更清楚的原因是因为 git 采用您指定的参数origin/remote-branch-name并尝试将其解析为提交哈希。您也可以在此处使用标签名称和提交哈希作为参数。如果它们失败,则会产生相同的错误。如果 git 无法解析您提供给特定提交的分支,通常是因为它没有最新的远程分支列表。git fetch --all修复了这种情况。

--all如果您有多个遥控器(例如origin,等),则包含该标志,因为buildserver它本身默认为您的第一个遥控器 - 通常是. 您还可以针对特定的遥控器运行;例如,只会从远程获取所有分支。joespcgit fetchoriginfetchgit fetch buildserverbuildserver

要列出所有遥控器,请运行命令git remote -v。如果您在结果中只看到一个远程名称(例如),则可以省略该--all标志。git fetchorigin

于 2019-03-28T20:24:24.003 回答
21

我们有这个错误:

fatal: 'origin/newbranch' is not a commit and a branch 'newbranch' cannot be created from it

因为我们做了一个简约的克隆,使用:

git  clone  --depth 1  --branch 'oldbranch'  --single-branch  'git@github.com:user/repo.git'

对我们来说,简约的修复是:

git  remote  set-branches  --add  'origin'  'newbranch'
git  fetch  'origin'
git  checkout  --track  'origin/newbranch'

假设远程被称为“origin”,远程分支被称为“newbranch”。

于 2021-06-08T12:29:28.253 回答
9

我设法用这个设置解决了这个问题,只需用这个命令更新配置

git config -e --global

并添加此配置。

[remote "origin"]
    url = https://git.example.com/example.git (you can omit this URL)
    fetch = +refs/heads/*:refs/remotes/origin/*

然后你可以git fetch --all

于 2020-10-13T16:11:47.467 回答
2

如果您要从标签(如git checkout -b XXXX v0.1.1)中签出分支,您可以先尝试git fetch --tags

于 2019-12-13T20:49:18.397 回答
1

我发现这个问题解决了更简单的问题:我在尝试从远程创建一个 lobal 分支时收到了同样的错误。我通过从提交哈希创建分支来解决它:

git ls-remote origin remote-branch
returned
<hash>  refs/heads/remote-branch

git checkout -b local-branch <hash>
于 2021-10-26T20:45:05.677 回答
0

对于这个问题:

fatal: 'machine3/test-branch' is not a commit and a branch 'test-branch' cannot be created from it

对我来说,我应该先签出test-branch,然后它工作正常并从test-branch.

于 2021-02-01T13:24:53.727 回答
0

我们在与谷歌驱动器同步的文件夹上运行 gitbash 的 Windows 机器中遇到了这个确切的错误。

这是由于启用了“启用实验性内置文件系统监视器”功能引起的。

在禁用此功能的情况下卸载并重新安装 gitbash 后,它已修复。

在此处输入图像描述

于 2021-10-21T17:04:05.390 回答
-1

问题很复杂/令人费解,答案很简单。别名与 machine3 不匹配。已使用的遥控器的别名不适用于 machine3。machine3 有另一个别名。

于 2018-03-15T13:46:11.827 回答
-1

JD Mallen的解决方案包括git fetch --all

从 VSCode 1.53(2021 年 1 月)开始,您将拥有(问题 110811PR 111090):

更改autofetch为具有“ current”、“ all”和“ off”的字符串配置。

这允许用户从所有远程获取,而不仅仅是他们的origin.
对于在 Fork 上工作的开发人员来说,这应该会使扩展更直观地工作。

因此,如果您将 VSCode 设置git.autofetch为“ all”,您甚至不必键入git fetch --all.

于 2021-01-17T00:32:19.340 回答
-2

我在 Visual Studio 代码中使用了 git 工作流,如下图所示来解决我的问题:

在 vscode 上使用 git 创建一个功能分支

于 2020-12-13T13:23:52.167 回答