您的位置:首页 > 其它

Git学习教程(四):分枝和合并

2011-09-02 15:33 141 查看
第四课 分枝和合并基础知识介绍

内容提要:创建工作分枝,合并分枝以及删除分枝

从第一课的介绍中,我们了解到,git处理分枝和合并是非常独到的。首先,无论是创建新分枝还是分枝之间切换,都表现出一个共同的特征--快! git 有一个独立的工作目录,专门用来存放所有分枝的内容,所以你没必要为每一个分枝再分别创建目录。
这一节,我们的任务是:

1. 创建一个新的分枝;
2.在这个分枝上做一些工作;
3.切换回稳定的主分枝(一般git默认的主分枝名叫master);
4.在主分枝上再做点工作;
5.再切换到刚那个临时分枝完成工作;
6.最后将它们合并成为一个稳定的主分枝。

首先,查看现存的分枝,可以使用不带任何参数的'git branch'命令。

$ git branch

* master

可以看到,我们现在只有一个分枝叫做'master',*代表的意思是我们正在这个主分枝上工作。下图是在主分支上的提交历史模型,绿框表示提交,箭头指向的是它的父节点。这就是git提交数据的方式。



从图中可以看出,在git中,分枝都是由一些具体的提交点组成。整个分枝的历史都是这样串联起来的,一次只有一个提交点。

创建新的分枝

可以用'git branch (branchname)'命令在当前分枝上创建一个新的分枝:

$ git branch experiment



为了将我们的工作保存到experiment分枝而不是master分枝上,我们需要切换到experiment分枝上,执行'git checkout'命令:

$ git checkout experiment

Switched to branch "experiment"

$ git branch

* experiment

master

执行完毕后,我们就切换到了新的分枝(experiment)分枝上,看到experiment前面有了*号了。现在,我们修改文件、提交就不用再担心跟master分枝混在一起了。也没必要在我们确定一切搞定之前,将experiment分枝上的变更共享了。

在多分枝上进行工作
现在,让我们添加一个TODO文件,并修改simplegit.rb文件,然后将这些变更都提交。

$ vim lib/simplegit.rb

$ vim TODO

$ git add TODO

$ git commit -am 'added a todo and added simplegit functions'

[experiment]: created 4682c32: "added a todo and added simplegit functions"

2 files changed, 10 insertions(+), 0 deletions(-)

create mode 100644 TODO



现在,我们来看一下,整个项目中有3个文件和一个子目录。

$ ls

README Rakefile TODO lib

然后,我们假设需要回到原始版本来调试simplegit.rb文件。

$ git checkout master

Switched to branch "master"

$ ls

README Rakefile lib

可以看到我们已经回到了master分枝,工作目录中也没有TODO文件,这是因为master分枝上我们就没有创建过这个文件。
如果现在我们再切换到experiment分枝,我们又会看到TODO文件,并且simplegit.rb也是我们在experiment修改后的内容。

下面这段代码是在master分枝上修改simplegit.rb文件,在文件内添加一个commit function.提交,然后再切换到experiment分枝。

$ vim lib/simplegit.rb

$ git commit -am 'added a commit function'

[master]: created 0b7434d: "added a commit function"

1 files changed, 4 insertions(+), 0 deletions(-)

$ git checkout experiment

Switched to branch "experiment"

$ ls

README Rakefile TODO lib



很多使用git的开发者通常会同时拥有很多个分枝,每一个分枝上都会进行着某个具体功能的开发,这些开发可能持续几分钟、几小时,也可能长时间的在某个分枝上进行大规模重构的工作,并定期的将其合并到主分枝上。
如果你需要在一个长期工作的分支上与其他开发者进行协作,你可以将这个分枝上传到共享服务器端。譬如,如果你想跟某人共享experiment分枝,你可以这样:

$ git push origin experiment
让你的合作伙伴同步这个分枝,然后与你协同工作。当然你也可以自己保留这些分枝作为自己的工作分枝--不用上传就可以了。

合并和移除无用分枝

当你在一个分枝上完成你的工作了,这时,如果你觉得所做的工作没什么意义,那么你可以忽略它并且将其移除;相反,你应该将这些工作合并到一个你会长期使用的分枝中(一般来说,开发者会用'master'分枝来存放稳定的代码,并行的'develop'分枝用来整合或测试变更的内容,或者将一些短期的分枝合并进来)。
合并分枝的方法:首先切换到想要合并到的分枝下,运行'git merge'命令,(例如本例中将experiment分枝合并到master分枝的话,进入master分枝运行git merge experiment命令)如果合并顺利的话:

$ git merge experiment

Auto-merging lib/simplegit.rb

Merge made by recursive.

lib/simplegit.rb | 1 +

1 files changed, 1 insertions(+), 0 deletions(-)



合并冲突处理

然而,有时候合并并不一定会顺利进行,如果碰到了问题,就会出现下面这些内容:

$ git merge experiment

Auto-merging lib/simplegit.rb

CONFLICT (content): Merge conflict in lib/simplegit.rb

Automatic merge failed; fix conflicts and then commit the result.
这种情形下,提示合并冲突,你可以通过下面的方式来解决:打开提示冲突的文件,会看到冲突标记:

<<<<<<< HEAD:lib/simplegit.rb

def commit(message)

command("git commit -m '#{message}'")

=======

def add(path)

command("git add #{path}")

>>>>>>> experiment:lib/simplegit.rb

end

修改完成之后,运行'git add'重新载入(re-stage)这个文件,然后合并:

$ git add lib/simplegit.rb

$ git commit

[master]: created 6d52a27: "Merge branch 'experiment'"

多次合并
这个问题之所以重要是因为在其他的VCS工具中多次合并实现起来是很麻烦的,但是用git,很容易解决。合并一个分枝之后,再继续在这个分枝上工作,然后再合并。这种情形一般是这样的:如果你有一个'development'分枝,你正在进行集成测试、合并实验中的变更,然后定期的将其合并到稳定的'master'分枝中。

用我们正在进行的例子来讲,假如我们现在又切换到'experiment'分枝,做点小小的改动,然后再将其合并到'master'分枝中,整个的过程大致是这样:



因为git合并是基于提交历史的快照,所以多次合并显得so easy。当你在一个分枝上做完你的工作之后,譬如例子中的'experiment'分枝,那么我们只需使用'git branch -d'命令即可删除此分枝

$ git branch -d experiment
如果分枝还没有被合并,那么执行这个命令就会将分枝上所做的工作一并删除,git是不允许你这么干的。如果你实在想删除的话,那么使用'-D'参数强行删除吧。

这就是git中分枝和合并的所有内容,我想你理解了git的这一功能之后会觉得它确实是个非常棒的工具了。

转自: /article/4430711.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: