git的基本介紹和使用

jopen 8年前發布 | 39K 次閱讀 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服務器托管代碼,請見下一篇文章。

來自: http://www.cnblogs.com/wsnb/p/5099304.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!