远程分支(remote branch)是对远程仓库中的分支的索引。它们是一些没法移动的本地分支;只有在 Git 进行网络交互时才会更新。远程分支就像是书签,提醒着你上次链接远程仓库时上面各分支的位置。git
咱们用 (远程仓库名)/(分支名)
这样的形式表示远程分支。好比咱们想看看上次同 origin
仓库通信时master
分支的样子,就应该查看 origin/master
分支。若是你和同伴一块儿修复某个问题,但他们先推送了一个 iss53
分支到远程仓库,虽然你可能也有一个本地的 iss53
分支,但指向服务器上最新更新的却应该是 origin/iss53
分支。github
可能有点乱,咱们不妨举例说明。假设大家团队有个地址为 git.ourcompany.com
的 Git 服务器。若是你从这里克隆,Git 会自动为你将此远程仓库命名为 origin
,并下载其中全部的数据,创建一个指向它的master
分支的指针,在本地命名为 origin/master
,但你没法在本地更改其数据。接着,Git 创建一个属于你本身的本地 master
分支,始于 origin
上 master
分支相同的位置,你能够就此开始工做(见图 3-22):数据库
图 3-22. 一次 Git 克隆会创建你本身的本地分支 master 和远程分支 origin/master,而且将它们都指向origin
上的 master
分支。服务器
若是你在本地 master
分支作了些改动,与此同时,其余人向 git.ourcompany.com
推送了他们的更新,那么服务器上的 master
分支就会向前推动,而于此同时,你在本地的提交历史正朝向不一样方向发展。不过只要你不和服务器通信,你的 origin/master
指针仍然保持原位不会移动(见图 3-23)。网络
图 3-23. 在本地工做的同时有人向远程仓库推送内容会让提交历史开始分流。fetch
能够运行 git fetch origin
来同步远程服务器上的数据到本地。该命令首先找到 origin
是哪一个服务器(本例为 git.ourcompany.com
),从上面获取你还没有拥有的数据,更新你本地的数据库,而后把origin/master
的指针移到它最新的位置上(见图 3-24)。spa
图 3-24. git fetch 命令会更新 remote 索引。指针
为了演示拥有多个远程分支(在不一样的远程服务器上)的项目是如何工做的,咱们假设你还有另外一个仅供你的敏捷开发小组使用的内部服务器 git.team1.ourcompany.com
。能够用第二章中提到的 git remote add
命令把它加为当前项目的远程分支之一。咱们把它命名为 teamone
,以便代替完整的 Git URL 以方便使用(见图 3-25)。code
图 3-25. 把另外一个服务器加为远程仓库server
如今你能够用 git fetch teamone
来获取小组服务器上你尚未的数据了。因为当前该服务器上的内容是你 origin
服务器上的子集,Git 不会下载任何数据,而只是简单地建立一个名为 teamone/master
的远程分支,指向 teamone
服务器上 master
分支所在的提交对象 31b8e
(见图 3-26)。
图 3-26. 你在本地有了一个指向 teamone 服务器上 master 分支的索引。
要想和其余人分享某个本地分支,你须要把它推送到一个你拥有写权限的远程仓库。你建立的本地分支不会由于你的写入操做而被自动同步到你引入的远程服务器上,你须要明确地执行推送分支的操做。换句话说,对于无心分享的分支,你尽管保留为私人分支好了,而只推送那些协同工做要用到的特性分支。
若是你有个叫 serverfix
的分支须要和他人一块儿开发,能够运行 git push (远程仓库名) (分支名)
:
$ git push origin serverfix Counting objects: 20, done. Compressing objects: 100% (14/14), done. Writing objects: 100% (15/15), 1.74 KiB, done. Total 15 (delta 5), reused 0 (delta 0) To git@github.com:schacon/simplegit.git * [new branch] serverfix -> serverfix
这里其实走了一点捷径。Git 自动把 serverfix
分支名扩展为refs/heads/serverfix:refs/heads/serverfix
,意为“取出我在本地的 serverfix 分支,推送到远程仓库的 serverfix 分支中去”。咱们将在第九章进一步介绍 refs/heads/
部分的细节,不过通常使用的时候均可以省略它。也能够运行 git push origin serverfix:serverfix
来实现相同的效果,它的意思是“上传我本地的 serverfix 分支到远程仓库中去,仍旧称它为 serverfix 分支”。经过此语法,你能够把本地分支推送到某个命名不一样的远程分支:若想把远程分支叫做 awesomebranch
,能够用 git push origin serverfix:awesomebranch
来推送数据。
接下来,当你的协做者再次从服务器上获取数据时,他们将获得一个新的远程分支 origin/serverfix
,并指向服务器上 serverfix
所指向的版本:
$ git fetch origin remote: Counting objects: 20, done. remote: Compressing objects: 100% (14/14), done. remote: Total 15 (delta 5), reused 0 (delta 0) Unpacking objects: 100% (15/15), done. From git@github.com:schacon/simplegit * [new branch] serverfix -> origin/serverfix
值得注意的是,在 fetch
操做下载好新的远程分支以后,你仍然没法在本地编辑该远程仓库中的分支。换句话说,在本例中,你不会有一个新的 serverfix
分支,有的只是一个你没法移动的origin/serverfix
指针。
若是要把该远程分支的内容合并到当前分支,能够运行 git merge origin/serverfix
。若是想要一份本身的 serverfix
来开发,能够在远程分支的基础上分化出一个新的分支来:
$ git checkout -b serverfix origin/serverfix Branch serverfix set up to track remote branch serverfix from origin. Switched to a new branch 'serverfix'
这会切换到新建的 serverfix
本地分支,其内容同远程分支 origin/serverfix
一致,这样你就能够在里面继续开发了。
从远程分支 checkout
出来的本地分支,称为 跟踪分支 (tracking branch)。跟踪分支是一种和某个远程分支有直接联系的本地分支。在跟踪分支里输入 git push
,Git 会自行推断应该向哪一个服务器的哪一个分支推送数据。一样,在这些分支里运行 git pull
会获取全部远程索引,并把它们的数据都合并到本地分支中来。
在克隆仓库时,Git 一般会自动建立一个名为 master
的分支来跟踪 origin/master
。这正是 git push
和 git pull
一开始就能正常工做的缘由。固然,你能够为所欲为地设定为其它跟踪分支,好比 origin
上除了 master
以外的其它分支。刚才咱们已经看到了这样的一个例子:git checkout -b [分支名] [远程名]/[分支名]
。若是你有 1.6.2 以上版本的 Git,还能够用 --track
选项简化:
$ git checkout --track origin/serverfix Branch serverfix set up to track remote branch serverfix from origin. Switched to a new branch 'serverfix'
要为本地分支设定不一样于远程分支的名字,只需在第一个版本的命令里换个名字:
$ git checkout -b sf origin/serverfix Branch sf set up to track remote branch serverfix from origin. Switched to a new branch 'sf'
如今你的本地分支 sf
会自动将推送和抓取数据的位置定位到 origin/serverfix
了。
若是再也不须要某个远程分支了,好比搞定了某个特性并把它合并进了远程的 master
分支(或任何其余存放稳定代码的分支),能够用这个很是无厘头的语法来删除它:git push [远程名] :[分支名]
。若是想在服务器上删除 serverfix
分支,运行下面的命令:
$ git push origin :serverfix To git@github.com:schacon/simplegit.git - [deleted] serverfix
咚!服务器上的分支没了。你最好特别留心这一页,由于你必定会用到那个命令,并且你极可能会忘掉它的语法。有种方便记忆这条命令的方法:记住咱们不久前见过的 git push [远程名] [本地分支]:[远程分支]
语法,若是省略 [本地分支]
,那就等因而在说“在这里提取空白而后把它变成[远程分支]
”。