远程分支和本地分支的相互创建和跟踪
2013-11-14 07:34
225 查看
1.根据本地分支创建远程分支
原文地址:http://hi.baidu.com/lingzhixu/blog/item/4a9b830bb08a329fe850cd5b.html①本地分支的创建
在本地分支里创建的文件夹及文件,只有进入那个分支里的时候才会在窗口中出现,否则不会存在,并不是隐藏了。本地分支的来源为执行git checkout -b <branch name> 的那个分支
例如现在有两个分支,master和b1
master 分支下有一个commit:
commit1: add test1.c
b1分支下有两个commit:
commit2: add test2.c
commit1: add test1.c
如果在master分支下checkout,即:
git checkout master //进入master分支
git checkout -b frommaster //以master为源创建分支frommaster
git log后发现frommaster中有一个提交:
commit1: add test1.c
这说明他是从master分支为源头创建的
如果在b1分支下checkout,即:
git checkout b1 //进入master分支
git checkout -b fromb1 //以b1为源创建分支fromb1
git log后发现fromb1中已经有两个提交:
commit2: add test2.c
commit1: add test1.c
这说明他是从b1分支为源头创建的
②远程分支的创建
从远程分支检出的本地分支,称为跟踪分支(tracking branch)。跟踪分支是一种和远程分支有直接联系的本地分支。在跟踪分支里输入git push,Git 会自行推断应该向哪个服
务器的哪个分支推送数据。反过来,在这些分支里运行git pull 会获取所有远程索引,并
把它们的数据都合并到本地分支中来.
$ git push ssh://git@dev.lemote.com/rt4ls.git master // 把本地仓库提交到远程仓库的master分支中
$ git remote add origin ssh://git@dev.lemote.com/rt4ls.git
$ git push origin master
这两个操作是等价的,第二个操作的第一行的意思是添加一个标记,让origin指向ssh://git@dev.lemote.com /rt4ls.git,也就是说你操 作origin的时候,实际上就是在操作ssh://git@dev.lemote.com/rt4ls.git。origin在这里完全可以理解为后者 的别名。
需要说明的是,默认情况下这条语句等价于提交本地的master仓库到远程仓库,并作为远程的master分支。
我从master分支创建了一个issue5560分支,做了一些修改后,使用git push origin master提交,但是显示的结果却是'Everything up-to-date',发生问题的原因是git push origin master 在没有track远程分支的本地分支中默认提交的master分支,因为master分支默认指向了origin master 分支,这里要使用git push origin issue5560:master 就可以把issue5560推送到远程的master分支了。
如果想把本地的某个分支test提交到远程仓库,并作为远程仓库的master分支,或者作为另外一个名叫test的分支,那么可以这么做。
$ git push origin test:master // 提交本地test分支作为远程的master分支
$ git push origin test:test // 提交本地test分支作为远程的test分支,如果远程test不存在,会自动创建
如果想删除远程的分支呢?类似于上面,如果:左边的分支为空,那么将删除:右边的远程的分支。
$ git push origin :test // 刚提交到远程的test将被删除,但是本地还会保存的,不用担心
2.根据远程分支创建本地分支
以下来自:http://stackoverflow.com/questions/67699/how-do-i-clone-all-remote-branches-with-git用Git clone 方法只能在本地创建master分支,如何在本地创建分支跟踪远程其他分支(除master以外)?以下是解答
First, clone a remote Git repository
and cd into it:
$ git clone git://example.com/myproject $ cd myproject
Next, look at the local branches in your repository:
$ git branch * master
But there are other branches hiding in your repository! You can see these using the
-aflag:
$ git branch -a * master remotes/origin/HEAD remotes/origin/master remotes/origin/v1.0-stable remotes/origin/experimental
If you just want to take a quick peek at an upstream branch, you can check it out directly:
$ git checkout origin/experimental
But if you want to work on that branch, you'll need to create a local tracking branch:
$ git checkout -b experimental origin/experimental
Now, if you look at your local branches, this is what you'll see:
$ git branch * experimental master
You can actually track more than one remote repository using
git remote.
$ git remote add win32 git://example.com/users/joe/myproject-win32-port
$ git branch -a * master remotes/origin/HEAD remotes/origin/master remotes/origin/v1.0-stable remotes/origin/experimentalremotes/win32/master
remotes/win32/new-widgets
At this point, things are getting pretty crazy, so run
gitkto
see what's going on:
$ gitk --all &
3. 创建分支的原理
以下来自:http://www.open-open.com/lib/view/open1328069889514.htmlGit 又是如何创建一个新的分支的呢?答案很简单,创建一个新的分支指针。比如新建一个 testing 分支,可以使用
git branch命令:
$ git branch testing
这会在当前 commit 对象上新建一个分支指针(见图 3-4)。
图 3-4. 多个分支指向提交数据的历史
那么,Git 是如何知道你当前在哪个分支上工作的呢?其实答案也很简单,它保存着一个名为 HEAD 的特别指针。请注意它和你熟知的许多其他版本控制系统(比如 Subversion 或 CVS)里的 HEAD 概念大不相同。在 Git 中,它是一个指向你正在工作中的本地分支的指针(译注:将 HEAD 想象为当前分支的别名。)。运行
git branch命令,仅仅是建立了一个新的分支,但不会自动切换到这个分支中去,所以在这个例子中,我们依然还在
master 分支里工作(参考图 3-5)。
图 3-5. HEAD 指向当前所在的分支
要切换到其他分支,可以执行
git checkout命令。我们现在转换到新建的 testing 分支:
$ git checkout testing
这样 HEAD 就指向了 testing 分支(见图3-6)。
图 3-6. HEAD 在你转换分支时指向新的分支
这样的实现方式会给我们带来什么好处呢?好吧,现在不妨再提交一次:
$ vim test.rb $ git commit -a -m 'made a change'
图 3-7 展示了提交后的结果。
图 3-7. 每次提交后 HEAD 随着分支一起向前移动
非常有趣,现在 testing 分支向前移动了一格,而 master 分支仍然指向原先
git checkout时所在的 commit 对象。现在我们回到 master 分支看看:
$ git checkout master
图 3-8 显示了结果。
图 3-8. HEAD 在一次 checkout 之后移动到了另一个分支
这条命令做了两件事。它把 HEAD 指针移回到 master 分支,并把工作目录中的文件换成了 master 分支所指向的快照内容。也就是说,现在开始所做的改动,将始于本项目中一个较老的版本。它的主要作用是将 testing 分支里作出的修改暂时取消,这样你就可以向另一个方向进行开发。
我们作些修改后再次提交:
$ vim test.rb $ git commit -a -m 'made other changes'
现在我们的项目提交历史产生了分叉(如图 3-9 所示),因为刚才我们创建了一个分支,转换到其中进行了一些工作,然后又回到原来的主分支进行了另外一些工作。这些改变分别孤立在不同的分支里:我们可以 在不同分支里反复切换,并在时机成熟时把它们合并到一起。而所有这些工作,仅仅需要
branch和
checkout这两条命令就可以完成。
图 3-9. 不同流向的分支历史
由于 Git 中的分支实际上仅是一个包含所指对象校验和(40 个字符长度 SHA-1 字串)的文件,所以创建和销毁一个分支就变得非常廉价。说白了,新建一个分支就是向一个文件写入 41 个字节(外加一个换行符)那么简单,当然也就很快了。
这和大多数版本控制系统形成了鲜明对比,它们管理分支大多采取备份所有项目文件到特定目录的方式,所以根据项目文件数量和大小不同,可能花费的时间 也会有相当大的差别,快则几秒,慢则数分钟。而 Git 的实现与项目复杂度无关,它永远可以在几毫秒的时间内完成分支的创建和切换。同时,因为每次提交时都记录了祖先信息(译注:即
parent对象),将来要合并分支时,寻找恰当的合并基础(译注:即共同祖先)的工作其实已经自然而然地摆在那里了,所以实现起来非常容易。Git
鼓励开发者频繁使用分支,正是因为有着这些特性作保障。
相关文章推荐
- 【虚拟化实战】Cluster设计之一资源池
- 【虚拟化实战】Cluster设计之一资源池 推荐
- 如何手动清除Windows上Domino的安装信息
- Domino上如何配置ID vault账户环境
- Android4.2原生Camera、Gallery导入Eclipse 补充说明
- php checkbox复选框值的获取与checkbox默认值输出方法
- php构造函数的小例子
- jsp base标签与meta标签学习小结
- 使用php验证复选框有效性的示例
- php验证复选框有效性的示例
- php中引用符号(&)的使用详解
- php 文件头部(header)
- html, width
- 重新学习C语言笔记--文件(2)
- 重新学习C语言笔记--文件(1)
- Git HEAD & head
- Maximum Subarray
- Insertion Sort List
- 不知不觉vs2012 update 4出来了
- 子集和数问题