git init
,
git add
,
git commit
,
git push
,一通操做猛如虎,然而實際工做中,咱們會遇到各類意外狀況,好比當發生衝突的時候,或者須要暫時中止添加當前進行中的新feature開發,去修復一個
bug
,怎麼保證既不影響當前工做,又可以順利完成臨時加派的任務呢?
實際上,git
是很強大的版本管理工具,有必要了解實際開發流程中須要用到的各類命令以及相應參數的設置,這樣才能保證開發過程有條不紊,本文就對git
經常使用命令進行了梳理,幫助你們理解git
原理。html
1.1 工做區、暫存區和版本庫前端
結合上圖,首先理解下 Git 工做區、暫存區和版本庫概念:git
圖中的 objects 標識的區域爲 Git 的對象庫,實際位於 ".git/objects"目錄下,裏面包含了建立的各類對象及內容:面試
當對工做區修改(或新增)的文件執行 "git add" 命令時,暫存區的目錄樹被更新,同時工做區修改(或新增)的文件內容被寫入到對象庫中的一個新的對象中,而該對象的ID被記錄在暫存區的文件索引中segmentfault
當執行提交操做(git commit)時,暫存區的目錄樹寫到版本庫(對象庫)中,master 分支會作相應的更新。即 master 指向的目錄樹就是提交時暫存區的目錄樹bash
1.2 Git 分支管理服務器
幾乎每一種版本控制系統都以某種形式支持分支。使用分支意味着你能夠從開發主線上分離開來,而後在不影響主線的同時繼續工做。Git 的分支模型稱爲她的「必殺技特性」,正由於這一特性,使得 Git 從衆多版本控制系統中脫穎而出。Git 處理分支的方式是難以置信的輕量,建立分支以及在不一樣分支之間切換幾乎能在瞬間完成。與許多其餘版本控制系統不一樣,Git鼓勵在工做流程中頻繁地使用分支與合併,正是由於分支功能,Git 纔會如此強大而又獨特。工具
理解 Git 分支,須要理解 orgin/master, master, origin的區別:測試
執行 git clone
命令以後,遠程服務器會被自動命名爲 origin
, 而且該命令會建立一個指向 master
分支的指針,該分支命名爲 origin/master
,同時會建立一個名爲 master
的本地分支,而且和遠程分支在同一個提交節點。ui
注意: 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
這個命令完成了什麼呢:
dev
被設定爲追蹤服務器 origin
上的遠程分支 dev
dev
分支上除了分支操做,還有其它不少經常使用的 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
參數說明:
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 個標識:
(2) scope
scope
用於說明 commit
影響的範圍,好比數據層、控制層、視圖層等等(不多用到)
(3) subject
描述本次提交的目的,不超過 50 個字符
3.2 Body
Body
部分是對本次 commit
的詳細描述,能夠分爲多行描述,要求使用第一人稱如今時,說明代碼變更緣由以及先後行爲對比。
3.3 Footer
Footer
只適用於兩種狀況:
當前代碼與上一個版本不兼容,則 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.
複製代碼
Issue
若是當前 commit
針對某個 issue
,那麼能夠在 Footer
部分關閉這個 issue
Closes #123, #234, #345
複製代碼
寫在最後:
本文介紹了 Git
的工做原理、經常使用命令以及 commit message
規範,但願能對你的工做有些幫助
若是你感受我寫的還不錯,能夠關注個人公衆號:『我是前端喵』,更多精彩文章等你解鎖❤️❤️❤️
參考資料