Git 跟踪分支

标签 git github version-control branching-and-merging remote-branch

我已经在本地创建了一个仓库,并将所有的更改推送到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)

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

  master bad4ed9 [origin/master] Correct name
  * v2     6ec46b0 Data files

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

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

  master
* v2
  remotes/origin/master
  remotes/origin/v2

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

最佳答案

首先我们需要一些定义。

本地 分支(也简称为“分支”,没有修饰符)是全名以 refs/heads/ 开头的分支。 .使用 git branch 时,默认情况下您会看到本地分支机构。 git branch命令剥离 refs/heads/部分,给你留下像 master 这样的名字和 v2 .

remote-tracking 分支是全名以 refs/remotes/ 开头的分支(然后在之后有一个 Remote 的名称)。使用 git branch -r 时,该命令将向您显示您的远程跟踪分支。 git branch -r命令剥离 refs/remotes/部分,给你留下像 origin/master 这样的名字和 origin/v2 .

前缀剥离是双向的:git branch把它取下来,你也可以把它取下来。这是为了方便起见,只要您不意外地给您的(常规,本地)分支名称以 origin/ 开头,它就可以正常工作。 . (例如,如果您确实不小心将本地分支命名为 origin/abc,您可能会感到困惑,而 git 有用的前缀剥离会变得有害。)

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

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

要让一个分支跟踪另一个分支,首先检查第一个分支(您要进行跟踪的分支)。然后,运行 git branch --set-upstream-to <em>otherbranch</em> .例如,制作 v2轨道 origin/v2 :

git checkout v2
git branch --set-upstream-to origin/v2

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

所有这些还有一个技巧,1 那就是当你问 git checkout 时 checkout (但不创建)一个不存在的本地分支,git checkout将搜索以查看是否存在名称相似的远程跟踪分支。如果是这样,它将创建本地分支设置它以跟踪远程跟踪分支。也就是说,如果分支 v2 存在——例如,如果您重命名或删除现有的本地 v2 —和origin/v2仍然确实存在,那么:

git checkout v2

创建 本地分支 v2 将其设置为跟踪origin/v2 , 一下子。

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


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

关于Git 跟踪分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36527541/

相关文章:

html - 在 GitHub 上发布具有多个子组件的 Polymer 组件

git - git svn fetch 操作的超时设置

html - 为什么我的图片没有显示在我的 github 页面上?

github - 如何接受 GitHub 托管存储库的邀请?

C++项目源码布局

eclipse - 为什么我的 Eclipse "count objects"在每次向上游推送到 GIT 之前

git push tag only 和 commit 区别

git - 使 .gitignore 忽略文件名中包含 "_resultlist"

git - 克隆特定分支

java - 如何将具有状态的对象置于版本控制之下?这还有道理吗?