Git 为什么它不是提交,并且不能从中创建分支?

Git 为什么它不是提交,并且不能从中创建分支?,git,git-non-bare-repository,Git,Git Non Bare Repository,我需要使用复杂的存储库配置。我有5个: 计算机1上的远程中央存储库 我的笔记本上的本地存储库(机器2) 机器3上的裸存储库 机器3上的存储库 机器4上的存储库,我们在其中进行代码审查 因此,我的理解是,它是这样工作的: 在我的笔记本电脑(机器2)上,我从位于机器1上的中央存储库进行克隆/提取 我将本地回购推送到机器3(使用裸存储库作为“中间层”) 现在我在机器3上做了一些更改,我想把这些更改推到机器4上。以下是我需要遵循的说明: 在机器3上,完成测试分支中的所有工作,提交 推送到机器3上的裸回购

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

  • 计算机1上的远程中央存储库
  • 我的笔记本上的本地存储库(机器2)
  • 机器3上的裸存储库
  • 机器3上的存储库
  • 机器4上的存储库,我们在其中进行代码审查
  • 因此,我的理解是,它是这样工作的:

  • 在我的笔记本电脑(机器2)上,我从位于机器1上的中央存储库进行克隆/提取
  • 我将本地回购推送到机器3(使用裸存储库作为“中间层”)
  • 现在我在机器3上做了一些更改,我想把这些更改推到机器4上。以下是我需要遵循的说明:

  • 在机器3上,完成测试分支中的所有工作,提交
  • 推送到机器3上的裸回购:git推原始测试分支
  • 在笔记本电脑上:从机器上获取新提交-3 repo:git fetch machine3
  • 从机器3签出您的分支:git checkout-b test branch machine-3/测试分支
  • 从机器4获取提交:git获取来源
  • git重新基址源/主
  • git推送原点磁头: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/测试分支
    致命:参数“machine3/test branch”不明确:未知修订或路径不在工作树中。
    使用“---”将路径与修订分开,如下所示:
    '吉特[…]-[…]'
    
    这个问题很复杂,答案很简单。别名和机器3之间不匹配。已使用的远程设备的别名不适用于machine3。机器3有另一个别名

    对于那些在搜索致命问题的答案时发现此问题的人:“源/远程分支名称”不是提交,并且无法从中创建分支“本地分支名称”,您可能还需要先尝试以下操作:

    git fetch --all
    
    如果运行
    git checkout-b本地分支名称来源/远程分支名称
    ,而不先运行
    fetch
    ing,则可能会遇到该错误

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

    如果您有多个遥控器(例如,
    原点
    构建服务器
    joespc
    ,等等),则会包含
    --all
    标志,因为
    git fetch
    本身默认为您的第一个遥控器--通常是
    原点
    。您还可以对特定的远程设备运行
    fetch
    ;e、 例如,
    git fetch buildserver
    将只从
    buildserver
    远程获取所有分支


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

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

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

    git config-e——全局

    并添加此配置

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

    然后您可以
    git fetch--all

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

    来自的解决方案包括
    git fetch--all

    从VSCode 1.53(2021年1月)开始,您将拥有(和):

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

    这允许用户从所有远程设备获取数据,而不仅仅是他们的
    源设备

    对于使用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
    
    对我来说,我应该先签出到
    测试分支
    ,然后它工作正常,并从
    测试分支
    创建了一个新分支。我们遇到了以下错误:

    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”。

    机器3的repo是空的,这意味着它没有任何工作树
    git checkout-b test branch machine-3/test branch
    需要一个工作树,因此失败。此外,您需要检查机器3/测试分支是否存在。在机器3上,我有2个回购(一个是裸回购,另一个是非裸回购)。我在机器3上的非裸回购中有“测试分支”。很抱歉,我错过了它。什么是
    git rev parse machine3/test branch
    echo?在运行步骤4的repo中。让我们来看看。对我来说
    git fetch origin
    git fetch origin master
    没有帮助,我必须
    git获取origin refs/heads/master:refs/remotes/origin/master
    @SillyFreak这是唯一对我有效的方法。@SillyFreak-我无法为上游创建跟踪分支,但它在:git获取上游refs/heads/master:refs/remotes/upstream/My Remote branch name之后开始工作这对我有效!谢谢你也为我工作。我已经移除了我唯一的遥控器,一次清除了所有的追踪分支,那条线就不见了。
    git  remote  set-branches  --add  'origin'  'newbranch'
    git  fetch  'origin'
    git  checkout  --track  'origin/newbranch'