Git原理及使用
二話不說峻堰,先來一張?jiān)韴D
§Workspace:工作區(qū)
§Index / Stage:暫存區(qū)
§Repository:倉(cāng)庫(kù)區(qū)(或本地倉(cāng)庫(kù))
§Remote:遠(yuǎn)程倉(cāng)庫(kù)
使用過git的人對(duì)這張圖應(yīng)該都不陌生人乓,結(jié)合命令說一下git的大概流程沐兰,之后在補(bǔ)錄其他命令;
1膳算、新建代碼庫(kù)
a)git
init [name],新建一個(gè)目錄,并初始化為代碼庫(kù),如果我記的沒錯(cuò)的話寂屏,這個(gè)過程可以變成手動(dòng)建立一個(gè)文件夾,通過:
git init直接進(jìn)行初始化
2娜搂、拉取代碼迁霎,這個(gè)過程就要結(jié)合上圖了。Git的操作流程是從遠(yuǎn)程代碼庫(kù)remote中百宇,克隆出我們需要的項(xiàng)目代碼考廉,克隆的目的地址就是建立好的本地代碼庫(kù):
a)Bash目錄顯示在本地代碼庫(kù)文件夾下,通過:
i.git clone [url]
b)至于上圖的fetch携御,肯定會(huì)有疑問昌粤,但這里的fetch是下拉本地代碼庫(kù)時(shí)候使用的,稍后介紹pull的時(shí)候會(huì)一并解釋
3啄刹、克隆完之后涮坐,我們的本地倉(cāng)庫(kù)就有了一個(gè)單獨(dú)的項(xiàng)目文件,這個(gè)文件與遠(yuǎn)程的代碼有聯(lián)系誓军。
4袱讹、本地倉(cāng)庫(kù)的文件要同步到遠(yuǎn)程分支上,就需要用到push命令:
a)git push oringin [remote-branch]
5昵时、接下來就是拉分支了廓译,首先我們可以通過:
a) git?branch –r查看遠(yuǎn)程分支
b) git branch –a查看所有分支(包括本地)
c) git?checkout branch –b [branch name]來建立一個(gè)本地分支并切換到該分支下;
d) checkout的作用就是切換當(dāng)前分支债查;
但是這樣的處理非区,當(dāng)前分支與遠(yuǎn)程分支就沒有了關(guān)聯(lián),開發(fā)完成后最多提交到本地代碼庫(kù)盹廷,如果需要上傳到遠(yuǎn)程代碼庫(kù)征绸,就需要按照指示,給一個(gè)指向:
a)git push origin HEAD: [remote-branch]
所以在新建分支的時(shí)候俄占,我們可以直接與遠(yuǎn)程分支綁定好管怠,寫上追蹤:
a)git branch –track [branch name] [remote-branch]
一定會(huì)有人困惑,圖上明明沒有branch這個(gè)命令缸榄,而且checkout是本地代碼庫(kù)和工作區(qū)之間聯(lián)系的命令渤弛,沒錯(cuò)!branch本身是對(duì)分支的操作命令甚带,并不屬于各區(qū)域命令她肯,一旦新建分支佳头,該分支就需要checkout之類的命令來進(jìn)行區(qū)間操作;
6晴氨、拉下來分支康嘉,我們需要不斷的更新分支,這里需要重提一下fetch了籽前,首先先說一步到位的pull操作:
a)圖上就可以看出亭珍,在當(dāng)前工作區(qū),通過:
i.git
pull命令枝哄,可以之前同步遠(yuǎn)程主干上所有的更改肄梨,并且是直接與當(dāng)前代碼合并的;
b)而fetch挠锥,是將代碼同步到本地代碼庫(kù)中峭范,至于要不要同步到當(dāng)前工作區(qū),要不要進(jìn)行其他操作瘪贱,就看你怎么想:
i.git fetch [remote]
ii.區(qū)別一目了然纱控,pull命令直接同步到工作區(qū),合并當(dāng)前代碼菜秦,而fetch只是同步到本地庫(kù)甜害,是否與工作區(qū)代碼合并,需要進(jìn)行單獨(dú)的操作球昨;
7尔店、講了這么多,圖上所示的主要命令還剩下兩個(gè)主慰,add和commit嚣州,一起講了吧,因?yàn)檫@兩個(gè)的操作基本是連著的共螺,這里就要提到git為我們提供的暫存區(qū)了该肴;
8、先看一下項(xiàng)目文件中的目錄藐不,其中有一個(gè)隱藏的.git文件夾
這個(gè)隱藏的,git文件夾匀哄,這個(gè)是git的版本庫(kù),可以清楚的看到里面的refs里存放著我們項(xiàng)目的標(biāo)簽雏蛮,本地建立過的分支版本涎嚼,遠(yuǎn)程的分支版本等,
其中還有一個(gè)index文件挑秉,記錄著工作區(qū)生成的文件內(nèi)容與暫存對(duì)象庫(kù)object之間的索引法梯。(…這中間有太多想說又沒理解清楚的,待之后明白了再補(bǔ)充犀概,總之立哑,網(wǎng)上很多抄了廖雪峰大神的文章夜惭,沒有一個(gè)講明白的)
9、現(xiàn)在回來說add和commit刁憋,通過add:
a)git?add .可將當(dāng)前目錄中所有文件添加到暫存區(qū)中滥嘴;
b)添加完成之后木蹬,可以通過git status查看當(dāng)前暫存區(qū)文件狀態(tài)(待提交)至耻;
當(dāng)我們要將代碼存放到本地代碼庫(kù)時(shí),再通過commit命令:
a)git commit –m [message]
--------------------------------------------------------------------------------------------------------------------------
10镊叁、在git正常使用中尘颓,出去基本的拉取,提交晦譬,還要面臨著很多問題疤苹,比如代碼沖突:
a)原因:兩個(gè)分支上一段相同代碼被同時(shí)修改;
b)可通過查找‘<<<<<<<’沖突提示符敛腌,找到?jīng)_突位置卧土;
c)刪掉沖突代碼,并且刪掉沖突提示符像樊,重新提交尤莺,將當(dāng)前分支合到主干:
i.通過[to:master/branch] merge [from:branch/master]合并代碼時(shí),若出現(xiàn)當(dāng)前分支名后帶有MERGING字樣生棍,證明有沖突颤霎,下面會(huì)報(bào)出沖突所在位置;
ii.查看沖突代碼涂滴,留下需要的友酱,刪掉不需要的和沖突提示符;
iii.再次提交代碼柔纵,發(fā)現(xiàn)當(dāng)前分支名稱后的MERGING字樣沒有了缔杉,證明解沖突成功;