廖老師的教程不錯:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
GIT安裝與配置
a) 安裝
1.從源碼安裝
在安裝之前袄膏,你必須保證以下幾個依賴包已經(jīng)安裝在你的系統(tǒng)上:curl, zlib, openssl, expat, libiconv庐杨。如果你的系統(tǒng)是Ubuntu灌闺,你可以這樣安裝:
apt-get install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
當(dāng)所有的依賴項已經(jīng)解決像捶,就可以從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上安裝
如果你的系統(tǒng)是Linux或者Fedora阶捆,你可以通過以下命令直接安裝Git:
yum install git-core (fedora)
apt-get install git-core (ubuntu)
3.在Windows上安裝
盡管Git是發(fā)源于Linux,但現(xiàn)在Windows上也有能夠正常使用Git钦听,只不過不支持中文洒试,在Windows下所有的中文都顯示問號,另外還有一些功能上的BUG朴上。所以建議還是在Linux上去使用Git垒棋,如果你不得不工作在Windows上,你可以到http://msysgit.github.com/上下載msysgit的最新版痪宰,安裝過程和其他Windows程序差不多叼架,基本上點下一步就OK了畔裕。Msysgit默認(rèn)會安裝git bash和git GUI這兩個程序,一般用git bash就可以了乖订,它支持常用的命令扮饶。如果對Linux命令行不熟,你也可以用用git GUI乍构,但功能有限制甜无。
b) 第一次使用GIT
在你安裝好Git之后,你需要修改一些配置哥遮,才能正常使用Git岂丘。
Git通過“git config”命令來配置Git,這個命令有2個選項:--system, --global, 加上默認(rèn)選項眠饮,分別對應(yīng)Git上3級配置文件元潘。第一個是/etc/gitconfig文件,和--system對應(yīng)君仆,這是全局配置文件,修改這個文件牲距,將會影響系統(tǒng)上所有的用戶返咱,所有的倉庫。第二個是你家目錄下的/.gitconfig文件牍鞠,與--global對應(yīng)咖摹,修改它會對你當(dāng)前用戶的所有倉庫產(chǎn)生影響。第三個是你倉庫中的.git/.gitconfig文件难述,這是“git config”默認(rèn)修改的配置文件萤晴,它只會對你當(dāng)前倉庫產(chǎn)生影響。
在第一次使用Git時胁后,你需要告訴你的協(xié)同開發(fā)者店读,你是誰以及你的郵箱,在你提交的時候攀芯,Git需要這兩個信息屯断。具體通過以下命令設(shè)置:
git config --global user.name “Test OSS”
git config --global user.email oss.lzu.edu.cn@gmail.com
當(dāng)然你也可以不用--global選項,但這意味這你在每一個倉庫中都要這樣設(shè)置侣诺。
同時殖演,你也可以指定你的編輯器,你的Diff工具:
git config --global core.editor vim
git config --global merge.tool vimdiff
你還可以通過”git config --list”命令來查看你的設(shè)置年鸳。
當(dāng)你把Git設(shè)置好之后趴久,如果你要和從Git服務(wù)器上獲得倉庫,或者向Git服務(wù)器提交你的代碼(比如github)搔确,你可能需要生成你自己的ssh密鑰對彼棍。Git支持4種與服務(wù)器端通信的協(xié)議:git灭忠、http、ssh和https滥酥。其中g(shù)it只是一個只讀協(xié)議更舞,也就是說你只可以從服務(wù)器端獲取倉庫,但是你不能提交你自己的代碼坎吻。而http和https用的很少缆蝉,大部分都只支持ssh協(xié)議和Git協(xié)議。
當(dāng)你通過ssh協(xié)議與遠(yuǎn)端服務(wù)器進行通信的時候瘦真,你可以通過以下命令生成ssh密鑰對:
ssh-keygen -t rsa
如果你沒有指定密鑰名稱和存放路徑的話刊头,它默認(rèn)把兩個不對稱密鑰放在你的家目錄下的.ssh目錄下,密鑰文件默認(rèn)名稱為id_rsa和id_rsa.pub诸尽,前者是私鑰原杂,后者是公鑰。中間可能會要你設(shè)定訪問密鑰密碼您机,這個可以設(shè)穿肄,可以不設(shè),但為了安全考慮际看,還是建議你設(shè)一個訪問密碼咸产。否則,意味著任何持有你密鑰的人都可以使用該密鑰仲闽。
然后把你的公鑰發(fā)給Git倉庫管理員脑溢,然后你就可以通過ssh協(xié)議來訪問服務(wù)器端,期間程序會自動進行密鑰對匹配赖欣,如果你設(shè)了訪問密碼屑彻,你可能需要輸入密碼。
更多關(guān)于ssh的內(nèi)容顶吮,請訪問這里:http://www.freebsd.org/doc/zh_CN/books/handbook/openssh.html
這些設(shè)定完之后社牲,你可以通過獲得任何一個公開的代碼倉庫來檢測你的git是否工作正常。比如下面這個:
git clone git://git2.kernel.org/pub/scm/git/git.git
4云矫、GIT倉庫
Git做為一個資源管理和跟蹤系統(tǒng)膳沽,如果想要把自己的文件托管在Git上,那么首先你得讓Git知道你需要管理的文件在哪让禀。比如說現(xiàn)在我有一個項目挑社,它在test文件夾里,我想讓Git管理這個項目巡揍,這個時候你需進入到這個目錄痛阻,然后運行“git init”命令。這個時候Git就會在該目錄下生成一個.git的隱藏目錄腮敌,Git用來進行版本控制和內(nèi)容跟蹤的所有文件都在該文件夾下阱当。
處于git跟蹤下的文件只具有三種狀態(tài):
Modified(working directory):被修改過的文件
Staged(staging area):通過git add添加到暫存區(qū)域的文件
Committed(git directory):通過git commit提交到倉庫的文件
所以俏扩,一般的git工作流程可能是這樣:修改過某些文件,然后把這些文件添加都暫緩區(qū)弊添,再提交到倉庫中形成一個版本或快照录淡,最后提交到git服務(wù)器上。而在中間油坝,可能伴隨著分支管理嫉戚,分支切換,撤消與合并澈圈。
可能有些人會覺得很奇怪彬檀,為什么git會有暫存區(qū)域這個概念,直接提交到倉庫中不就ok了瞬女。其實這是git為了做版本控制用的窍帝,試想如果沒有暫存區(qū)域,每修改一個文件诽偷,就會形成一個版本坤学,太過頻繁,不易于管理报慕。暫存區(qū)域其實就是下一個版本的文件清單拥峦,你可以自由控制該往倉庫中提交什么文件,這也可以避免在一個版本中包含一些中間文件卖子,比如編譯后的文件。
5刑峡、GIT基本流程
1.初始化倉庫
初始化倉庫有兩種情況洋闽,一種是直接在一個空目錄里建立一個項目,這時候你可以這樣干:
git init
另一種是從其他機器復(fù)制一個倉庫突梦,比如這樣:
git clone git://git2.kernel.org/pub/scm/git/git.git (遠(yuǎn)程倉庫)
git clone https://github.com/jquery/jquery.git (遠(yuǎn)程倉庫)
git clone git@github.com:wengpingbo/MicroBlog.git (遠(yuǎn)程倉庫)
git clone /home/oss/test.git (本地倉庫)
第一次從服務(wù)器上復(fù)制一個倉庫诫舅,可能比較慢,因為git要把所有的歷史記錄和版本全部復(fù)制下來宫患,這也算git的一個弊端吧刊懈!
復(fù)制完后,就會在當(dāng)前目錄下生成一個工作目錄娃闲,名字以倉庫名字命名虚汛。如果你不想指定目錄,那就在上面的命令后加一個目錄就ok了皇帮。比如我想把test倉庫放到oss倉庫中:git clone /home/oss/test.git oss
之后卷哩,你就可以開始你的工作啦!
2.添加文件
在編輯了幾個文檔之后属拾,你可能突然想起來将谊,好像文件還沒有讓git跟蹤冷溶。Git并不會實時的跟蹤你的文件,只在你明確讓它記錄你的文件時尊浓,它才會把指定的文件的當(dāng)前狀態(tài)記錄到倉庫中去逞频,然后又撒手不管了。我想這就是說git笨的原因吧栋齿。這個時候苗胀,你需要手動添加你的文件當(dāng)暫存區(qū)域:
git add filename1 filename2
如果你懶得一個一個加,你可以試試這個:
git add -A
它會把當(dāng)前目錄下所有的文件都添加到暫存區(qū)域褒颈。
3.添加一個版本
在添加完文件后柒巫,你可能覺得應(yīng)該創(chuàng)建一個commit了。
git commit
怎么樣谷丸?是不是有點不對勁堡掏,好像這個命令并沒有按你想象的那樣跳出一個提交成功的提示,而是直接跑到了你在配置中指定的編輯器中了刨疼。仔細(xì)看一下泉唁,原來是讓你給這個版本做一些備注,隨便寫點什么揩慕,然后保存退出就ok了亭畜。如果你不想這么麻煩璃俗,可以這么干:
git commit -m ‘initial version’
可能你覺得之前講的太羅嗦了笨篷,提交一個commit還這么麻煩顶霞,其實有一個捷徑可以使你跳過添加文件這個過程:
git commit -a -m ‘initial version’
大功告成牲尺,這個命令會把之前所有的已經(jīng)添加的文件都加入到這個版本中攒盈。
可能你又有疑問了咒精,之前添加的文件不是自動會加入到下一個版本中嗎锌钮,問什么還加這個-a參數(shù)陨闹?
其實git add命令只是把指定文件的當(dāng)前狀態(tài)添加到暫存區(qū)域樟凄,并不代表一個文件一旦添加聘芜,就會一直存在每個版本中。如果你添加一個文件后對這個又進行了修改缝龄,在你commit時候汰现,只會commit這個文件添加時的狀態(tài),不會把之后的修改也commit進去叔壤,除非你再次添加瞎饲。
4.推送變更
在你commit完之后,你可能想把自己的代碼提交到github或者其他git服務(wù)器上炼绘,與他人交流共享企软,這時候就需要和遠(yuǎn)程服務(wù)器打交道了。
如果你是在本地建立起的倉庫饭望,默認(rèn)情況下是沒有任何服務(wù)器地址的仗哨,如果你是從其他服務(wù)器復(fù)制過來的倉庫形庭,這個服務(wù)器地址會自動添加到你的倉庫中,你可以這樣查看:
git remote -v
如果只輸入”git remote”厌漂,就只會列出服務(wù)器端的別名萨醒,不會列出地址來。
一個倉庫可以有多個服務(wù)器地址苇倡,這就意味著富纸,你可以從不同的人手中復(fù)制同一個倉庫,但這并不會打亂你自己的分支旨椒,哪怕雙方的分支名字都一樣晓褪。假如你現(xiàn)在在和另外兩個人做同一個項目中的同一個分支,你發(fā)現(xiàn)A的一個模塊正是你想要的综慎,你想把他的代碼合并到你現(xiàn)在的版本中涣仿,這時候你可以這樣做:
git remote add code_a git://url/test.git //添加對方的地址,code_a是別名
git fetch code_a //復(fù)制對方的倉庫到本地,但不合并示惊,git pull會自動合并
git merge code_a/master //把對方master分支合并到自己當(dāng)前版本下
合并完之后好港,你可能想提交你的代碼到其他的服務(wù)器上,這時候你可以先把要提交的服務(wù)器地址添加進來米罚,然后這樣做:
git push origin master
上面的命令就是把自己master的分支提交到名字為origin的服務(wù)器上
5.創(chuàng)建并管理分支
在做項目的時候钧汹,你可能會想寫一些擴展性的功能,或者做一些小實驗录择,但是你又不想影響你現(xiàn)在的項目拔莱。這時候,你可以創(chuàng)建一個分支隘竭,然后在這個分支里寫東西辨宠,當(dāng)覺得不好的時候,你可以把這個分支刪除掉货裹,對你之前的主分支沒有任何影響【ィ或者你覺得這個新特性超出了自己的預(yù)想弧圆,可以合并到主分支里,這時候你只要把工作轉(zhuǎn)回主分支笔咽,然后合并分支搔预,最后刪除分支,然后就跟那個分支沒創(chuàng)建一樣叶组。具體操作如下:
git branch test //創(chuàng)建一個test分支
git checkout test //轉(zhuǎn)到test分支
edit something...commit something...
git checkout master //轉(zhuǎn)到master分支
git merge test //合并test分支
git checkout -b test2 //創(chuàng)建test2分支拯田,并轉(zhuǎn)到test2分支
git branch -d test //刪除test分支
git branch //列出分支列表
git branch -v //列出分支列表和當(dāng)前commit
Git merge的實質(zhì)是把兩個版本合在一起,然后在當(dāng)前分支創(chuàng)建一個新的commit甩十,如果你在兩個分支的同一個文件的同一個地方都做了修改船庇,這時候merge就會失敗吭产,git就不會自動創(chuàng)建一個新的commit,而是直接停住鸭轮。你需要手動修改這些沖突的文件臣淤,選擇這兩個分支中的一個版本,或者自己重寫這個部分窃爷,然后手動添加這些文件到暫存區(qū)域邑蒋,再commit一下就ok了。要查看哪些文件沖突了按厘,可以用”git status”查看医吊。
6.撤消改動
是人就會犯錯。當(dāng)你執(zhí)行某個命令之后逮京,突然發(fā)現(xiàn)卿堂,自己寫錯了,或者漏了一個文件造虏,這時候怎么辦御吞?
如果你提交得太早,忘了添加某些文件漓藕,你可以這樣做:
git commit -m ‘a(chǎn)dd something ’
git add file1
git commit --amend
最后一個命令會把你當(dāng)前暫存區(qū)域最為上一次的commit陶珠。如果你commit以后,馬上amend享钞,這時候git會直接跳到編輯commit備注里面揍诽,這樣你可以修改你上次commit的備注。
如果你添加了不該添加的文件栗竖,你可以這樣挽回:
git add . //把所有的文件都添加進去
git reset HEAD readme //把readme文件從暫存區(qū)域去除
如果你發(fā)現(xiàn)你編輯錯了一個文件暑脆,你想把它恢復(fù)到上一個版本的狀態(tài),這時候你可以這樣:
git checkout -- filename1 //只撤消這一個文件
如果你覺得這個版本糟糕透了狐肢,想完全回滾到上一個版本添吗,你可以干如下事情:
git reset --hard HEAD^
HEAD是指向當(dāng)前版本,^指當(dāng)前版本的父版本份名,這個操作無法撤消碟联。你可以把--hard換成--soft,這只會回退commit信息僵腺。還有一個--mixed默認(rèn)選項鲤孵,大家可以參考官方文檔,查看這3個選項的具體區(qū)別辰如。
6普监、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
7、學(xué)習(xí)GIT相關(guān)資料
《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