一、什麼是GIThtml
Git是一個強調速度的分佈式版本控制軟件和源代碼管理系統(SCM,source code management)。Git最初是由Linus Torvalds爲內核開發而設計的管理軟件。自從Git推出以來,已經被不少開源項目所採納。每個Git工做目錄是一個帶有徹底歷史記錄和版本信息的倉庫,不依賴於網絡和中央服務器。Git是一個免費的開源軟件,聽從GNU v2協議。jquery
Git這個詞在英語中的原意是很笨拙,沒用的人。Linus自嘲說:「我是一個任性的笨蛋,因此我把個人全部的項目的名字都和我很類似。第一個是Linux,如今是Git。」Git的幫助文檔中描述Git爲:笨拙的內容跟蹤者(the stupid content tracker)。(翻譯自WIKI)git
關於開發Git的一些歷史由來,能夠看看這個網站:https://lkml.org/lkml/2005/4/6/121github
二、爲何要用GITshell
更順暢的工做流程,開發過程當中,徹底能夠離線操做ubuntu
快速,Git分佈式架構使得本地倉庫包含全部的歷史版本信息,你能夠在不一樣的版本之間快速切換vim
彈性的本地分支,在svn下,你建一個分支須要把源代碼複製到另一個文件夾,而在Git下,建立分支的代價是很是小的,只需一條命令安全
倉庫目錄結構簡潔,用Git複製一個項目,只會在項目根目錄建立一個.git的目錄,而其餘目錄很乾淨bash
內容按元數據方式存儲,全部的版本信息都位於.git目錄下服務器
完整性好,更易於協做開發
用戶羣大,如今已經有成千上萬個開源項目採用Git來作項目管理,github上更是有無數個代碼倉庫
三、GIT安裝與配置
a) 安裝
1.從源碼安裝
在安裝以前,你必須保證如下幾個依賴包已經安裝在你的系統上:curl, zlib, openssl, expat, libiconv。若是你的系統是Ubuntu,你能夠這樣安裝:
apt-get install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
當全部的依賴項已經解決,就能夠從http://git-scm.com/download上下載Git的源碼,而後編譯安裝,具體命令以下:
tar -zxf git-1.*.*.*.tar.gz cd git-1.*.* make prefix=/usr/local all sudo make prefix=/usr/local install
2.在Linux上安裝
若是你的系統是Linux或者Fedora,你能夠經過如下命令直接安裝Git:
yum install git-core (fedora) apt-get install git-core (ubuntu)
3.在Windows上安裝
儘管Git是發源於Linux,但如今Windows上也有可以正常使用Git,只不過不支持中文,在Windows下全部的中文都顯示問號,另外還有一些功能上的BUG。因此建議仍是在Linux上去使用Git,若是你不得不工做在Windows上,你能夠到http://msysgit.github.com/上下載msysgit的最新版,安裝過程和其餘Windows程序差很少,基本上點下一步就OK了。Msysgit默認會安裝git bash和git GUI這兩個程序,通常用git bash就能夠了,它支持經常使用的命令。若是對Linux命令行不熟,你也能夠用用git GUI,但功能有限制。
b) 第一次使用GIT
在你安裝好Git以後,你須要修改一些配置,才能正常使用Git。
Git經過「git config」命令來配置Git,這個命令有2個選項:--system, --global, 加上默認選項,分別對應Git上3級配置文件。第一個是/etc/gitconfig文件,和--system對應,這是全局配置文件,修改這個文件,將會影響系統上全部的用戶,全部的倉庫。第二個是你家目錄下的/.gitconfig文件,與--global對應,修改它會對你當前用戶的全部倉庫產生影響。第三個是你倉庫中的.git/.gitconfig文件,這是「git config」默認修改的配置文件,它只會對你當前倉庫產生影響。
在第一次使用Git時,你須要告訴你的協同開發者,你是誰以及你的郵箱,在你提交的時候,Git須要這兩個信息。具體經過如下命令設置:
git config --global user.name 「Test OSS」 git config --global user.email oss.lzu.edu.cn@gmail.com
固然你也能夠不用--global選項,但這意味這你在每個倉庫中都要這樣設置。
同時,你也能夠指定你的編輯器,你的Diff工具:
git config --global core.editor vim git config --global merge.tool vimdiff
你還能夠經過」git config --list」命令來查看你的設置。
當你把Git設置好以後,若是你要和從Git服務器上得到倉庫,或者向Git服務器提交你的代碼(好比github),你可能須要生成你本身的ssh密鑰對。Git支持4種與服務器端通訊的協議:git、http、ssh和https。其中git只是一個只讀協議,也就是說你只能夠從服務器端獲取倉庫,可是你不能提交你本身的代碼。而http和https用的不多,大部分都只支持ssh協議和Git協議。
當你經過ssh協議與遠端服務器進行通訊的時候,你能夠經過如下命令生成ssh密鑰對:
ssh-keygen -t rsa
若是你沒有指定密鑰名稱和存放路徑的話,它默認把兩個不對稱密鑰放在你的家目錄下的.ssh目錄下,密鑰文件默認名稱爲id_rsa和id_rsa.pub,前者是私鑰,後者是公鑰。中間可能會要你設定訪問密鑰密碼,這個能夠設,能夠不設,但爲了安全考慮,仍是建議你設一個訪問密碼。不然,意味着任何持有你密鑰的人均可以使用該密鑰。
而後把你的公鑰發給Git倉庫管理員,而後你就能夠經過ssh協議來訪問服務器端,期間程序會自動進行密鑰對匹配,若是你設了訪問密碼,你可能須要輸入密碼。
更多關於ssh的內容,請訪問這裏:http://www.freebsd.org/doc/zh_CN/books/handbook/openssh.html
這些設定完以後,你能夠經過得到任何一個公開的代碼倉庫來檢測你的git是否工做正常。好比下面這個:
git clone git://git2.kernel.org/pub/scm/git/git.git
四、GIT倉庫
Git作爲一個資源管理和跟蹤系統,若是想要把本身的文件託管在Git上,那麼首先你得讓Git知道你須要管理的文件在哪。好比說如今我有一個項目,它在test文件夾裏,我想讓Git管理這個項目,這個時候你需進入到這個目錄,而後運行「git init」命令。這個時候Git就會在該目錄下生成一個.git的隱藏目錄,Git用來進行版本控制和內容跟蹤的全部文件都在該文件夾下。
處於git跟蹤下的文件只具備三種狀態:
Modified(working directory):被修改過的文件
Staged(staging area):經過git add添加到暫存區域的文件
Committed(git directory):經過git commit提交到倉庫的文件
因此,通常的git工做流程多是這樣:修改過某些文件,而後把這些文件添加都暫緩區,再提交到倉庫中造成一個版本或快照,最後提交到git服務器上。而在中間,可能伴隨着分支管理,分支切換,撤消與合併。
可能有些人會以爲很奇怪,爲何git會有暫存區域這個概念,直接提交到倉庫中不就ok了。其實這是git爲了作版本控制用的,試想若是沒有暫存區域,每修改一個文件,就會造成一個版本,太過頻繁,不易於管理。暫存區域其實就是下一個版本的文件清單,你能夠自由控制該往倉庫中提交什麼文件,這也能夠避免在一個版本中包含一些中間文件,好比編譯後的文件。
五、GIT基本流程
1.初始化倉庫
初始化倉庫有兩種狀況,一種是直接在一個空目錄裏創建一個項目,這時候你能夠這樣幹:
git init
另外一種是從其餘機器複製一個倉庫,好比這樣:
git clone git://git2.kernel.org/pub/scm/git/git.git (遠程倉庫) git clone https://github.com/jquery/jquery.git (遠程倉庫) git clone git@github.com:wengpingbo/MicroBlog.git (遠程倉庫) git clone /home/oss/test.git (本地倉庫)
第一次從服務器上覆制一個倉庫,可能比較慢,由於git要把全部的歷史記錄和版本所有複製下來,這也算git的一個弊端吧!
複製完後,就會在當前目錄下生成一個工做目錄,名字以倉庫名字命名。若是你不想指定目錄,那就在上面的命令後加一個目錄就ok了。好比我想把test倉庫放到oss倉庫中:git clone /home/oss/test.git oss
以後,你就能夠開始你的工做啦!
2.添加文件
在編輯了幾個文檔以後,你可能忽然想起來,好像文件尚未讓git跟蹤。Git並不會實時的跟蹤你的文件,只在你明確讓它記錄你的文件時,它纔會把指定的文件的當前狀態記錄到倉庫中去,而後又撒手無論了。我想這就是說git笨的緣由吧。這個時候,你須要手動添加你的文件當暫存區域:
git add filename1 filename2
若是你懶得一個一個加,你能夠試試這個:
git add -A
它會把當前目錄下全部的文件都添加到暫存區域。
3.添加一個版本
在添加完文件後,你可能以爲應該建立一個commit了。
git commit
怎麼樣?是否是有點不對勁,好像這個命令並無按你想象的那樣跳出一個提交成功的提示,而是直接跑到了你在配置中指定的編輯器中了。仔細看一下,原來是讓你給這個版本作一些備註,隨便寫點什麼,而後保存退出就ok了。若是你不想這麼麻煩,能夠這麼幹:
git commit -m ‘initial version’
可能你以爲以前講的太羅嗦了,提交一個commit還這麼麻煩,其實有一個捷徑可使你跳過添加文件這個過程:
git commit -a -m ‘initial version’
大功告成,這個命令會把以前全部的已經添加的文件都加入到這個版本中。
可能你又有疑問了,以前添加的文件不是自動會加入到下一個版本中嗎,問什麼還加這個-a參數?
其實git add命令只是把指定文件的當前狀態添加到暫存區域,並不表明一個文件一旦添加,就會一直存在每一個版本中。若是你添加一個文件後對這個又進行了修改,在你commit時候,只會commit這個文件添加時的狀態,不會把以後的修改也commit進去,除非你再次添加。
4.推送變動
在你commit完以後,你可能想把本身的代碼提交到github或者其餘git服務器上,與他人交流共享,這時候就須要和遠程服務器打交道了。
若是你是在本地創建起的倉庫,默認狀況下是沒有任何服務器地址的,若是你是從其餘服務器複製過來的倉庫,這個服務器地址會自動添加到你的倉庫中,你能夠這樣查看:
git remote -v
若是隻輸入」git remote」,就只會列出服務器端的別名,不會列出地址來。
一個倉庫能夠有多個服務器地址,這就意味着,你能夠從不一樣的人手中複製同一個倉庫,但這並不會打亂你本身的分支,哪怕雙方的分支名字都同樣。假如你如今在和另外兩我的作同一個項目中的同一個分支,你發現A的一個模塊正是你想要的,你想把他的代碼合併到你如今的版本中,這時候你能夠這樣作:
git remote add code_a git://url/test.git //添加對方的地址,code_a是別名 git fetch code_a //複製對方的倉庫到本地,但不合並,git pull會自動合併 git merge code_a/master //把對方master分支合併到本身當前版本下
合併完以後,你可能想提交你的代碼到其餘的服務器上,這時候你能夠先把要提交的服務器地址添加進來,而後這樣作:
git push origin master
上面的命令就是把本身master的分支提交到名字爲origin的服務器上
5.建立並管理分支
在作項目的時候,你可能會想寫一些擴展性的功能,或者作一些小實驗,可是你又不想影響你如今的項目。這時候,你能夠建立一個分支,而後在這個分支裏 寫東西,當以爲很差的時候,你能夠把這個分支刪除掉,對你以前的主分支沒有任何影響。或者你以爲這個新特性超出了本身的預想,能夠合併到主分支裏,這時候 你只要把工做轉回主分支,而後合併分支,最後刪除分支,而後就跟那個分支沒建立同樣。具體操做以下:
git branch test //建立一個test分支 git checkout test //轉到test分支 edit something...commit something... git checkout master //轉到master分支 git merge test //合併test分支 git checkout -b test2 //建立test2分支,並轉到test2分支 git branch -d test //刪除test分支 git branch //列出分支列表 git branch -v //列出分支列表和當前commit
Git merge的實質是把兩個版本合在一塊兒,而後在當前分支建立一個新的commit,若是你在兩個分支的同一個文件的同一個地方都作了修改,這時候merge就會失敗,git就不會自動建立一個新的commit,而是直接停住。你須要手動修改這些衝突的文件,選擇這兩個分支中的一個版本,或者本身重寫這個部分,而後手動添加這些文件到暫存區域,再commit一下就ok了。要查看哪些文件衝突了,能夠用」git status」查看。
6.撤消改動
是人就會犯錯。當你執行某個命令以後,忽然發現,本身寫錯了,或者漏了一個文件,這時候怎麼辦?
若是你提交得太早,忘了添加某些文件,你能夠這樣作:
git commit -m ‘add something ’ git add file1 git commit --amend
最後一個命令會把你當前暫存區域最爲上一次的commit。若是你commit之後,立刻amend,這時候git會直接跳到編輯commit備註裏面,這樣你能夠修改你上次commit的備註。
若是你添加了不應添加的文件,你能夠這樣挽回:
git add . //把全部的文件都添加進去 git reset HEAD readme //把readme文件從暫存區域去除
若是你發現你編輯錯了一個文件,你想把它恢復到上一個版本的狀態,這時候你能夠這樣:
git checkout -- filename1 // 只撤消這一個文件
若是你以爲這個版本糟糕透了,想徹底回滾到上一個版本,你能夠幹以下事情:
git reset --hard HEAD^
HEAD是指向當前版本,^指當前版本的父版本,這個操做沒法撤消。你能夠把--hard換成--soft,這隻會回退commit信息。還有一個--mixed默認選項,你們能夠參考官方文檔,查看這3個選項的具體區別。
六、GIT經常使用命令
Git add Git clone Git commit Git push Git checkout Git reset Git pull Git status Git branch //advanced Git tag Git log Git merge
七、學習GIT相關資料
《pro git》 :http://git-scm.com/book/zh 《git magic》 :http://www.csc.kth.se/utbildning/kth/kurser/DD2385/material/gitmagic.pdf Git manual :http://git-scm.com/docs