专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »编程综合 » Git教程( 4):分枝和合并 »正文

Git教程( 4):分枝和合并

来源: 发布时间:星期日, 2009年12月20日 浏览:0次 评论:0
  从第介绍中我们了解到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功能的后会觉得它确实是个非常棒工具了



标签:
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: