git上两种工作模式

转载自:http://qbaty.iteye.com/blog/865368。


最近和army8735一起维护他的代码,由于最近代码管理github吵的很热,所以也正好把代码放到git hub上管理,顺便了解下github的工作模式,写这篇文章就是来总结用github来管理代码的一些方式。

文章开始前我觉得有必要稍微介绍下GIT.
Git --- The stupid content tracker, 傻瓜内容跟踪器。那么怎么理解呢?git首先是一个版本控制工具,这点和常用CVS, Subversion是一样的,而不同的是,他采用分布式版本控制库的方式管理。Git的速度非常快,可以很轻易创建分支,并且非常适合用于大项目,它有着非常出色的代码合并追踪能力,再同时它有很多小工具帮它管理版本库。在此本文不试图去深入讨论理解git的工作原理,只打算介绍一下git的相对优点,以及我们可以用git做什么。当今的jquery,淘宝的kissy,白度的Tangram都把自己的代码托管到github上,这里像一个开源基地,谁都可以给任何自己想要参与的项目贡献代码,这个归功于github上提供的两种协作模式(Collaborative Development Models):1、The Fork + Pull Model  (分支推送模式)2、The Shared Repository Model(共享仓库模式)第一种模式在作为陌生人贡献代码上十分有用,后面会详细介绍。

第一步 环境
(如果你已经安装好了环境,并且在github上设置好了ssh密钥,你可以跳过这些内容)
目前git已经都具备了mac linux(不用说) win的安装包
在开始用git工作前,先得确保机器上已经有git的环境
win 下的git安装 http://help.github.com/win-git-installation/
mac 下的git安装 http://help.github.com/mac-git-installation/
linux 下的git安装 http://help.github.com/linux-git-installation/

在安装好了git环境之后你需要做些简单的配置
打开 git 命令行,进到你要放置你代码的目录
输入 git init //git 初始化
Linux代码   收藏代码
  1. git config --global user.name=xxx  
  2. git config --global user.email=xxx  

mac下 等号替换成空格
做上面那些是设置用户名和email,因为git不允许匿名提交
这个时候git本地已经可以工作了,但是如果要和服务器通信,还有一步要做就是

第二步 远程连接
Generating SSH keys 生成ssh密钥
希望这个时候你已经有了一个github的帐号,因为key是要绑定的,没有就去申请一个吧
密钥应该是在根目录的.ssh下,所以
Java代码   收藏代码
  1. $ cd ~/.ssh  
  2. //这个emai替换成你自己的email  
  3. $ ssh-keygen -t rsa -C "[email protected]"  
  4. 这个时候,应该能看到下面的结果  
  5. $ ls  
  6. config  id_rsa  id_rsa.pub  known_hosts  


然后登录github
github=》account setting=》ssh public keys=》add public key
在content里填入rsa.pub的内容,注意别多空格,保存就ok了
最后通过
$ ssh [email protected]来测试是否可以通信
如果你是第一次链接得到的结果如果是
引用
The authenticity of host 'github.com (207.97.227.239)' can't be established.
RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,207.97.227.239' (RSA) to the list of known hosts.
ERROR: Hi tekkub! You've successfully authenticated, but GitHub does not provide shell access
Connection to github.com closed.

则证明你已经联通了github

第三步 开始工作 简单的双向操作
现在我们可以开始来说说如何从github上获取代码了,当你在浏览github的时候,你发现你对jquery的代码很有兴趣,然后你又发现了他的一些bug这个时候你想要修改怎么办?
让我们从第一种模式开始说起吧
The Fork + Pull Model 分支推送模式
你可以在浏览代码库的时候发现github右上角右个小按钮fork,这是分支的意思。当你按下之后你会发现,在你自己的主页会产生一个和这个同名的库,这个库就是分支出来的库。
然后你可以看到,github 给 你分支的库生成了三个地址分别是ssh http 和 read only
用前两个都有编辑权限,这个时候打开你的terminal
Linux代码   收藏代码
  1. //把服务器分支好的代码库down到本地  
  2. $ git clone https://[email protected]/qbaty/jquery.git  

这个时候你就可以在本地修改了,当然你也可以直接在github上修改。然后你改完了某个文件,假如是build.xml这个文件
Linux代码   收藏代码
  1. //让git版本库追踪到build.xml这个文件  
  2. $ git add build.xml  
  3.   
  4. //提交到本地版本库 引号里是注释  
  5. $ git commit -m "add something"  
  6.   
  7. //这个时候已经提交到本地git版本库了,需要传到github需要推送下  
  8. $ git push origin master  

这个环节可能会要你输入你产生ssh密钥时候设置的密码,如果没有设置则为空
当terminal显示完成的时候,刷新你在github上的代码库,你已经可以发现你的修改已经被更新到服务器了

回到你的代码库首页,会发现还是右上角有个pull request按钮,如果你想要把你的代码的改动更新到jquery,按下那个按钮会跳转到sent pull request页面,有一个表单,是用来说明你的提交的内容主要功能。填完按下sent pull request,代码库管理者就能收到这个请求,在审核过你的代码后,把这部分合并到主代码上。

假设你是代码管理者,别人send pull request 给你的时候,你会在你的代码库首页接受到这个请求,然后你决定你要合并别人的改动
这个时候你需要merge pull request
通常有两种比较流行的方式:
Fetch and Merge
Linux代码   收藏代码
  1. //选种当前 master 为当前分支  
  2. $ git checkout master  
  3.   
  4. //让git追踪到远程的要合并的代码库  
  5. $ git remote add xxx git://github.com/xxx/jquery.git  
  6.   
  7. //合并分支  
  8. $ git fetch xxx  
  9. $ git merge xxx/jquery.js  
  10.   
  11. //推送回给自己的代码库  
  12. $ git push origin master  


Patch and Apply
每一个pull request都会产生一个patch url,你可以用git am命令来应用修改
Java代码   收藏代码
  1. $ git checkout master  
  2.   
  3. //应用这个分支的改动  
  4. $ curl http://github.com/github/jobs/pull/25.patch | git am  
  5. $ git push origin master  

这就是一个简单的fork+pull request model下分支以及合并过程。

关于github的分支冲突合并,了解的还不够深入,目前只知道手动合并。
而其强大之处就是你可以通过fork quene来查看所有的分支,并且可以随意选择和任意一个分支合并。这一块应该还有很多可以研究的,在此我只是抛砖引玉,如有错漏还请见谅,希望越来越多的人来尝试github,因为开源的力量真的很强大。

你可能感兴趣的:(git上两种工作模式)