现在的位置: 首页 > 综合 > 正文

git使用(4)理解和使用分支

2014年03月09日 ⁄ 综合 ⁄ 共 3899字 ⁄ 字号 评论关闭

git使用(4)理解和使用分支

Posted by 姜立 on 2011 年 10 月 02 日 in Git |

只是用git中的一条分支,寂寞人分支,就可以获得版本控制的好处,当和其他开发人员合作市,git会跟踪历史记录,以避免偶然因素而删除重要的东西。

通过这种方式使用git,就好比买了辆赛车,却用在上下班路上,虽然可以驾驶它到目的地,但显然没有发挥它的全部潜力。

分支是git的核心内容之一,下面我们会学习分支的概念和分支的如下操作:

创建分支

合并分支

处理合并分支

删除分支

重命名分支

使用发布分支

 

我们将使用前面使用的例子,你也可以从github上克隆这个版本库:

git clone git://github.com/tswicegood/mysite-chp4.git

什么叫分支

实际工作中,我们要为许多任务设定优先级,添加新功能,重构代码以方便维护,或者修正偶然出现的bug等,所有这一切都会占用开发人员的时间和潜力,因此要为这些任务先后顺序做出合理安排。

如果在git中只是用一条版本演进轨迹,就难以支持上述情形,因此须要创建和使用多条分支,多条分支可以用来记录不同的版本演进轨迹。

前边所有的操作都是在主分支上进行的,我们可以把这个分支改个名称:

git branch –m master mymaster

git bracnch

image

这样就把主分支改名为mymaster,上面的两个命令都用了git branch,但是使用的参数不一样。

第一个命令有三个参数,-m告诉git要执行分支移动(重命名)操作,另外两个参数分别是分支原名称和新名称。

第二个命令没有参数,因此git就显示版本低版本库中所有的班底分支名称,因为目前本地版本库中仅有一条分支,所以git只显示这条分支名称。

现在把它的名字改回master

git branch –m mymaster master

在git中,我们总是在某条分支上工作,使用分支很容易,但是有些版本控制系统在创建分支时会将所有的文件复制到新目录中,git不这样做,它只把分支创建后的修改记录在这条分支上。

这么说并不完全准确,实际上,git的分支只记录和跟踪该分支末梢的那个提交,因为沿着这个版本回溯,可以找到该分支完整的历史轨迹。

使用分支时,最难确定的是何时创建分支,至少下面这些情况可以创建分支

实验性更改

增加新功能

Bug修复

创建新分支

创建新分支很简单,只需使用git  branch命令即可,但只要在参数给出新分支名称,

git branch new

git branch

image

结果显示 刚刚创建的名为new的分支,但是请注意,主分支名称前有型号,表示它是当前的检出分支,检出分支就是内容检出到当前的工作目录树的分支。

为在新创建的分支下修改文件,值需要检出该分支即可,这样,使用git checkout命令以检出分支

git checkout new

image

创建分支后,通常都希望立即检出给分支,以便在该分支上展开工作,git为此提供了快捷方法,只须在git checkout命令加上参数-b,就可以一步完成创建分支并检出该分支。

用快捷方法创建alternate分支的命令如下,当然这个分支的名称必须是唯一的,不能重复

git checkout –b alternate master

image

注意上面的命令中的第三个参数master,该参数告诉git,不是从当前分支,而是从主分支上创建新分支,即基于主分支的末梢创建新分支。

上面就是创建分值的工程,下面介绍合并分支间的修改。

合并分之间的修改

分支对组织版本库非常有用,但是需要在分支间共享修改,共享是由分支合并来实现的。

合并操作是把两条或者多条分支合并到一起,实际上有好几种分支合并方法,下面介绍主要3种。

直接合并:把两条分支以上的历史轨迹合并,交汇到一起

压合合并:将一条分支上的若干个提交条目合成一个提交条目,提交到另一个分支末梢。

拣选合并:拣选另一条分支上的某个调教条目的改动带到当前分支上。

直接合并

将一条分支直接合并到另一条分支,如果想把一条父女之的全部历史提交合并到另一条分支上,可以采用这种方式。

下面将通过刚创建的alternate分支中添加一些新修改来介绍这种合并方法,添加一个名为about.html的新文件,并加入一些介绍信息。

创建好该新文件后,将它添加到暂存区并提交版本库中:

git add about.html

git commit –m “add the skeleton of an about page”

image

现在就在alternate分支下包含一个提交,且该提交并不存在于主分支上,可以是使用git merge 命令将两条分支合并起来。

首先切换到合并操作的目标分值上,上面的例子中,指的是主分支:

git checkout master

image

然后就可以使用merge命令了,

git merge alternate

image

这样alternate分支上的修改就合并到主分支上了。

压缩合并

功能分支是git中常见的分支用法。你可以在已有的分支上创建新的分支,用于新功能开发或bug修复,然后通过一个压缩提交将新分支上的修改合并回来。

压缩指的是git将一条分支上的所有历史提交压合成一个提交,提交到另一条分支上,但是要小心使用压合提交,因为在大多数情况下,每个提交都应该作为一个单独的条目存在历史记录中,如果某条分支上的所有提交都密切相关,应随后作为一个整体记录(在父分支上)时,适合做压合合并。

当向开发一些实验性的新功能或者修复bug时,这种合并就很有用,因为此时所需要的并不是长期记录和跟踪每个试验性的提交,只是最后的成果。

为了演示压合提交,请从主分支上创建一个名为contact的分支并检出

git checkout –b contact master

image

现在添加一个名叫contact.html的文件,并在文件添加一些内容,然后提交对该文件的修改。

git add contact.html

git commit –m “add contact file with email”

image

再添加一些内容,现在该文件你已经添加了两次内容,然后提交修改:

git commit –m “add secondary email” -a

image

目前在contact分支上已经有了两个提交,你可以将这两个提交压合成主分支上的一个提交,首先,切换到主分支上:

git checkout master

然后调用git merge 并给它传送参数–squash。参数–squash告诉git merge命令,将另一条分支上的全部提交压合成当前分支上的一个提交:

git merge –squash contact

image

此时,在contact分支上的两个提交已经合并到当前工作去并暂存,但还没有作为一个提交,提交版本库中,运行git status命令查看当前状态:

image

最后像正常提交一样,现在把这些改动提交到版本库中,

git commit –m “add contact page”\

           -m “has primary and email”

image

压合合并与直接合并各有用途,然而,有时候需要合并的仅仅是一个提交,此时适合采用拣选合并。

拣选合并

有时候分支间只需要合并一个提交,而不需要合并一条分支上的全部改动,因为该分支可能含有尚未完成的新功能,或者包含其他一些尚不能合并的改动。

什么时候只需要合并一个提交呢?也许是一个已修复的Bug,或者一个用于分支间共享的类,使用git cherry-pick命令可合并单个提交。

正如拣选这个词的意思,它拣选一个提交并将它添加到当前分支的末梢,为了演示拣选合并,请在contact分支中创建第三个提交。

首先确认当前分支是contact分支,如果不是的话,转换到该分支上:

git checkout contact

在contact.html文件中添加一条新链接,然后提交:

git commit –m “add link to my blog” -a

image

使用提交名称3df91c0就可以随时对它拣选操作,记住,这个提交名称具有全局唯一性特征,因此实际操作中的提交名称与本例中的名称不一样,下面将它拣选合并到主分支上:

git checkout master

git cherry-pick 3df91c0

image

当然这个例子不会给人深刻的印象,毕竟只从contact分支上带回一行代码修改,但是它演示了拣选操作的基本步骤。

假定在重构现有的代码的过程中,在一条分支下创建了一个新类,该类实现了某个通用模式,现在想把这个改动拿到另一条分支上,但是问题是,如果进行合并操作,这条分支上的全部改动都会带过来,但显然不是你想要的结果。

此时你可以使用git cherry-pick命令来拣选出需要的改动,git默认使用拣选的提交创建新提交,大多数情况下可以这样,但当新提交包含拣选的多个提交时,该如何操作呢?

要拣选多个提交,需要给git cherry-pick命令传递参数-n,这就告诉git在创建提交前需连续进行合并操作,下面介绍具体步骤。

首先使用git reset命令恢复前面的修改

git reset –hard HEAD^

image

现在删除了(主干末梢上的)最后一个提交,再次使用git cherry-pick命令,并带参数-n:

git cherry-pick –n 3df91c0

 image

完成本次操作时git停了下来,而不是立即提交,运行git status命令可以看到,改动已被暂存,等待提交:

git status

image

接着可以进行下一个拣选,一旦拣选完需要的各个提交,就可以一并提交改动,并添加任意提交留言。

下面继续进行提交操作,但是不要使用-m参数,编辑器会使用刚刚拣选的提交留言,作为现在的提交留言。

git commit

 image

合并操作的基本内容就介绍完了,所有的合并操作都很简单和直接,但是合并的时候出问题该怎么?下篇文章接着介绍。

抱歉!评论已关闭.