git学习——远程分支
2013-08-29 19:46
281 查看
远程分支
远程分支(remote branch)是对远程仓库状态的索引。它们是一些无法移动的本地分支;只有在进行 Git 的网络活动时才会更新。远程分支就像是书签,提醒着你上次连接远程仓库时上面各分支的位置。我们用
(远程仓库名)/(分支名)这样的形式表示远程分支。比如我们想看看上次同
origin仓库通讯时
master的样子,就应该查看
origin/master分支。如果你和同伴一起修复某个问题,但他们先推送了一个
iss53分支到远程仓库,虽然你可能也有一个本地的
iss53分支,但指向服务器上最新更新的却应该是
origin/iss53分支。
可能有点乱,我们不妨举例说明。假设你们团队有个地址为
git.ourcompany.com的 Git 服务器。如果你从这里克隆,Git 会自动为你将此远程仓库命名为
origin,并下载其中所有的数据,建立一个指向它的
master分支的指针,在本地命名为
origin/master,但你无法在本地更改其数据。接着,Git 建立一个属于你自己的本地
master分支,始于
origin上
master分支相同的位置,你可以就此开始工作(见图 3-22):
要是你在本地
master分支做了会儿事情,与此同时,其他人向
git.ourcompany.com推送了内容,更新了上面的
master分支,那么你的提交历史会开始朝不同的方向发展。不过只要你不和服务器通讯,你的
origin/master指针不会移动(见图 3-23)。
可以运行
git fetch origin来进行同步。该命令首先找到
origin是哪个服务器(本例为
git.ourcompany.com),从上面获取你尚未拥有的数据,更新你本地的数据库,然后把
origin/master的指针移到它最新的位置(见图 3-24)。
为了演示拥有多个远程分支(不同的远程服务器)的项目是个什么样,我们假设你还有另一个仅供你的敏捷开发小组使用的内部服务器
git.team1.ourcompany.com。可以用第二章中提到的
git remote add命令把它加为当前项目的远程分支之一。我们把它命名为
teamone,表示那一整串 Git 地址(见图 3-25)。
现在你可以用
git fetch teamone来获取小组服务器上你还没有的数据了。由于当前该服务器上的内容是你
origin服务器上的子集,Git 不会下载任何数据,而只是简单地创建一个名为
teamone/master的分支来指向
teamone服务器上
master所指向的更新
31b8e(见图 3-26)。
推送
要想和其他人分享某个分支,你需要把它推送到一个你拥有写权限的远程仓库。你的本地分支不会被自动同步到你引入的远程分支中,除非你明确执行推送操作。换句话说,对于无意分享的,你尽可以保留为私人分支,而只推送那些协同工作的特性分支。如果你有个叫
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:serferfix来实现相同的效果,它的意思是“提取我的 serverfix 并更新到远程仓库的 serverfix”。通过此语法,你可以把本地分支推送到某个命名不同的远程分支:若想把远程分支叫作
awesomebranch,可以用
git push origin serverfix:awesomebranch来推送数据。
接下来,当你的协作者再次从服务器上获取数据时,他们将得到一个新的远程分支
origin/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 refs/remotes/origin/serverfix. Switched to a new branch "serverfix"
这会切换到新建的
serverfix本地分支,其内容同远程分支
origin/serverfix一致,你可以在里面继续开发了。
跟踪分支
从远程分支检出的本地分支,称为跟踪分支(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 refs/remotes/origin/serverfix. Switched to a new branch "serverfix"
要为本地分支设定不同于远程分支的名字,只需在前个版本的命令里换个名字:
$ git checkout -b sf origin/serverfix Branch sf set up to track remote branch refs/remotes/origin/serverfix. 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 [远程名] [本地分支]:[远程分支]语法,如果省略
[本地分支],那就等于是在说“在这里提取空白然后把它变成
[远程分支]”。
相关文章推荐
- 【Git学习笔记】 git克隆远程项目并创建本地对应分支
- Git学习笔记(四)——分支管理和远程操作
- git学习(4)远程库和分支管理
- git学习笔记(一):创建和管理远程分支
- git之学习要点:远程分支与衍合
- GIT 01 -log diff checkout 远程仓库与分支学习
- git学习(2)--- git clone远程项目,创建分支,提交分支
- Git学习之本地分支和远程分支关联
- git学习四(远程分支)
- git学习——远程分支
- Git与GitHub学习笔记(四)合并远程分支
- git学习——远程分支
- 【Git学习笔记】用git pull取回远程仓库某个分支的更新,再与本地的指定分支自动merge【转】
- git学习笔记:分支和远程仓库
- git学习笔记(二):分支和远程仓库
- 【Git学习笔记】用git pull取回远程仓库某个分支的更新,再与本地的指定分支自动merge
- Git 学习笔记--拉取远程分支到本地
- Git学习笔记(二) 远程仓库及分支
- git如何删除远程分支
- Git学习笔记五--分支管理