Git 跟踪分支

May*_*ran 2 git version-control github remote-branch branching-and-merging

我在本地创建了一个存储库并将所有更改推送到 github。后来我创建了一个名为“v2”的新分支(“git branch v2”)并做了一些修改并将该分支也推送到了github。后来当我执行命令“git remote show origin”时,我得到以下输出。

  * remote origin
  Fetch URL: https://github.com/mayuran19/se24_P03.git
  Push  URL: https://github.com/mayuran19/se24_P03.git
  HEAD branch: master
  Remote branches:
    master tracked
    v2     tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local refs configured for 'git push':
    master pushes to master (local out of date)
    v2     pushes to v2     (local out of date)
Run Code Online (Sandbox Code Playgroud)

但是当我执行命令“git branch -vv”时,它显示分支“v2”不是跟踪分支。

  master bad4ed9 [origin/master] Correct name
  * v2     6ec46b0 Data files
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么即使远程分支在 github 中可用并且我能够执行此分支的拉取和推送,为什么分支 v2 没有显示为跟踪分支?

命令“git branch -a”的输出显示以下输出

  master
* v2
  remotes/origin/master
  remotes/origin/v2
Run Code Online (Sandbox Code Playgroud)

但没有显示本地和远程分支之间的映射。

tor*_*rek 5

首先,我们需要一些定义。

一个地方分支(也只是称为“分支”,没有修改)是一个全名打头refs/heads/。使用时git branch,默认情况下您将看到您的本地分支。该git branch命令会剥离该refs/heads/部分,为您留下诸如master和 之类的名称v2

一个远程跟踪分支是其全名以refs/remotes/(再之后还会有一个遥控器的名称)。使用时git branch -r,该命令将显示您的远程跟踪分支。该git branch -r命令会剥离该refs/remotes/部分,为您留下诸如origin/master和 之类的名称origin/v2

前缀剥离是双向的:git branch去掉它,你也可以去掉它。这是为了方便起见,只要您不小心给您的(常规的、本地的)分支名称以origin/. (origin/abc例如,如果你不小心命名了一个本地分支,你可能会混淆自己,而 git 有用的前缀剥离变得有害。)

(请注意,尽管名称为“远程跟踪”,但所有这些实体都是您自己的存储库的本地实体。也可能存在其他引用,您可以使用 看到所有这些实体git for-each-ref,这将使用其全名向您显示每个引用。大多数时间你不需要这个,git branch就足够了。)

可以设置(常规的、本地的)分支来跟踪另一个分支。让一个分支跟踪另一个分支可以为您做一些事情,例如 makegit status告诉您何时领先和/或落后,并在git branch -vv输出中包含另一个分支。(设置跟踪与远程跟踪分支不同。同样,本地分支是名称以 开头的分支refs/heads/,无论是否设置跟踪另一个分支,其名称都不会改变。但是,术语肯定会令人困惑.)

要使一个分支跟踪另一个分支,首先检查第一个分支(您要进行跟踪的分支)。然后,运行。例如,要进行跟踪:git branch --set-upstream-to otherbranchv2origin/v2

git checkout v2
git branch --set-upstream-to origin/v2
Run Code Online (Sandbox Code Playgroud)

要使本地分支跟踪另一个本地分支,只需使用本地分支名称而不是远程跟踪分支名称。要使本地分支停止跟踪任何内容,请使用git branch --unset-upstream.

所有这一切还有一个技巧,1即当您要求git checkout检出(但不创建)一个不存在的本地分支时,git checkout将搜索以查看是否存在具有相似名称的远程跟踪分支。如果是这样,它将创建本地分支并将其设置为跟踪远程跟踪分支。也就是说,如果分支v2 存在-例如,如果重命名或删除现有的地方v2-和origin/v2仍然存在,则:

git checkout v2
Run Code Online (Sandbox Code Playgroud)

一次性创建本地分支v2 并将其设置为 track origin/v2

一个分支不需要跟踪另一个分支来推送和获取/合并/rebase/pull,但是将其设置为跟踪可以使所有这些操作更加方便。


1与 git 一样,实际上有更多方法可以使本地分支跟踪其他内容。您可以git push通过添加-u到推送来设置本地分支以在成功时跟踪远程跟踪分支。您可以使用(已弃用)git branch --set-upstream命令。您可以使用标志来git checkoutgit branch创建或与跟踪集重新创建一个分支。而且,您可以使用git config(使用两个单独的git config命令)使本地分支跟踪其他分支。