您的位置:首页 > 其它

远程分支和本地分支的相互创建和跟踪

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
-a
flag:
$ 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
gitk
to
see what's going on:
$ gitk --all &


3. 创建分支的原理

以下来自:http://www.open-open.com/lib/view/open1328069889514.html

Git 又是如何创建一个新的分支的呢?答案很简单,创建一个新的分支指针。比如新建一个 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
鼓励开发者频繁使用分支,正是因为有着这些特性作保障。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: