Git-远程分支,远程跟踪分支,跟踪分支的区别
最近在看git pro 3.5远程分支一节,结果被其中的远程分支,远程跟踪分支,跟踪分支这三个概念搞得有点困惑,看了几遍又结合英文版看了看,才明白其的区别以及其与本地分支的关系,在此说明一下。
远程分支
远程分支对应的英文为remote branch,其就是在远程仓库的普通分支,比如远程仓库上的master,自己在远程仓库创建的分支,以及自己推送到远程仓库上去的在远程仓库上的分支。当运行git push (仓库名) 分支名 的命令时,便会在远程仓库创建远程分支。如下图中的框出的master分支既是远程分支。
图1 远程分支与远程跟踪分支
远程跟踪分支
远程跟踪分支对应的英文名称为remote-tracking branch,虽然仅仅多了tracking这个词,但是其作用与性质却与远程分支有很大的不同,远程跟踪分支是本地仓库对远程仓库中的某个远程分支的状态的记录,它们以 “(远程仓库名)/(分支名)”
形式命名。 例如,如果你想要看你最后一次与远程仓库 origin
通信时master
分支的状态,你可以查看 origin/master
分支。远程跟踪分支的作用是告诉用户其所跟踪的远程分支的状态(即指向哪一个commit),因而它在本地是只读的,用户是无法自行修改它的指向。其指向将在用户与远程仓库通信时自动改变,这里的通信是指执行诸如git
fetch等从远程仓库获取数据的操作。下面使用git pro书中的例子来进一步讲解。
假设你的网络里有一个在 git.ourcompany.com
的 Git 服务器。 如果你从这里克隆,Git 的 clone
命令会为你自动将其命名为 origin
,拉取它的所有数据,创建一个指向它的 master
分支的指针,并且在本地将其命名为 origin/master,这便是指向远程分支master的远程跟踪分支。
Git 也会给你一个与 origin 的 master
分支在指向同一个地方的本地 master
分支,正是这个本地分支才使得用户可以在本地对master分支进行修改,这一点下文中还会详细说明。
图2 克隆之后的服务器与本地仓库
如果你在本地的 master
分支做了一些工作,然而在同一时间,其他人推送提交到git.ourcompany.com
并更新了它的 master
分支,那么你的提交历史将向不同的方向前进。 也许,只要你不与 origin 服务器连接,你的 origin/master
指针就不会移动。
图3 本地与远程的工作可以分叉
如果要同步你的工作,运行 git fetch origin
命令。 这个命令查找 “origin” 是哪一个服务器(在本例中,它是 git.ourcompany.com
),从中抓取本地没有的数据,并且更新本地数据库,移动origin/master
指针指向新的、更新后的位置。
图4 git fetch
更新你的远程仓库引用
为了演示有多个远程仓库与远程分支的情况,我们假定你有另一个内部 Git 服务器,仅用于你的 sprint 小组的开发工作。这个服务器位于 git.team1.ourcompany.com
。 你可以运行 git remote add
命令添加一个新的远程仓库引用到当前的项目。 将这个远程仓库命名为 teamone
,将其作为整个 URL 的缩写。
图5 添加另一个远程仓库
现在,可以运行 git fetch teamone
来抓取远程仓库 teamone
有而本地没有的数据。 因为那台服务器上现有的数据是 origin
服务器上的一个子集,所以 Git 并不会抓取数据而是会设置远程跟踪分支teamone/master
指向 teamone
的 master
分支。
图6 远程跟踪分支 teamone/master
跟踪分支
跟踪分支的英文名称为tracking branch,从一个远程跟踪分支产生出的一个本地分支便是跟踪分支,该本地分支对应的远程跟踪分支称为上游分支。跟踪分支是与远程分支有直接关系的本地分支,当克隆一个仓库时,它通常会自动地创建一个跟踪 origin/master
的 master
分支。创建跟踪分支可以使用git checkout -b [branch] [remotename]/[branch],还可以使用–track快捷方式
$ git checkout -b serverfix origin/serverfix Branch serverfix set up to track remote branch serverfix from origin. Switched to a new branch 'serverfix'
$ git checkout --track origin/serverfix Branch serverfix set up to track remote branch serverfix from origin. Switched to a new branch 'serverfix'
更多创建方式可参见git pro 3.5节。
那么跟踪分支有什么作用呢?跟踪分支为本地分支和远程分支之间建立了一种联系,方便了远程分支和本地分支的同步。 如果在一个跟踪分支上输入 git pull
,Git 能自动地识别去哪个服务器上抓取、合并到哪个分支。同时,跟踪分支还能查看本地分支与对应的远程分支之间的超前落后情况,如使用git branch -vv语句
$ git branch -vv iss53 7e424c3 [origin/iss53: ahead 2] forgot the brackets master 1ae2a45 [origin/master] deploying index fix * serverfix f8674d9 [teamone/server-fix-good: ahead 3, behind 1] this should do it testing 5ea463a trying something new
这里可以看到 iss53
分支正在跟踪 origin/iss53
并且 “ahead” 是 2,意味着本地有两个提交还没有推送到服务器上。 也能看到 master
分支正在跟踪 origin/master
分支并且是最新的。 接下来可以看到 serverfix
分支正在跟踪 teamone
服务器上的 server-fix-good
分支并且领先
3 落后 1,意味着服务器上有一次提交还没有合并入同时本地有三次提交还没有推送。 最后看到 testing
分支并没有跟踪任何远程分支。
小结
远程分支就是在远程仓库上的普通分支。远程跟踪分支是在本地的只读的记录远程分支状态的分支,其指向用户无法移动,当使用git fetch等指令时其指向会依照远程仓库自动移动。跟踪分支是从远程跟踪分支上生成的本地分支,跟踪分支提供了本地分支与远程分支更紧密的联系,可以看出本地分支与对应的远程分支的超前落后情况,也可以使用git pull 指令轻松的将远程分支拉取到对应的跟踪分支。
转载:http://blog.csdn.net/zhuyucheng123/article/details/55045339