git的基本介紹和使用
前言:從事iOS開發一年多以來,一直使用svn管理源代碼。對svn的特點和弊端已經深有體會。前些天雙十二前后,項目工期緊張到爆,起早貪黑的加班,可謂披星戴月,這還不止,回到家中還要瘋狂的敲代碼。那么問題來了,公司svn服務器是內網服務器,在家里無法訪問,提交/更新代碼就成了問題。跟技術總監(筆者公司為初創型小公司,直接和技術總監對話)溝通后,技術總監同意了把svn服務器改為外網服務器。但是,這并不是好的解決辦法,畢竟svn服務器掛到外網上,從安全性上總是說不過去。于是乎,git成了我心中取代svn的上上策。昨天上班開會就跟CTO提出使用git管理代碼的建議,他也愉快的答應了。
但是,多數人對git并沒有像對svn這般了解,所以,針對于git和svn的特點和區別,我希望能夠通過這篇文章撥開大家心中的疑惑。
簡介
git是一款開源的分布式版本管理工具,git的誕生也是相當傳奇的,由Linux之父-Linus Benedict Torvalds開發而來,當初Linus Benedict Torvalds僅僅是為了輔助Linux內核的開發才一并開發了這個至今為止世界上最快的、最簡單的版本管理工具。關于這個傳奇的故事,筆者就不在此贅述。
目前,git雖然很流行,但也僅僅是在國外。在國內,多數公司還在使用svn進行版本控制,不過不用擔心,據筆者所知,已經有很多大公司(像BAT這樣的互聯網公司)開始由svn轉向git。并且,越來越多的開源項目已經轉移到git,很多開源網站上的代碼就是git來管理的,所以git取代svn是大勢所趨的。
git的特點
前面已經說過,git是一款開源的分布式版本管理工具。相對于分布式,還有一種集中式,集中式版本管理工具的杰出代表就是svn。關于svn的詳細介紹,讀者可以查看筆者之前寫過的幾篇文章:http://www.cnblogs.com/wsnb/p/4765597.html http://www.cnblogs.com/wsnb/p/4771379.html
如下兩張圖,可以概括分布式和集中式管理工具的架構,圖(1)為分布式版本管理工具架構,圖(2)為集中式管理工具架構。
圖(1)
圖(2)
這里筆者想象出來一個比較容易理解的例子,可以概括出分布式和集中式的區別:像BAT這樣的大公司,員工層級架構比較復雜,每個技術部門都設有技術負責人(CTO),而每個部門內部又根據分工設有技術經理、主管、組長等等,一般情況下,員工只需要向自己的直屬上級匯報工作即可,這樣工作起來,效率比較高。而像筆者這樣的初創型小公司,部門內部角色就沒有那么復雜了,技術部門每個員工都可以向CTO直接反應問題,CTO要處理來自N個技術人員反應的問題,效率比較低。BAT這樣的大公司的員工各層級架構就像是分布式一樣,而后者就像是集中式一樣。
從圖(2)可以看出,集中式管理系統的代碼統一的由一臺服務器集中管理。其他系統如果想得到代碼,必須從這一臺服務器上拷貝。同樣,其他系統想要提交代碼,也只能向這臺服務器提交。這臺服務器起到了一個集中管理所有代碼的作用,當然如果svn服務器出現故障,那么后果不開設想。
從圖(1)可以看出,分布式管理系統的代碼可以由自己本地服務器來管理。因為每個系統本地都有一個本地代碼倉庫(相當于遠程代碼倉庫在本地的備份),本地系統可以先把代碼提交到本地代碼倉庫,然后再由本地代碼倉庫提交到共享版本庫(在這里,共享版本庫相當于集中式管理系統的遠程代碼倉庫)這樣在本地系統和共享版本庫之間添加了一層本地代碼倉庫,開發人員直接和本地代碼倉庫打交道,減輕了對共享版本庫的壓力,并且也降低了開發人員因為誤操作而導致對遠程代碼倉庫的污染。
正是因為二者的這個差別,通過分布式,我們可以在沒有網絡的情況下,先把代碼提交到本地代碼倉庫,速度之快不言而喻,待到有網絡時再提交到共享版本庫。而如果通過集中式,我們不能夠在沒有網絡的情況下把代碼提交到遠程代碼倉庫,即便是有網絡,頻繁的傳輸對svn的壓力比較大,并且每次傳輸都要受限于網絡速度。
git工作原理
git的工作原理還是比較簡單的,當我們創建了本地代碼倉庫后,會在本地代碼倉庫的根目錄中生成一個.git的隱藏文件。.git為一個文件目錄,又叫做版本庫。在本地代碼倉庫文件夾中,除.git目錄之外的所有與.git同級的目錄及其子目錄都叫做工作區。
工作區(Working Directory):倉庫文件夾里除.git目錄以外的內容 版本庫(Repository):.git目錄,用于存儲記錄版本信息 暫緩區(stage) 分支(master):git自動創建的第一個分支 HEAD指針:用于指向當前分支
git add和git commit的原理 git add :把文件修改或者新添加的文件添加到暫存區 git commit :把暫存區的所有內容提交到當前分支
下面一幅神圖就可以解釋git add 和 git commit的原理:
我們修改或者新添加的文件起初是處于工作區,通過git add命令可以把工作區的文件移動到版本庫中的暫緩區(stage)。
處在暫緩區(stage)的代碼可以通過git commit -m “提交的注釋” 提交到版本庫中的分支(master)。
處在分支(master)中的代碼可以通過git push命令push到共享版本庫。
注意:只有分支中的文件才可以push到共享版本庫。
git常用命令
1.初始化一個代碼倉庫 git init 2.如果使用git必須給git配置一個用戶名和郵箱 給當前的git倉庫配置一個用戶名和郵箱 git config user.name “ws” git config user.email “ws@163.com” 配置一個全局的用戶名和郵箱 git config --global user.name “ws” git config --global user.email “ws@163.com” 3.初始化項目 touch main.m : 創建了main.m git add main.m : 將新添加的文件或者修改的文件添加到暫存區 git commit -m “初始化項目” git add . : 將所有沒有被添加到暫存區或者代碼倉庫的文件添加到暫存區 注意:無論是新添加的文件或者修改的文件,都需要先通過add命令添加到暫存區中,之后再通過commit命令添加到本地倉庫中 4.查看文件的狀態 git status 紅色 : 新創建的文件或者被修改的文件,沒有被添加到暫存區 綠色 : 表示文件在暫存區,但是沒有被添加到本地倉庫中 5.給命令起別名 git config alias.st “status” git config alias.ci “commit -m” git config --global alias.st “status” 6.git刪除文件 git rm 文件名 7.查看版本號 git log git reflog git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit” git lg 8.git的版本號是由sha1算法生成40位的哈希值 9.版本回退 git reset --hard HEAD : 回退到當前的版本 git reset --hard HEAD^ : 回退到上一個版本 git reset --hard HEAD^^ : 回退到上上個版本 git reset --hard HEAD~100 : 回退到前100版本 git reset --hard 版本號(前5位)
初始化共享版本庫
真實的git服務器的搭建是非常繁瑣且復雜的,并且git服務器只能搭建在Linux系統上。筆者對git服務器的搭建不做介紹,日后有時間再加以補充。在此僅對共享版本庫的搭建進行詳細介紹。
文件夾作為共享版本庫
1.創建共享版本庫文件夾,然后終端進入該文件夾下執行以下命令創建一個空的共享版本庫 git init --bare 2.項目經理將共享版本庫的內容先下載下來,命令后面的地址即為共享版本庫所在服務器的地址+路徑 git clone 地址 3.添加需要忽略的文件 touch .gitignore 去github上搜索.gitignore->Objective-C,把Objective-C中的內容粘貼到創建的.gitignore文件中(或者直接把github中的Objective-C文件下載到該目錄下)。然后執行以下命令 git add .gitignore git commit -m “添加了需要忽略的文件” 4.項目經理初始化項目 git commit -m “初始化項目”—>提交到本地代碼倉庫 5.將項目push遠程倉庫中 git push origin 6.當源代碼管理是使用git,并且在Xcode進行多人開發的操作 注意:當使用git,項目中用到了靜態庫就不需要通過命令行進行添加
git版本備份
1.1.0版本開發完成,之后對1.0版本進行備份 git tag -a weibo1.0 -m “這個是1.0版本” : 給某一個版本打上標簽(weibo1.0是標簽名稱) git tag : 查看所有的標簽 2.需要將1.0版本的標簽,push到服務器 git push origin weibo1.0 3.繼續開發2.0版本 4.發現1.0版本有bug,從標簽里面clone 1.0版本,從標簽創建一個fixbug分支,在分支中修復bug git clone 共享版本庫 git checkout weibo1.0(標簽的名稱) git checkout -b weibo1.1fixbug(分支名稱) 5.修復后的版本上傳AppStore/將1.0fixbug進行備份/將1.0fixbug版本和2.0版本進行合并\ git tag -a weibo1.1 -m “這個是修復了1.0版本bug的1.1版本” git tag git push origin weibo1.1 將子分支中代碼合并到主分支,pull—>weibo1.1fixbug—>push master—>其它同事更新 6.刪除分支 git branch -r(r是遠程倉庫的意思,這個命令可以查看遠程倉庫中的分支) git branch -r -d 分支名稱
以上主要介紹了git的原理和如何用命令創建一個代碼倉庫,關于如何使用第三方git服務器托管代碼,請見下一篇文章。