首页 > 解决方案 > 是否`/这个 `git checkout` 命令中的` 代表远程分支还是远程跟踪分支?

问题描述

的联机帮助页git checkout说:

git checkout <branch>

如果<branch>未找到,但在一个远程(调用它)中确实存在一个<remote>具有匹配名称的跟踪分支,则视为等同于

$ git checkout -b <branch> --track <remote>/<branch>

其中,手册页git checkout说,调用

$ git branch -f <branch> <remote>/<branch>

默认情况下带有 -t选项git branch(来自手册页git branch

-t

创建新分支时,设置 branch.<branch>.remotebranch.<branch>.merge配置条目以将起点分支标记为新分支的“上游”。

<remote>/<branch>在等价的git checkout命令和git branch命令中代表什么?

  1. 既然git branch命令设置 branch.<branch>.remotebranch.<branch>.merge成为一个远程仓库和一个远程分支,是否<remote>/<branch> 代表远程分支(上游分支)?

  2. 既然git branch命令从 开始创建一个新的本地分支<remote>/<branch>,是否<remote>/<branch>代表远程跟踪分支?

标签: git

解决方案


git help revisions将告诉您如何解释 refname。

以供参考,

<refname>, 例如master, heads/master,refs/heads/master
一个符号引用名称。例如,master 通常表示 refs/heads/master 引用的提交对象。如果你碰巧有 head/master 和 tags/master,你可以明确地说 head/master 来告诉 Git 你指的是哪一个。当有歧义时,通过以下规则中的第一个匹配来消除 a 的歧义:

  1. 如果 $GIT_DIR/<refname> 存在,那就是你的意思(这通常只对 HEAD、FETCH_HEAD、ORIG_HEAD、MERGE_HEAD 和 CHERRY_PICK_HEAD 有用);
  2. 否则, refs/<refname> 如果存在;
  3. 否则, refs/tags/<refname> 如果存在;
  4. 否则,如果存在,则为 refs/heads/<refname>;
  5. 否则, refs/remotes/<refname> 如果存在;
  6. 否则,如果存在,则为 refs/remotes/<refname>/HEAD。

    HEAD命名您基于工作树中的更改的提交。FETCH_HEAD 记录您使用最后一次 git fetch 调用从远程存储库中获取的分支。ORIG_HEAD 是由以剧烈方式移动 HEAD 的命令创建的,用于记录 HEAD 在操作之前的位置,以便您可以轻松地将分支的尖端更改回运行它们之前的状态。MERGE_HEAD 记录您在运行 git merge 时要合并到分支中的提交。CHERRY_PICK_HEAD 记录您在运行 git cherry-pick 时挑选的提交。

    请注意,上述任何 refs/* 案例可能来自 $GIT_DIR/refs 目录或来自 $GIT_DIR/packed-refs 文件。虽然未指定参考名称编码,但首选 UTF-8,因为某些输出处理可能会采用 UTF-8 中的参考名称。

    @
    @ 单独是 HEAD 的快捷方式。

因此,当您说origin/masterGit 正在那里的存储库中寻找某些东西时,它会根据该列表进行搜索,除非您已经开始使用分支或标签前缀来双关远程名称,否则它会找到远程跟踪 ref refs/remotes/origin/master

(请注意,有很多方便的方法可以在 Git 中引用这组或那组修订,请参阅文档)。


推荐阅读