为什么它不是一个提交,而且不能从它创建一个分支?

我需要处理一个复杂的仓库配置,我有5个仓库:

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

所以,我的理解是这样的:

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

现在我对机器3做了一些更改,我想把这些更改推到机器4。以下是我需要遵循的指示:

  1. 在机器3上,在您的测试分支中完成所有工作,提交。
  2. 推到你的裸回购机器3: git 推原产地测试分支
  3. 在您的笔记本电脑上: 从 machine-3 repo: git fetchine3获取新的提交
  4. 从计算机3检查您的分支: git checkout-b test-Branch machine-3/test-Branch
  5. 从 machine-4获取提交: git 获取原点
  6. Git rebase source/master
  7. Git 推送源头头: refs/for/master

我在步骤4中遇到了问题。我得到了以下错误:

注意: “ machine3/test-Branch”不是提交,不能从中创建分支“ test-Branch”

增加

当我执行的时候

git rev-parse machine3/test-branch

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

机器3/测试分支

不明确的参数“ machine3/test-Branch”: 未知的修订或工作树中没有的路径。

Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
151991 次浏览

这个问题很复杂/令人费解,答案很简单。化名和机器之间不匹配。已使用的远程的别名不是用于计算机3。机器有另一个化名。

对于那些在寻找 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而不运行 fetching,则可能会遇到该错误。

它之所以说“不是一个提交”,而不是更清楚地说“分支不存在”,是因为 git 接受指定 origin/remote-branch-name的参数,并尝试将其解析为一个提交散列。这里也可以使用标记名和提交散列作为参数。如果它们失败,也会产生同样的错误。如果 git 不能解析提供给特定提交的分支,通常是因为它没有最新的远程分支列表。git fetch --all修复了这种情况。

如果您有多个远程控制器(例如 originbuildserverjoespc等) ,那么就会包含 --all标志,因为 git fetch本身默认为您的第一个远程控制器——通常是 origin。您还可以对特定的远程运行 fetch; 例如,git fetch buildserver只能从 buildserver远程获取所有的分支。

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

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

我设法用这个设置修复了这个问题,只需要用这个命令更新配置

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

我在可视化工作室代码中使用 git 工作流,如下图所示,来解决我的问题:

create a feature branch using git on vscode

来自 J.D. Mallen的解决方案涉及到 git fetch --all

从 VSCode 1.53(2021年1月)开始,你将拥有(第110811期PR 111090) :

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

这允许用户从 都是遥控器而不仅仅是从他们的 origin获取。
对于使用 Fork 的开发人员来说,这应该可以使扩展更直观地工作。

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

对于这个问题:

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

对于我来说,我应该首先检出到 test-branch,然后它工作得很好,并从 test-branch创建了一个新的分支。

我们犯了一个错误:

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'

假设远程分支被称为“ source”,而远程分支被称为“ newBranch”。

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

这是由于启用了“启用实验性内置文件系统监视器”特性造成的。

卸载和重新安装 gitbash 并禁用这个特性之后,它就被修复了。

enter image description here

我发现这个问题的故障排除较简单的问题: 我收到同样的错误尝试创建一个全局分支从远程。 我通过从提交散列创建分支解决了这个问题:

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


git checkout -b local-branch <hash>

我有问题的地方,我 git checkout name-branch和它被创建,但当我 用 git branch 检查分支没有发生任何事情 经过几个小时的尝试,我试图运行命令 git push GitHub-URL name-branch 它将提交直接推送到分支 希望这能帮上忙

我的问题是,我有一个 空间在我的新分行名称

问题:

git checkout -b my-new-branch name

而不是

git checkout -b my-new-branch-name

该分支不存在于指定的远程原点上。再检查一遍: 你可能是想从葡萄树上摘橙子。

检查.git 文件夹中的 git 配置,并验证此内容

[core]
repositoryformatversion = 0
fileMode = false
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[remote "origin"]
url = https://github.com/ABC/project0001.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "main"]
remote = origin
merge = refs/heads/main
[pull]
ff = no
[branch "develop"]
remote = origin
merge = refs/heads/develop

[remote "origin"] < ——本节

对于那些寻找 fatal: 'origin/remote-branch-name' is not a commit and a branch 'local-branch-name' cannot be created from it答案的人来说,我们刚刚发现的另一种可能性是,远程分支已经被合并了: 尴尬: