无法使用多个遥控器进行结帐

时间:2015-06-01 13:37:14

标签: git

我在我当地的git repo中设置了两个遥控器。一个是我贡献的开源项目的回购,另一个是我的回购分支。

我似乎只能查看我从origin遥控器下拉的内容。从遥控器抓取分支的常规方法包括

$ git fetch <remote> <branch>
$ git checkout <branch>

但这似乎并不适用于我目前的情况。

$ git fetch my-remote my-branch
remote: Counting objects: 2297, done.
remote: Compressing objects: 100% (1951/1951), done.
remote: Total 2297 (delta 1044), reused 0 (delta 0), pack-reused 50
Receiving objects: 100% (2297/2297), 2.10 MiB | 1.59 MiB/s, done.
Resolving deltas: 100% (1045/1045), done.
From https://github.com/me/my-repo
 * branch            my-branch -> FETCH_HEAD
 * [new branch]      my-branch -> origin/my-branch
$ git checkout my-branch
error: pathspec 'my-branch' did not match any file(s) known to git.

此外,当我执行git branch时,分支不会出现。

这里发生了什么?

3 个答案:

答案 0 :(得分:4)

如果您只有一个遥控器(我们称之为origin),那么当您输入

git checkout foo

foo不存在但origin/foo确实存在时,git的行为就像您输入以下内容一样

git checkout -b foo origin/foo

如果您有多个遥控器,并且foo在本地不存在但存在于2个或更多遥控器中,则会抑制此行为。

您需要显式创建foo并指示git您想要跟踪的远程/分支。

git checkout -b foo <remote>/foo

答案 1 :(得分:2)

Git 2.19将有所帮助,因为“ git checkout”和“ git worktree add”学会了尊重 checkout.defaultRemote在从 具有多个远程站点的存储库中的远程跟踪分支 具有相同名称的跟踪分支。

请参见commit 8d7b558commit ad8d510commit 1c55055commit 3c87aa9commit e4d2d55commit e417151commit 17b44ae,{{3} }(2018年6月5日)通过commit c8cbf20
(由Ævar Arnfjörð Bjarmason (avar)Junio C Hamano -- gitster --中合并,2018年8月2日)

注意:commit 50858ed是“按我的意思做”,当计算机系统试图预期用户打算做什么时,它会自动纠正一些小错误,而不是盲目地执行用户的显式但可能不正确的输入。 > 我见过DWIMGit 2.16 remote format

  

结帐和工作树:引入checkout.defaultRemote

     

引入一个checkout.defaultRemote设置,该设置可用于   当(通过checkout.defaultRemote=origin指定一个偏爱的遥控器时   运行例如“ git checkout master”表示origin/master,即使   还有其他具有“ master”分支的遥控器。

     

我想要这个,因为使用此工作流程来结帐   存储库并创建一个主题分支,然后返回到“ master”   从上游检索:

(
    cd /tmp &&
    rm -rf tbdiff &&
    git clone git@github.com:trast/tbdiff.git &&
    cd tbdiff &&
    git branch -m topic &&
    git checkout master
)
     

这将输出:

Branch 'master' set up to track remote branch 'master' from 'origin'.
Switched to a new branch 'master'
     

但是一旦添加了新的遥控器(例如,只是为了检查某些东西)   DWIMery消失了:

(
    cd /tmp &&
    rm -rf tbdiff &&
    git clone git@github.com:trast/tbdiff.git &&
    cd tbdiff &&
    git branch -m topic &&
    git remote add avar git@github.com:avar/tbdiff.git &&
    git fetch avar &&
    git checkout master
)
     

将输出(不增加本系列前面的建议输出):

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

新的checkout.defaultRemote配置使我可以说   出现歧义,我想使用“ origin”,它仍然会   就像我唯一的遥控器是“ origin”一样。

答案 2 :(得分:1)

  1. 当只有一个远程站点时,远程分支的git checkout可以很好地工作。如果该分支不在本地计算机中,它将在git网站中检查该分支,以及该分支是否在git网站中,它将分支下载到本地计算机,然后将其设置为在git网站(也称为远程)中的分支中跟踪分支。
  2. 但是当您添加两个遥控器时,使用git checkout分支对远程分支进行git checkout失败。
  3. 可以通过将其中一个遥控器设置为默认值来解决此问题。
  4. 为此,请将以下行添加到您的gitconfig文件中。(全局git config文件通常位于〜/ .gitconfig中)

    [checkout]
        defaultRemote=origin