git 是什么?
git 是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)。
git與SVN的主要區(qū)別
Git是分布式版本控制系統(tǒng),那么它就沒有中央服務(wù)器的墅茉,每個(gè)人的電腦就是一個(gè)完整的版本庫,這樣,工作的時(shí)候就不需要聯(lián)網(wǎng)了觅玻,因?yàn)榘姹径际窃谧约旱碾娔X上想际。既然每個(gè)人的電腦都有一個(gè)完整的版本庫,那多個(gè)人如何協(xié)作呢溪厘?比如說自己在電腦上改了文件A胡本,其他人也在電腦上改了文件A,這時(shí)畸悬,你們兩之間只需把各自的修改推送給對方侧甫,就可以互相看到對方的修改了√;拢
SVN是集中式版本控制系統(tǒng)披粟,版本庫是集中放在中央服務(wù)器的,而干活的時(shí)候冷冗,用的都是自己的電腦守屉,所以首先要從中央服務(wù)器哪里得到最新的版本,然后干活蒿辙,干完后拇泛,需要把自己做完的活推送到中央服務(wù)器。集中式版本控制系統(tǒng)是必須聯(lián)網(wǎng)才能工作须板,如果在局域網(wǎng)還可以碰镜,帶寬夠大,速度夠快习瑰,如果在互聯(lián)網(wǎng)下绪颖,如果網(wǎng)速慢的話,就納悶了甜奄。
協(xié)議
- SSH協(xié)議
Git 使用的傳輸協(xié)議中最常見的可能就是 SSH 了柠横。我們在使用git時(shí)經(jīng)常看到這個(gè)協(xié)議名字课兄,但我們還是不知道它是什么牍氛?因此增加這段內(nèi)容簡單介紹下。
這是因?yàn)榇蠖鄶?shù)環(huán)境已經(jīng)支持通過 SSH 對服務(wù)器的訪問 — 即便還沒有烟阐,架設(shè)起來也很容易搬俊。SSH 也是唯一一個(gè)同時(shí)支持讀寫操作的網(wǎng)絡(luò)協(xié)議。另外兩個(gè)網(wǎng)絡(luò)協(xié)議(HTTP 和 Git)通常都是只讀的蜒茄,所以雖然二者對大多數(shù)人都可用唉擂,但執(zhí)行寫操作時(shí)還是需要 SSH。SSH 同時(shí)也是一個(gè)驗(yàn)證授權(quán)的網(wǎng)絡(luò)協(xié)議檀葛;而因?yàn)槠淦毡樾酝嫠睿话慵茉O(shè)和使用都很容易。
- 優(yōu)點(diǎn)
使用 SSH 的好處有很多屿聋。首先空扎,如果你想擁有對網(wǎng)絡(luò)倉庫的寫權(quán)限藏鹊,基本上不可能不使用 SSH。其次转锈,SSH 架設(shè)相對比較簡單—SSH 守護(hù)進(jìn)程很常見盘寡,很多網(wǎng)絡(luò)管理員都有一些使用經(jīng)驗(yàn),而且很多操作系統(tǒng)都自帶了它或者相關(guān)的管理工具黑忱。再次宴抚,通過 SSH 進(jìn)行訪問是安全的 — 所有數(shù)據(jù)傳輸都是加密和授權(quán)的。最后甫煞,和 Git 及本地協(xié)議一樣菇曲,SSH 也很高效,會在傳輸之前盡可能壓縮數(shù)據(jù)抚吠。
- 缺點(diǎn)
SSH 的限制在于你不能通過它實(shí)現(xiàn)倉庫的匿名訪問常潮。即使僅為讀取數(shù)據(jù),人們也必須在能通過 SSH 訪問主機(jī)的前提下才能訪問倉庫楷力,這使得 SSH 不利于開源的項(xiàng)目喊式。如果你僅僅在公司網(wǎng)絡(luò)里使用,SSH 可能是你唯一需要使用的協(xié)議萧朝。如果想允許對項(xiàng)目的匿名只讀訪問岔留,那么除了為自己推送而架設(shè) SSH 協(xié)議之外,還需要支持其他協(xié)議以便他人訪問讀取检柬。
- Git 協(xié)議
接下來是 Git 協(xié)議献联。這是一個(gè)包含在 Git 軟件包中的特殊守護(hù)進(jìn)程; 它會監(jiān)聽一個(gè)提供類似于 SSH 服務(wù)的特定端口(9418)何址,而無需任何授權(quán)里逆。打算支持 Git 協(xié)議的倉庫,需要先創(chuàng)建
git-export-daemon-ok
文件—它是協(xié)議進(jìn)程提供倉庫服務(wù)的必要條件—但除此之外該服務(wù)沒有什么安全措施用爪。要么所有人都能克隆 Git 倉庫原押,要么誰也不能。這也意味著該協(xié)議通常不能用來進(jìn)行推送偎血。你可以允許推送操作诸衔;然而由于沒有授權(quán)機(jī)制,一旦允許該操作颇玷,網(wǎng)絡(luò)上任何一個(gè)知道項(xiàng)目 URL 的人將都有推送權(quán)限署隘。不用說,這是十分罕見的情況亚隙。
- 優(yōu)點(diǎn)
Git 協(xié)議是現(xiàn)存最快的傳輸協(xié)議。如果你在提供一個(gè)有很大訪問量的公共項(xiàng)目违崇,或者一個(gè)不需要對讀操作進(jìn)行授權(quán)的龐大項(xiàng)目阿弃,架設(shè)一個(gè) Git 守護(hù)進(jìn)程來供應(yīng)倉庫是個(gè)不錯(cuò)的選擇诊霹。它使用與 SSH 協(xié)議相同的數(shù)據(jù)傳輸機(jī)制,但省去了加密和授權(quán)的開銷渣淳。
- 缺點(diǎn)
Git 協(xié)議消極的一面是缺少授權(quán)機(jī)制脾还。用 Git 協(xié)議作為訪問項(xiàng)目的唯一方法通常是不可取的。一般的做法是入愧,同時(shí)提供 SSH 接口鄙漏,讓幾個(gè)開發(fā)者擁有推送(寫)權(quán)限,其他人通過git://
擁有只讀權(quán)限棺蛛。Git 協(xié)議可能也是最難架設(shè)的協(xié)議怔蚌。它要求有單獨(dú)的守護(hù)進(jìn)程,需要定制旁赊。
GitLab簡單介紹
GitLab 是一個(gè)用于倉庫管理系統(tǒng)的開源項(xiàng)目桦踊。使用Git作為代碼管理工具,并在此基礎(chǔ)上搭建起來的web服務(wù)终畅〖瑁可通過Web界面進(jìn)行訪問公開的或者私人項(xiàng)目。它擁有與Github類似的功能离福,能夠?yàn)g覽源代碼杖狼,管理缺陷和注釋⊙可以管理團(tuán)隊(duì)對倉庫的訪問蝶涩,它非常易于瀏覽提交過的版本并提供一個(gè)文件歷史庫。團(tuán)隊(duì)成員可以利用內(nèi)置的簡單聊天程序(Wall)進(jìn)行交流赠涮。它還提供一個(gè)代碼片段收集功能可以輕松實(shí)現(xiàn)代碼復(fù)用子寓。
git使用
使用
git
前,我們先了解下git
的文件的三種狀態(tài)笋除,這會幫助我們每個(gè)操作的意義斜友。
git
文件狀態(tài)
對于任何一個(gè)文件,在git
內(nèi)都只有三種狀態(tài):
committed
已提交表示該文件已經(jīng)被安全地保存在本地?cái)?shù)據(jù)庫中了垃它。
modified
已修改表示修改了某個(gè)文件鲜屏,但還沒有提交保存。
taged
已暫存表示把已修改的文件放在下次提交時(shí)要保存的清單中国拇。
基本的 Git 工作流程如下:
在工作目錄中修改某些文件洛史。
對修改后的文件進(jìn)行快照,然后保存到暫存區(qū)域酱吝。
提交更新也殖,將保存在暫存區(qū)域的文件快照永久轉(zhuǎn)儲到git
目錄中。
- 1.創(chuàng)建工程
本文以gitlab為倉庫簡單講下git的使用。
登錄gitlab后忆嗜,用New project
配置project己儒,并點(diǎn)擊Create Project
創(chuàng)建一個(gè)工程。
- 權(quán)限等級分三種:
Private 私有的捆毫,只有你自己或者組內(nèi)的成員能訪問
Internal 所有登錄的用戶
Public 公開的闪湾,所有人都可以訪問
- 2.克隆到本地倉庫
創(chuàng)建好工程后,復(fù)制工程SSH鏈接绩卤,用該鏈接clone到本地倉庫中途样。或者先創(chuàng)建本地工程再上傳到遠(yuǎn)程倉庫也是可以的濒憋。
打開終端Terminal何暇,輸入:git clone git@gitlab.com:zhang.wenhai/test.git
,如果顯示以下信息跋炕,則表示Clone成功赖晶,如果提示其他信息,請另查閱資料辐烂,可能是你git配置有異常遏插】鄄荩
- 3.本地創(chuàng)建工程文件
本人是iOS開發(fā)了牛,因此以Xcode工程為例。創(chuàng)建一個(gè)工程到剛才Clone的目錄下辰妙。
- 4.git指令
4.1檢查當(dāng)前文件狀態(tài)
git status
查看目前分支的改動(dòng)鹰祸,該命令還顯示了當(dāng)前所在的分支是 master,這是默認(rèn)的分支名稱密浑,實(shí)際是可以修改的尔破,現(xiàn)在先不用考慮街图。
改動(dòng)的文件在“Untracked files:”
下面,git不會自動(dòng)納入跟蹤范圍懒构,一般情況下我們需要自己主動(dòng)納入范圍絮姆。
4.2跟蹤新文件
提交工程我們先把修改的文件添加到tracked files中。
git add *
添加所有的改動(dòng)
git add test/
只添加“test/”
目錄底下的改動(dòng)
我們需要所有文件的修改,因此使用第一條指令滚朵。如果沒有異常則Terminal中沒有任何提示冤灾,此時(shí)可以用git status
指令看變化。
4.3 現(xiàn)在可以commit了
git commit -m "init project"
提交工程辕近,注釋改動(dòng),以便后續(xù)查閱或者團(tuán)隊(duì)人員看的時(shí)候一目了然知道改動(dòng)是什么匿垄。
-m
參數(shù)后跟提交說明的方式移宅,在一行命令中提交更新。
提交后可以看到椿疗,當(dāng)前的是在哪個(gè)分支(master)提交的漏峰,本次提交的SHA-1校驗(yàn)以及在本次提交中有多少文件修訂、添加届榄、刪除浅乔。
提交時(shí)記錄的是放在暫存區(qū)域的快照铝条,任何還未暫存的仍然保持已修改狀態(tài)靖苇,可以在下次提交時(shí)納入版本管理。每一次運(yùn)行提交操作班缰,都是對你項(xiàng)目作一次快照贤壁,以后可以回到這個(gè)狀態(tài),或者進(jìn)行比較埠忘。
-a
參數(shù)git
就會自動(dòng)把所有已經(jīng)跟蹤過的文件暫存起來一并提交脾拆,從而跳過git add
步驟。
4.4抓取和推送到遠(yuǎn)程倉庫
查看遠(yuǎn)程倉庫信息
git remote show origin
可以查看origin遠(yuǎn)程倉庫的詳細(xì)信息莹妒。
除了對應(yīng)的克隆地址外名船,它還給出了許多額外的信息。它友善地告訴你如果是在 master 分支旨怠,就可以用git pull
命令抓取數(shù)據(jù)合并到本地渠驼。另外還列出了所有處于跟蹤狀態(tài)中的遠(yuǎn)端分支它會告訴你,git push
時(shí)缺省推送分支是master
运吓。
抓取遠(yuǎn)程倉庫
git pull
抓取數(shù)據(jù)合并到本地渴邦。
推送到遠(yuǎn)程倉庫
本地master分支推送到origin服務(wù)器上可以運(yùn)行下面命令。
git push origin master
,將改動(dòng)推到遠(yuǎn)程master上拘哨。
只有在所克隆的服務(wù)器上有寫權(quán)限谋梭,或者同一時(shí)刻沒有其他人在推數(shù)據(jù),這條命令才會如期完成任務(wù)倦青。如果在你推數(shù)據(jù)前瓮床,已經(jīng)有其他人推送了若干更新,那你的推送操作就會被駁回。你必須先把他們的更新抓取到本地隘庄,合并到自己的項(xiàng)目中踢步,然后才可以再次推送。
分支
- 分支介紹
怎么使用分支前丑掺,我們先了解下
git
的分支管理获印。
主分支
每個(gè)git
用戶都需要熟悉下原始的master
分支,與master
分支并行的另一個(gè)分支我們稱之為develop
分支街州。
我們把原始庫
/master
庫認(rèn)作為主分支兼丰,HEAD
的源代碼存在于此版本中,并且隨時(shí)都是一個(gè)預(yù)備生產(chǎn)狀態(tài)唆缴。
我們把
origin/develop
庫認(rèn)為是主分支鳍征,該分支HEAD
源碼始終體現(xiàn)下個(gè)發(fā)布版的最新軟件變更。
當(dāng)
develop
分支的源碼到達(dá)了一個(gè)穩(wěn)定狀態(tài)待發(fā)布面徽,所有的代碼變更需要以某種方式合并到master
分支艳丛,然后標(biāo)記一個(gè)版本號。
所以趟紊,每次變更都合并到了
master
氮双,這就是新產(chǎn)品的定義织阳。在這一點(diǎn)弄痹,我們傾向于嚴(yán)格執(zhí)行這一點(diǎn)蚓让,從而,理論上蹄葱,每當(dāng)對master
有一個(gè)提交操作竣况,我們就可以使用Git
鉤子腳本來自動(dòng)構(gòu)建并且發(fā)布軟件到生產(chǎn)服務(wù)器嘀掸。
輔助分支
我們的開發(fā)模型使用了各種輔助性分支,這些分支與關(guān)鍵分支master
和develop
一起,用來支持團(tuán)隊(duì)成員們并行開發(fā),使得易于追蹤功能喇喉,協(xié)助生產(chǎn)發(fā)布環(huán)境準(zhǔn)備千诬,以及快速修復(fù)實(shí)時(shí)在線問題耕捞。與關(guān)鍵分支不同,這些分支總是有一個(gè)有限的生命期较曼,因?yàn)樗麄冏罱K會被移除磷斧。
我們用到的分支類型包括:
功能分支
發(fā)布分支
熱修復(fù)分支
每一種分支有一個(gè)特定目的,并且受限于嚴(yán)格到規(guī)則捷犹,比如:可以用哪些分支作為源分支弛饭,哪些分支能作為合并目標(biāo)。我們馬上將進(jìn)行演練萍歉。
從技術(shù)角度來看侣颂,這些分支絕不是特殊分支。分支的類型基于我們使用的方法來進(jìn)行分類枪孩。它們理所當(dāng)然是普通的
Git
分支憔晒。
- 使用分支
git checkout -b zwh.mainView
創(chuàng)建zwh.mainView
并切換到該分支上。
git checkout zwh.mainView
從其他分支切換到zwh.mainView
分支上蔑舞【艿#
修改完成后,我們需要提交代碼攻询。
我們先用git
看看變更从撼。
提交代碼
git commit -a -m "deveop main view"
直接提交到本地倉庫中。
推送到zwh.mainView
分支遠(yuǎn)程倉庫中钧栖。
git push origin zwh.mainView
推送遠(yuǎn)程倉庫
該分支功能開發(fā)完成后低零,提交到
develop
分支上。
創(chuàng)建一個(gè)develop
分支桐经,開發(fā)中的代碼都合并到該分支上毁兆,開發(fā)完成打到穩(wěn)定版本后再提交到master
上。
因此阴挣,我們
zwh.mainView
需要merge
到develop
分支上气堕,
操作流程:
1.是先切換到develop
分支上,在進(jìn)行merge
操作畔咧。
git merge zwh.mainView
mergezwh.mainView
分支合并到develop
上茎芭。
以上操作將
zwh.mainView
合并到develop
本地倉庫中。
2.如果沒有沖突誓沸,應(yīng)該推送到遠(yuǎn)程develop
倉庫中梅桩。
運(yùn)行指令:git push origin develop
- 合并分支
以上使用分支的操作是簡單情況,在實(shí)際項(xiàng)目中團(tuán)隊(duì)協(xié)作拜隧,一個(gè)工程多個(gè)人在同時(shí)修改中宿百,因此需要學(xué)會怎么合并代碼趁仙。
merge
指令merge
的操作跟以上操作差不多,你從你的分支返回到develop
時(shí)垦页,別人沒有提交代碼可以直接進(jìn)行merge
操作雀费。
rebase
如果你切換到develop
分支時(shí),發(fā)現(xiàn)別人已經(jīng)提交過代碼痊焊,你需要先抓取代碼盏袄,再合并,這個(gè)操作最好的方式是用rebase
薄啥。
rebase操作方法:
1.在分支變更的分支上進(jìn)行rebase
操作辕羽,將自己創(chuàng)建分支的節(jié)點(diǎn)往前走到目前develop
的最后節(jié)點(diǎn)上。
git rebase develop
簡單粗暴地講垄惧,就是跟上develop
的當(dāng)前節(jié)點(diǎn)刁愿。
2.rebase
之后,本地代碼中已經(jīng)有develop
上的最新代碼了到逊,如果有沖突手動(dòng)解決酌毡,沒有沖突直接可以提交到當(dāng)前分支遠(yuǎn)程倉庫中了,方法如上面介紹蕾管。
3.切換到
develop
分支,此時(shí)提示你目前的節(jié)點(diǎn)滯后菩暗。
4.抓取
git pull origin
,再進(jìn)行merge
掰曾、push
操作,此時(shí)不會有沖突了停团。
OK旷坦,這就是
rebase
操作。終于快要講完了贩挣,哈哈隘膘。
git 常用命令
- 最近整理的
git
指令桥爽。
branch
git branch -a
shows both remote and local branches.
git branch -r
shows remote branches.
git branch
shows local branches.
git branch -a| grep ’some'
search ’some’ branches.
git branch -d test
delete test branch
reset
git reset
reset add files in untracked files
git reset —hard
reset all motified .
stash
git stash
stash motified
git stash drop
delete the latest stash
git stash pop
pop the latest stash and remove from stash list
git stash apply
pop the latest stash ,but not remove from stash list
git stash show
show the latest stash changes
**checkout **
git checkout Dev
switch to Dev Branch
git checkout -b test
create branch test and switch to test branch
git checkout .
revert all local uncommitted changes (should be executed in repo root)
git checkout [some_dir|file.m]
revert uncommitted changes only to particular file or directory
commit
git commit -m "commit description"
commit changes to current brach remote repositoty
diff
git diff
show changed files diffence
git diff xx.m
show “xx.m" file changed
status
git status
show current branch changed status
add
git add /test/test.m
add test.m to tracked files
git add *
add all change files of current folder to tracked files
pull
git pull
pull branch from remote repositoty
push
git push origin test
push test branch to remote repositoty
merge
git merge test
merge test branch to current branch
rebase
git rebase test
rebase test branch to current branch
如果耐心看完這篇文章,基本上會操作git指令來管理版本了捆蜀。用的開心。
- 如果文章對你有幫助幔嫂,請點(diǎn)下“喜歡”吧辆它,感謝!
-
參考文獻(xiàn)
服務(wù)器上的 Git
介紹一個(gè)成功的 Git 分支模型