關于git的使用在前端面試中是很常見的題目,在實際工作中也經常會用git進行版本管理,也許你了解git的相關命令和使用流程,git init
, git add
, git commit
,git push
,一通操作猛如虎,然而實際工作中,我們會遇到各種意外情況,比如當發生沖突的時候,或者需要暫時停止添加當前進行中的新feature開發,去修復一個 bug
,怎么保證既不影響當前工作,又能夠順利完成臨時加派的任務呢?
實際上, git
是很強大的版本管理工具,有必要了解實際開發流程中需要用到的各種命令以及相應參數的設置,這樣才能保證開發過程有條不紊,本文就對git
常用命令進行了梳理,幫助大家理解 git
原理。
一、Git 原理
1.1 工作區、暫存區和版本庫
結合上圖,首先理解下 Git 工作區、暫存區和版本庫概念:
工作區:就是電腦中看到的目錄
暫存區(stage/index):是一個存放在".git"目錄下的 index 文件(.git/index),暫存區有時候也叫作索引(index)
版本庫:是指工作區下的一個目錄,是隱藏的,這個不算工作區,而是 Git 的版本庫
圖中的 objects 標識的區域為 Git 的對象庫,實際位于 ".git/objects"目錄下,里面包含了創建的各種對象及內容:
當對工作區修改(或新增)的文件執行 "git add" 命令時,暫存區的目錄樹被更新,同時工作區修改(或新增)的文件內容被寫入到對象庫中的一個新的對象中,而該對象的ID被記錄在暫存區的文件索引中
當執行提交操作(git commit)時,暫存區的目錄樹寫到版本庫(對象庫)中,master 分支會做相應的更新。即 master 指向的目錄樹就是提交時暫存區的目錄樹
1.2 Git 分支管理
幾乎每一種版本控制系統都以某種形式支持分支。使用分支意味著你可以從開發主線上分離開來,然后在不影響主線的同時繼續工作。
Git 的分支模型稱為她的“必殺技特性”,正因為這一特性,使得 Git 從眾多版本控制系統中脫穎而出。Git 處理分支的方式是難以置信的輕量,創建分支以及在不同分支之間切換幾乎能在瞬間完成。與許多其他版本控制系統不同,Git鼓勵在工作流程中頻繁地使用分支與合并,正是因為分支功能,Git 才會如此強大而又獨特。
理解 Git 分支,需要理解 orgin/master, master, origin的區別:
origin: 遠程服務器
origin/master: 遠程分支
master: 本地分支
執行 git clone
命令之后,遠程服務器會被自動命名為 origin
, 并且該命令會創建一個指向 master
分支的指針,該分支命名為origin/master
,同時會創建一個名為 master
的本地分支,并且和遠程分支在同一個提交節點。
注意: origin并不特別,就像分支名master在git中沒有任何特殊意義一樣.當執行git init時,master會作為初始分支的默認名字,因此使得master分支名被廣泛使用.而origin是執行git clone時的默認服務器名稱,當然可以通過指令git clone -o cat,使得默認服務器名稱為cat,而默認遠程分支為cat/master.
master & origin&master
這個就很好理解了: master
是默認的本地分支,是遠程分支 origin/master
在本地的拷貝
從遠程分支 checkout
一個本地分支,該本地分支被稱為追蹤分支 (tracking branck)
,被追蹤的分支被稱為上游分支 (upstream branch)
, 追蹤分支和遠程分支相關聯,執行 git pull
命令, git
會自動獲取到需要 merge
的分支的服務器
通過 git checkout -b [branch] [remotename]/[branch]
命令可以創建新的追蹤分支
如果已經有一個本地分支,現在想要關聯遠程分支,或者修改追蹤的上游分支,可以使用-u
或者--set-upstream-to
來實現:git branch -r origin/[your branch]
git
還提供了通用的--track
操作: git checkout --track origin/dev
那么, git checkout --track origin/dev
這個命令完成了什么呢:
1.分支 dev
被設定為追蹤服務器 origin
上的遠程分支dev
2.切換到 dev
分支上
除了分支操作,還有其它很多常用的git
命令,一起看下吧
二、Git 常用命令
1.查看分支
git branch // 顯示本地分支
git branch -r // 顯示遠程分支
git branch -a // 顯示所有分支
復制代碼
2.創建分支
git branch [branch name]
復制代碼
3.切換分支
git checkout [branch name]
git checkout -b [branch name] // 若分支不存在,則創建分支,切換到新分支上
復制代碼
4.刪除分支
git branch -d [branch name] // 刪除本地分支
git push origin --delete [branch name] // 刪除遠程分支
復制代碼
5.合并分支
git merge [branch name]
復制代碼
6.將此次更新合并到上次的 commit
記錄中,不添加新的commit
git commit --amend
復制代碼
7.拉取遠程分支
git pull
復制代碼
8.推送到遠程分支
如果遠程分支上跟本地分支沒有關聯,則執行以下命令
git push -r origin [branch name]
復制代碼
如果本地分支跟遠程分支已經關聯,則運行如下命令:
git push
復制代碼
9.查看日志
git log // 列出所有更新
---------帶參數---------
git log --pretty=oneline
git log --pretty=short
git log --pretty=full
git log --pretty=fuller
--------特定格式--------
git log --pretty=format:"%h - %an, %ar : %s"
復制代碼
git log --pretty
參數說明:
三、Commit Message規范
git commit
命令要求編寫 commit message
,不然無法提交,關于 commit message
的編寫,我們往往容易忽略規范,整體來講, commit message
應該清晰簡潔,能夠提現本次提交目的。
關于 commit message
的編寫規范,社區有很多種,Angular規范
是目前使用最廣的寫法,本文就簡單介紹一下。
commit message
的構成包括三部分: Header, Body 和 Footer
<type> (<scope>): <subject>
// 空行
<body>
// 空行
<footer>
復制代碼
其中, Header
是必需的, Body
和Footer
可以省略。
注意:任何一布行都不得超過 72(或100) 個字符,避免自動換行影響美觀
3.1 Header
Header
占一行,包括三個字段: type, scope, subject
(1) type
type
用于說明 commit
類別,只允許以下 7 個標識:
feat: 新功能 (feature)
fix: 修補 bug
docs: 文檔 (documentation)
style: 格式 (比如去除空行)
refactor: 重構 (不是新增功能,也不是修補bug)
test: 增加測試
chore: 構建過程或輔助工具的變動
(2) scope
scope
用于說明 commit
影響的范圍,比如數據層、控制層、視圖層等等(很少用到)
(3) subject
描述本次提交的目的,不超過 50 個字符
以動詞開頭,使用第一人稱現在時,比如change,而不是 changed 或 changes
第一個字母小寫
結尾不加句號
3.2 Body
Body
部分是對本次 commit
的詳細描述,可以分為多行描述,要求使用第一人稱現在時,說明代碼變動原因以及前后行為對比。
3.3 Footer
Footer
只適用于兩種情況:
(1) 不兼容變動
當前代碼與上一個版本不兼容,則Footer
部分以BREAKING CHANGE
開頭,后面是對變動的描述、變動理由和遷移方法
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.
復制代碼
(2) 關閉Issue
如果當前 commit
針對某個issue
,那么可以在Footer
部分關閉這個 issue
Closes #123, #234, #345
復制代碼
寫在最后:
本文介紹了 Git
的工作原理、常用命令以及 commit message
規范,希望能對你的工作有些幫助
下面這個是一些大企業的大佬整理出來的,認真地和他們學習了很多經驗以及獲取了很多直觀的資料,現在全部拿出來奉獻給大家!想系統學習前端web的朋友,我都整理在文件中了,可以這邊的交流裙前面114中間6649后面671,資源給大家拉滿,不見不散哦!