關(guān)于git的使用在前端面試中是很常見(jiàn)的題目殷蛇,在實(shí)際工作中也經(jīng)常會(huì)用git進(jìn)行版本管理某筐,也許你了解git的相關(guān)命令和使用流程武契,git init
, git add
, git commit
,git push
祭往,一通操作猛如虎,然而實(shí)際工作中姆泻,我們會(huì)遇到各種意外情況圈纺,比如當(dāng)發(fā)生沖突的時(shí)候秦忿,或者需要暫時(shí)停止添加當(dāng)前進(jìn)行中的新feature開(kāi)發(fā),去修復(fù)一個(gè) bug
蛾娶,怎么保證既不影響當(dāng)前工作灯谣,又能夠順利完成臨時(shí)加派的任務(wù)呢?
實(shí)際上蛔琅, git
是很強(qiáng)大的版本管理工具胎许,有必要了解實(shí)際開(kāi)發(fā)流程中需要用到的各種命令以及相應(yīng)參數(shù)的設(shè)置,這樣才能保證開(kāi)發(fā)過(guò)程有條不紊罗售,本文就對(duì)git
常用命令進(jìn)行了梳理辜窑,幫助大家理解 git
原理。
一寨躁、Git 原理
1.1 工作區(qū)穆碎、暫存區(qū)和版本庫(kù)
結(jié)合上圖,首先理解下 Git 工作區(qū)职恳、暫存區(qū)和版本庫(kù)概念:
工作區(qū):就是電腦中看到的目錄
暫存區(qū)(stage/index):是一個(gè)存放在".git"目錄下的 index 文件(.git/index)所禀,暫存區(qū)有時(shí)候也叫作索引(index)
版本庫(kù):是指工作區(qū)下的一個(gè)目錄,是隱藏的放钦,這個(gè)不算工作區(qū)色徘,而是 Git 的版本庫(kù)
圖中的 objects 標(biāo)識(shí)的區(qū)域?yàn)?Git 的對(duì)象庫(kù),實(shí)際位于 ".git/objects"目錄下操禀,里面包含了創(chuàng)建的各種對(duì)象及內(nèi)容:
當(dāng)對(duì)工作區(qū)修改(或新增)的文件執(zhí)行 "git add" 命令時(shí)褂策,暫存區(qū)的目錄樹(shù)被更新,同時(shí)工作區(qū)修改(或新增)的文件內(nèi)容被寫入到對(duì)象庫(kù)中的一個(gè)新的對(duì)象中颓屑,而該對(duì)象的ID被記錄在暫存區(qū)的文件索引中
當(dāng)執(zhí)行提交操作(git commit)時(shí)斤寂,暫存區(qū)的目錄樹(shù)寫到版本庫(kù)(對(duì)象庫(kù))中,master 分支會(huì)做相應(yīng)的更新揪惦。即 master 指向的目錄樹(shù)就是提交時(shí)暫存區(qū)的目錄樹(shù)
1.2 Git 分支管理
幾乎每一種版本控制系統(tǒng)都以某種形式支持分支扬蕊。使用分支意味著你可以從開(kāi)發(fā)主線上分離開(kāi)來(lái),然后在不影響主線的同時(shí)繼續(xù)工作丹擎。
Git 的分支模型稱為她的“必殺技特性”,正因?yàn)檫@一特性歇父,使得 Git 從眾多版本控制系統(tǒng)中脫穎而出蒂培。Git 處理分支的方式是難以置信的輕量,創(chuàng)建分支以及在不同分支之間切換幾乎能在瞬間完成榜苫。與許多其他版本控制系統(tǒng)不同护戳,Git鼓勵(lì)在工作流程中頻繁地使用分支與合并,正是因?yàn)榉种Чδ艽共牵珿it 才會(huì)如此強(qiáng)大而又獨(dú)特媳荒。
理解 Git 分支抗悍,需要理解 orgin/master, master, origin的區(qū)別:
origin: 遠(yuǎn)程服務(wù)器
origin/master: 遠(yuǎn)程分支
master: 本地分支
執(zhí)行 git clone
命令之后,遠(yuǎn)程服務(wù)器會(huì)被自動(dòng)命名為 origin
, 并且該命令會(huì)創(chuàng)建一個(gè)指向 master
分支的指針钳枕,該分支命名為origin/master
缴渊,同時(shí)會(huì)創(chuàng)建一個(gè)名為 master
的本地分支,并且和遠(yuǎn)程分支在同一個(gè)提交節(jié)點(diǎn)鱼炒。
注意: origin并不特別,就像分支名master在git中沒(méi)有任何特殊意義一樣.當(dāng)執(zhí)行g(shù)it init時(shí),master會(huì)作為初始分支的默認(rèn)名字,因此使得master分支名被廣泛使用.而origin是執(zhí)行g(shù)it clone時(shí)的默認(rèn)服務(wù)器名稱,當(dāng)然可以通過(guò)指令git clone -o cat,使得默認(rèn)服務(wù)器名稱為cat,而默認(rèn)遠(yuǎn)程分支為cat/master.
master & origin&master
這個(gè)就很好理解了: master
是默認(rèn)的本地分支衔沼,是遠(yuǎn)程分支 origin/master
在本地的拷貝
從遠(yuǎn)程分支 checkout
一個(gè)本地分支,該本地分支被稱為追蹤分支 (tracking branck)
昔瞧,被追蹤的分支被稱為上游分支 (upstream branch)
, 追蹤分支和遠(yuǎn)程分支相關(guān)聯(lián)指蚁,執(zhí)行 git pull
命令, git
會(huì)自動(dòng)獲取到需要 merge
的分支的服務(wù)器
通過(guò) git checkout -b [branch] [remotename]/[branch]
命令可以創(chuàng)建新的追蹤分支
如果已經(jīng)有一個(gè)本地分支自晰,現(xiàn)在想要關(guān)聯(lián)遠(yuǎn)程分支凝化,或者修改追蹤的上游分支,可以使用-u
或者--set-upstream-to
來(lái)實(shí)現(xiàn):git branch -r origin/[your branch]
git
還提供了通用的--track
操作: git checkout --track origin/dev
那么酬荞, git checkout --track origin/dev
這個(gè)命令完成了什么呢:
1.分支 dev
被設(shè)定為追蹤服務(wù)器 origin
上的遠(yuǎn)程分支dev
2.切換到 dev
分支上
除了分支操作搓劫,還有其它很多常用的git
命令,一起看下吧
二袜蚕、Git 常用命令
1.查看分支
git branch // 顯示本地分支
git branch -r // 顯示遠(yuǎn)程分支
git branch -a // 顯示所有分支
復(fù)制代碼
2.創(chuàng)建分支
git branch [branch name]
復(fù)制代碼
3.切換分支
git checkout [branch name]
git checkout -b [branch name] // 若分支不存在糟把,則創(chuàng)建分支,切換到新分支上
復(fù)制代碼
4.刪除分支
git branch -d [branch name] // 刪除本地分支
git push origin --delete [branch name] // 刪除遠(yuǎn)程分支
復(fù)制代碼
5.合并分支
git merge [branch name]
復(fù)制代碼
6.將此次更新合并到上次的 commit
記錄中牲剃,不添加新的commit
git commit --amend
復(fù)制代碼
7.拉取遠(yuǎn)程分支
git pull
復(fù)制代碼
8.推送到遠(yuǎn)程分支
如果遠(yuǎn)程分支上跟本地分支沒(méi)有關(guān)聯(lián)遣疯,則執(zhí)行以下命令
git push -r origin [branch name]
復(fù)制代碼
如果本地分支跟遠(yuǎn)程分支已經(jīng)關(guān)聯(lián),則運(yùn)行如下命令:
git push
復(fù)制代碼
9.查看日志
git log // 列出所有更新
---------帶參數(shù)---------
git log --pretty=oneline
git log --pretty=short
git log --pretty=full
git log --pretty=fuller
--------特定格式--------
git log --pretty=format:"%h - %an, %ar : %s"
復(fù)制代碼
git log --pretty
參數(shù)說(shuō)明:
三凿傅、Commit Message規(guī)范
git commit
命令要求編寫 commit message
缠犀,不然無(wú)法提交,關(guān)于 commit message
的編寫聪舒,我們往往容易忽略規(guī)范辨液,整體來(lái)講, commit message
應(yīng)該清晰簡(jiǎn)潔箱残,能夠提現(xiàn)本次提交目的滔迈。
關(guān)于 commit message
的編寫規(guī)范,社區(qū)有很多種被辑,Angular規(guī)范
是目前使用最廣的寫法燎悍,本文就簡(jiǎn)單介紹一下。
commit message
的構(gòu)成包括三部分: Header, Body 和 Footer
<type> (<scope>): <subject>
// 空行
<body>
// 空行
<footer>
復(fù)制代碼
其中盼理, Header
是必需的谈山, Body
和Footer
可以省略。
注意:任何一布行都不得超過(guò) 72(或100) 個(gè)字符宏怔,避免自動(dòng)換行影響美觀
3.1 Header
Header
占一行奏路,包括三個(gè)字段: type, scope, subject
(1) type
type
用于說(shuō)明 commit
類別畴椰,只允許以下 7 個(gè)標(biāo)識(shí):
feat: 新功能 (feature)
fix: 修補(bǔ) bug
docs: 文檔 (documentation)
style: 格式 (比如去除空行)
refactor: 重構(gòu) (不是新增功能,也不是修補(bǔ)bug)
test: 增加測(cè)試
chore: 構(gòu)建過(guò)程或輔助工具的變動(dòng)
(2) scope
scope
用于說(shuō)明 commit
影響的范圍鸽粉,比如數(shù)據(jù)層斜脂、控制層、視圖層等等(很少用到)
(3) subject
描述本次提交的目的潜叛,不超過(guò) 50 個(gè)字符
以動(dòng)詞開(kāi)頭秽褒,使用第一人稱現(xiàn)在時(shí),比如change威兜,而不是 changed 或 changes
第一個(gè)字母小寫
結(jié)尾不加句號(hào)
3.2 Body
Body
部分是對(duì)本次 commit
的詳細(xì)描述销斟,可以分為多行描述,要求使用第一人稱現(xiàn)在時(shí)椒舵,說(shuō)明代碼變動(dòng)原因以及前后行為對(duì)比蚂踊。
3.3 Footer
Footer
只適用于兩種情況:
(1) 不兼容變動(dòng)
當(dāng)前代碼與上一個(gè)版本不兼容,則Footer
部分以BREAKING CHANGE
開(kāi)頭笔宿,后面是對(duì)變動(dòng)的描述犁钟、變動(dòng)理由和遷移方法
BREAKING CHANGE: isolate scope bindings definition has changed.
To migrate the code follow the example below:
Before:
scope: {
myAttr: 'attribute',
}
After:
scope: {
myAttr: '@',
}
The removed `inject` wasn't generaly useful for directives so there should be no code using it.
復(fù)制代碼
(2) 關(guān)閉Issue
如果當(dāng)前 commit
針對(duì)某個(gè)issue
,那么可以在Footer
部分關(guān)閉這個(gè) issue
Closes #123, #234, #345
復(fù)制代碼
寫在最后:
本文介紹了 Git
的工作原理泼橘、常用命令以及 commit message
規(guī)范涝动,希望能對(duì)你的工作有些幫助
下面這個(gè)是一些大企業(yè)的大佬整理出來(lái)的,認(rèn)真地和他們學(xué)習(xí)了很多經(jīng)驗(yàn)以及獲取了很多直觀的資料炬灭,現(xiàn)在全部拿出來(lái)奉獻(xiàn)給大家醋粟!想系統(tǒng)學(xué)習(xí)前端web的朋友,我都整理在文件中了重归,可以這邊的交流裙前面114中間6649后面671米愿,資源給大家拉滿,不見(jiàn)不散哦鼻吮!