簡介
git是一款開源的分佈式版本管理工具,git的誕生也是至關傳奇的,由Linux之父-Linus Benedict Torvalds開發而來,當初Linus Benedict Torvalds僅僅是爲了輔助Linux內核的開發才一併開發了這個至今爲止世界上最快的、最簡單的版本管理工具。關於這個傳奇的故事,筆者就不在此贅述。git
目前,git雖然很流行,但也僅僅是在國外。在國內,多數公司還在使用svn進行版本控制,不過不用擔憂,據筆者所知,已經有不少大公司(像BAT這樣的互聯網公司)開始由svn轉向git。而且,愈來愈多的開源項目已經轉移到git,不少開源網站上的代碼就是git來管理的,因此git取代svn是大勢所趨的。github
能夠歸納出分佈式和集中式的區別:像BAT這樣的大公司,員工層級架構比較複雜,每一個技術部門都設有技術負責人(CTO),而每一個部門內部又根據分工設有技術經理、主管、組長等等,通常狀況下,員工只須要向本身的直屬上級彙報工做便可,這樣工做起來,效率比較高。而像筆者這樣的初創型小公司,部門內部角色就沒有那麼複雜了,技術部門每一個員工均可以向CTO直接反應問題,CTO要處理來自N個技術人員反應的問題,效率比較低。BAT這樣的大公司的員工各層級架構就像是分佈式同樣,然後者就像是集中式同樣。算法
從圖(2)能夠看出,集中式管理系統的代碼統一的由一臺服務器集中管理。其餘系統若是想獲得代碼,必須從這一臺服務器上拷貝。一樣,其餘系統想要提交代碼,也只能向這臺服務器提交。這臺服務器起到了一個集中管理全部代碼的做用,固然若是svn服務器出現故障,那麼後果不開設想。服務器
從圖(1)能夠看出,分佈式管理系統的代碼能夠由本身本地服務器來管理。由於每一個系統本地都有一個本地代碼倉庫(至關於遠程代碼倉庫在本地的備份),本地系統能夠先把代碼提交到本地代碼倉庫,而後再由本地代碼倉庫提交到共享版本庫(在這裏,共享版本庫至關於集中式管理系統的遠程代碼倉庫)這樣在本地系統和共享版本庫之間添加了一層本地代碼倉庫,開發人員直接和本地代碼倉庫打交道,減輕了對共享版本庫的壓力,而且也下降了開發人員由於誤操做而致使對遠程代碼倉庫的污染。網絡
正是由於兩者的這個差異,經過分佈式,咱們能夠在沒有網絡的狀況下,先把代碼提交到本地代碼倉庫,速度之快不言而喻,待到有網絡時再提交到共享版本庫。而若是經過集中式,咱們不可以在沒有網絡的狀況下把代碼提交到遠程代碼倉庫,即使是有網絡,頻繁的傳輸對svn的壓力比較大,而且每次傳輸都要受限於網絡速度。架構
git工做原理
git的工做原理仍是比較簡單的,當咱們建立了本地代碼倉庫後,會在本地代碼倉庫的根目錄中生成一個.git的隱藏文件。.git爲一個文件目錄,又叫作版本庫。在本地代碼倉庫文件夾中,除.git目錄以外的全部與.git同級的目錄及其子目錄都叫作工做區。分佈式
工做區(Working Directory):倉庫文件夾裏除.git目錄之外的內容svn
版本庫(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.t 「status」
git config aliast 「commit -m」
git config --global alisa.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庫而改變。
每次commit都會用用戶名和郵箱紀錄。
github的contributions統計就是按郵箱來統計的。
查看用戶名和郵箱地址:
$ git config user.email
修改用戶名和郵箱地址:
$ git config --global user.name 「username」
$ git config --global user.email 「email」
每次 Git 提交時都會引用這兩條信息,說明是誰提交了更新,因此會隨更新內容一塊兒被永久歸入歷史記錄.
用了 --global 選項,那麼更改的配置文件就是位於你用戶主目錄下的那個,之後你全部的項目都會默認使用這裏配置的用戶信息。
初始化共享版本庫
真實的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.03.繼續開發2.0版本4.發現1.0版本有bug,從標籤裏面clone 1.0版本,從標籤建立一個fixbug分支,在分支中修復buggit 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 taggit push origin weibo1.1將子分支中代碼合併到主分支,pull—>weibo1.1fixbug—>push master—>其它同事更新6.刪除分支git branch -r(r是遠程倉庫的意思,這個命令能夠查看遠程倉庫中的分支)git branch -r -d 分支名稱