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

lim*_*imp 9 git

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

看来我只能查看我从origin遥控器下拉的东西.从遥控器抓取分支的常规方法包括

$ git fetch <remote> <branch>
$ git checkout <branch>
Run Code Online (Sandbox Code Playgroud)

但这在我目前的情况下似乎不起作用.

$ 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.
Run Code Online (Sandbox Code Playgroud)

此外,当我这样做时,分支不会出现git branch.

这里发生了什么?

And*_*w C 9

当您只有一个遥控器(叫它origin)时,然后键入

git checkout foo

foo不存在但origin/foo确实存在时,git的行为就像您键入以下命令一样

git checkout -b foo origin/foo

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

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

git checkout -b foo <remote>/foo


Von*_*onC 9

Git 2.19 会有所帮助,因为“ git checkout” 和“ git worktree add” 学会 checkout.defaultRemote了在从远程跟踪分支中自动激活本地分支时使用多个远程跟踪分支,这些远程跟踪分支共享相同的名称。

提交8d7b558提交ad8d510提交1c55055提交3c87aa9提交e4d2d55提交e417151提交17b44ae提交c8cbf20(2018年6月5日)由ÆvarArnfjörðBjarmason( )avar
(由Junio C gitsterHamano合并-- --提交 50858ed,2018 年 8 月 2 日)

注意:DWIM是“按我的意思做”,当计算机系统尝试预测用户打算做什么时,会自动纠正琐碎的错误,而不是盲目地执行用户明确但可能不正确的输入。
我已经看到了Git 2.16 远程格式Git 2.13 结帐完成

结帐和工作树:介绍 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
Run Code Online (Sandbox Code Playgroud)

)

这将输出:

Branch 'master' set up to track remote branch 'master' from 'origin'.
Switched to a new branch 'master'
Run Code Online (Sandbox Code Playgroud)

但是一旦添加了新的遥控器(例如只是为了检查其他人的东西),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
Run Code Online (Sandbox Code Playgroud)

)

将输出(没有本系列前面添加的建议输出):

error: pathspec 'master' did not match any file(s) known to git.
Run Code Online (Sandbox Code Playgroud)

checkout.defaultRemote配置允许我说,每当出现这种歧义时,我更喜欢“ origin”,它仍然可以工作,就好像我唯一的遥控器是“ origin”一样。

CodeManX确实在评论中指出了如何设置该新选项:

git config --add checkout.defaultRemote origin 
Run Code Online (Sandbox Code Playgroud)

--global如果要全局设置,请添加)

  • `git config checkout.defaultRemote=origin` 在 Git 2.28 中对我来说失败了,错误:无效密钥:checkout.defaultRemote=origin_,但这有效:`git config --add checkout.defaultRemote origin` (如果添加 `--global`你想全局设置) (2认同)

小智 8

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

    [checkout]
        defaultRemote=origin
    
    Run Code Online (Sandbox Code Playgroud)