Git远程分支与远程跟踪分支的区别

  在讨论远程分支、远程跟踪分支之前,我们先来看看什么是分支。

分支(branch)

   几乎所有的版本控制系统都以某种形式支持分支。使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。Git的分支表示的就是一个开发线,而在本质上仅仅是指向一个提交对象(commit)的可变指针。commits都有指向其父对象的指针(零个、一个或多个),而branch就是一个指向最新commit的指针,因此通过遍历这个链表,就可以得到这个分支的所有提交历史。如下图所示。

 

远程分支(remote branch)

  远程分支就是存在于远程仓库上的那些分支,比如远程仓库上的master等分支。如下图所示。

 

远程跟踪分支(remote-tracking branch)

  远程引用是对远程仓库的引用(指针),包括分支、标签等等,而远程跟踪分支就是远程分支状态的引用,用于告诉用户其所跟踪的远程分支的状态。它们是你无法修改的本地引用,每当与远程仓库进行任何网络通信(例如git fetch、get pull、git push等)时Git都会为你自动更新,以确保它们准确地表示远程分支的状态。远程跟踪分支就像是你上次连接到远程仓库时那些分支所处状态的书签。

  远程跟踪分支的命名形式:<remote>/<branch>,如上图所示。如果你想要看看你最后一次与远程仓库 origin 通信时 master 分支的状态,你可以查看 origin/master 分支。如果你与同事合作解决一个问题并且他们向远程分支iss53做了推送,此时你可能有自己的本地分支iss53,但是在服务器上的iss53分支是由本地仓库的远程跟踪分支origin/iss53表示的。

实例

  假设你有一个在git.ourcompany.com上的Git服务器,你可以使用git clone命令从这个Git服务器上向你自己的设备上克隆一个本地仓库。Git clone命令会为你拉取所有数据,为每个分支创建远程跟踪分支(使用git branch -r 命令查看),比如:origin/master,创建并检出一个初始分支(master)。如下图所示。

 

  如果你在本地的master分支做了一些工作,与此同时,其他人推送commits到git.ourcompany.com并更新了它的master分支,那么你们的提交历史将向不同的方向前进。只要你不与git服务器进行连接通信,你的 origin/master(远程跟踪分支) 指针就不会移动。如下图所示。

  为了使你本地的工作与远程仓库保持同步(一致),需要先运行 git fetch <remote> 命令。这个命令查找 “origin” 是哪一个服务器(在本例中,它是git.ourcompany.com),从中抓取本地没有的数据,并且更新本地数据库,移动 origin/master 指针指向新的、更新后的位置。如下图所示。

  现在,本地分支master与远程跟踪分支origin/master指向的是不同的commit,working tree中是没有31b8e、190a3这两个commit的内容的,还需执行git merge命令进行合并。之后,一个新的commit被创建,本地分支master被更新以指向此最新commit,而远程跟踪分支origin/master保持不变。此时,working tree包含了31b8e、190a3、a38de、893cf 这四个commit。

 

注:《Pro Git》中的Remote Branches一节中引入了"tracking branch"这个概念,使得这个章节比较混乱,看后更加迷惑了。个人的理解是,这个"tracking branch"应该指的是本地仓库中那些tracking了远程分支的本地分支(本地分支也可能未tracking任何分支),简单理解为本地分支会更清楚些。

 

参考:

  https://git-scm.com/docs/git
  https://git-scm.com/book/en/v2/
  https://blog.csdn.net/zhuyucheng123/article/details/55045339

posted on 2019-03-08 16:34  泣血  阅读(8979)  评论(1编辑  收藏  举报

导航