中文教程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