中文教程git
http://progit.org/book/zh/github
Git是一个分布式的版本控制系统,最初由Linus Torvalds编写,用做Linux内核代码的管理。在推出后,Git在其它项目中也取得了很大成功,尤为是在Ruby社区中。目前,包括Rubinius和Merb在内的不少知名项目都使用了Git。Git一样能够被诸如Capistrano和Vlad the Deployer这样的部署工具所使用。web
目前大部分的版本控制都须要一個服务器端,commit时提交到服务器端。git虽然是分布式的管理工具,但它也可使用集中管理的方式。举例来讲,billy建立了一个新项目,tom以为这个项目比较有意思,他想玩玩看,他能够把整个repo(reoisitories)都clone到本地,而且在他clone下来的项目中本身有一个repo。tom能够自由的对这个repo作各类提交修改,直到他满意为止。这时tom能够告诉billy,他改了一些什么,若billy以为不错,能够从tom那边fetch并merge到本地。shell
如前所述,做为一个分布式的版本控制系统,在Git中并不存在主库这样的概念,每一份复制出的库均可以独立使用,任何两个库之间的不一致之处均可以进行合并。正由于如此,因此有了Github这个网站,github是基于ruby的并揉合多种语言进行开发的,上面的ruby项目也很是活跃。在github 中,每一个人均可以有多个repo,这些repo都是与用户绑定在一块儿的。user之间能够互相clone repo、fork repo、watch repo或是 follow其余user,就好像twitter或是plurk等社交网站同样。api
不过若使用免费的github则全部的repo都要是public且有300M容量的限制。若但愿有private的repo,则须要跟付费才可。github另外还有剪贴簿的功能,可将代码贴到其中并自由的发展各类branch。浏览器
GitHub能够托管各类git库,并提供一个web界面,但与其它像 SourceForge或Google Code这样的服务不一样,GitHub的独特卖点在于从另一个项目进行分支的简易性。为一个项目贡献代码很是简单:首先点击项目站点的“fork”的按 钮,而后将代码检出并将修改加入到刚才分出的代码库中,最后经过内建的“pull request”机制向项目负责人申请代码合并。已经有人将GitHub称为代码玩家的MySpace:ruby
在GitHub进行分支就像在Myspace(或Facebook [...])进行交友同样,在社会关系图的节点中不断的连线。
GitHub项目自己天然而然的也在GitHub上就行托管,只不过在一个私有的,公共视图不可见的库中。开源项目能够免费托管,但私有库则并不如此。Chris Wanstrath,GitHub的开发者之一,确定了经过付费的私有库来在财务上支持免费库的托管这一计划。bash
是的,咱们正是这么计划的。经过与客户的接洽,开发FamSpam,甚至是开发GitHub自己,GitHub的私有
库已经被证实了物有所值。任何但愿节省时间并但愿和团队其它成员同样远离页面频繁转换之苦的人士都会从
GitHub中得到他们真正想要的价值。
Chris Wanstrath还向InfoQ分享了关于GitHub的一些内幕信息:服务器
GitHub主要用Rails实现。咱们目前在进行的post-commit集成小应用彻底使用Merb编写。咱们使用了
Python的Pygments来作格式高亮显示,另外还用了Ara T. Howard's Bj加上一些Ruby脚原本作咱们的排队 系统。固然,咱们用了Ruby Grit库来和Git进行交互。
GitHub已经有了一组引人注目的特性,除了命令式的库浏览器和一个项目Wik,GitHub甚至还包括了一个GitHub gem,以使经过shell方式使用GitHub更为方便。更多的将来特性已经在计划中:ssh
许多人都但愿能有一个条目系统,所以一个简单的条目系统已经在开发中。此外,正如我前面所言,咱们尚在
进行RubyGems服务器和一些以前留出的post-commit钩子方面的工做。若是你不能或就是不想托管一个你
本身的守护进程,你可使用咱们所提供的。
咱们还在开发一些特性来帮助公司在使用Github时能够停留在sync之上。
最后,咱们也在进行API发布方面的工做。咱们很快就会发布一些只读性的API,随后是一些很强大的“写”集
成。你可使用API将新的事件发布到新闻feed中,发消息和作其余许多很酷的事情。
更多关于GitHub的信息能够参见GitHub官方网站或GitHub博客。目前经过GitHub进行代码管理的开源项目列表也已经能够查阅。
下面先來介紹如何将环境配置好:配置环境分为三个步骤,安装与设置git,安装与设置ssh-key,以及在github上注册并创建repo。
- 安装与设置git
Linux:只要用yum,apt-get等安装便可,或是下载以后编译安装。
Mac OS X:从这里下载并安装。
Windows:先安装putty,而后从这里下载并安装。
- 安装与设置ssh-key
git使用ssh tunnel来提交源码,这个加密通道能够避免源码的封包被拦截而截取。所以要先产生并上传ssh key到github,方便之後与服务器之间的通迅。
Mac OS X与Linux,只要输入ssh-keygen -t rsa并根据指示操做便可:
[~/.ssh]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/tom/.ssh/id_rsa): <enter>
Enter passphrase (empty for no passphrase): <输入key的密碼,或直接按下enter使用空密码>
Enter same passphrase again: <再输入一次密码>
Your identification has been saved in /home/tom/.ssh/id_rsa.
Your public key has been saved in /home/tom/.ssh/id_rsa.pub.
The key fingerprint is:
50:43:77:c6:97:af:61:82:dc:ea:9b:6b:67:d4:1b:61 tom@volcano
其中id_rsa.pub是公钥,而id_rsa则是私钥,请妥善保存以避免遺失,它们都存放于~/.ssh目录中。将公钥粘贴到你github账号中的SSH Public Keys的位置。注意当心不要复制到空格。
Windows,执行git-bash并输入:
ssh-keygen -C “username@email.com” -t rsa
- github注册
在github你的账号右上角能够看到一个Your Repositories,选择Create one。输入Project name后,能够看到它有教你如何建立一个新的项目。
这里以一个名为test的项目为例:
# Global setup:
# Download and install Git
git config --global user.email <your email>
git config --global user.name <your name>
# Next steps:
mkdir test # cd test
git init
# github会自动读取你的README内容并显示在项目简介中,所以先建立README
touch README
# 将README加到index中
git add README
# 提交到版本库中
git commit -m 'first commit'
# 把github的repo加入为远程的repo
git remote add origin git@github.com:<你的ID>/test.git
# 把目前的commit状态push并同步到github上面
git push origin master
# Existing Git Repo?
cd existing_git_repo
git remote add origin git@github.com:<你的ID>/test.git
git push origin master
把你的程序push上github后就能够有本身的repo了。
若您喜欢別人的repo,只要他是public的,就能够点击上面的fork,把整个repo复制到你的账户底下并修改提交后再请求原做者进行pull。
若你fork了一个repo(名为test)到github中以后,只要輸入:
git clone git@github.com:<ID>/test.git test
就能够将整个repo复制下来并存放在test目录中。若你的ssh key有加上密码保护,每次与github通讯的过程当中都须要輸入密码以存取ssh key。
git的简单使用:
# 建立一个版本库
git init
# 每次修改好了后,能够先将修改存入stage(快照/索引)中
git add <modified files>
# 修改了大量文件则使用下面这个命令批量存入
git add .
# 使用commit将快照/索引中的内容提交到版本库中
git commit -m "msg"
# 也能够将git add与git commit用一个指令完成
git commit -a -m "msg"
# 将本地的git档案与github(远程)上的同步
git push
# 将github(远程)的git档案与本地的同步(即更新本地端的repo)
git pull
# 例如,pull指令其实包含了fetch(將变动复制回來)以及merge(合并)操做
git pull git://github.com/tom/test.git
# 另外版本控制系統的branch功能也颇有意思,若同时修改bug,又要加入新功能,能够fork出一个branch:一个专门修bug,一个专门加入新功能,等到稳定后再merge合并
git branch bug_fix # 创建branch,名为bug_fix
git checkout bug_fix # 切换到bug_fix
git checkout master #切换到主要的repo
git merge bug_fix #把bug_fix这个branch和如今的branch合并
# 如有remote的branch,想要查看并checkout
git branch -r # 查看远程branch
git checkout -b bug_fix_local bug_fix_remote #把本地端切换为远程的bug_fix_remote branch并命名为bug_fix_local
# 还有其它能够查看repo状态的工具
git log #能够查看每次commit的改变
git diff #能够查看最近一次改变的內容,加上参数能够看其它的改变并互相比较
git show #能够看某次的变动
# 若想知道目前工做树的状态,能够輸入
git status