「前端面試100問」之Git經常使用命令以及Commit Message編寫指南

關於git的使用在前端面試中是很常見的題目,在實際工做中也常常會用git進行版本管理,也許你瞭解git的相關命令和使用流程, git init, git add, git commit, git push,一通操做猛如虎,然而實際工做中,咱們會遇到各類意外狀況,好比當發生衝突的時候,或者須要暫時中止添加當前進行中的新feature開發,去修復一個 bug,怎麼保證既不影響當前工做,又可以順利完成臨時加派的任務呢?

實際上,git是很強大的版本管理工具,有必要了解實際開發流程中須要用到的各類命令以及相應參數的設置,這樣才能保證開發過程有條不紊,本文就對git經常使用命令進行了梳理,幫助你們理解git原理。html

1、Git 原理

1.1 工做區、暫存區和版本庫前端

結合上圖,首先理解下 Git 工做區、暫存區和版本庫概念:git

  • 工做區:就是電腦中看到的目錄
  • 暫存區(stage/index):是一個存放在".git"目錄下的 index 文件(.git/index),暫存區有時候也叫做索引(index)
  • 版本庫:是指工做區下的一個目錄,是隱藏的,這個不算工做區,而是 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的區別:測試

  • origin: 遠程服務器
  • origin/master: 遠程分支
  • master: 本地分支

執行 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 這個命令完成了什麼呢:

  1. 分支 dev 被設定爲追蹤服務器 origin 上的遠程分支 dev
  2. 切換到 dev 分支上

除了分支操做,還有其它不少經常使用的 git 命令,一塊兒看下吧

2、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 參數說明:

3、Commit Message規範

git commit命令要求編寫commit message,否則沒法提交,關於commit message的編寫,咱們每每容易忽略規範,總體來說,commit message應該清晰簡潔,可以提現本次提交目的。

關於commit message的編寫規範,社區有不少種,Angular規範是目前使用最廣的寫法,本文就簡單介紹一下。

commit message的構成包括三部分: Header, Body 和 Footer

<type> (<scope>): <subject>
// 空行
<body>
// 空行
<footer>
複製代碼

其中,Header是必需的,BodyFooter能夠省略。

注意:任何一布行都不得超過 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 規範,但願能對你的工做有些幫助

若是你感受我寫的還不錯,能夠關注個人公衆號:『我是前端喵』,更多精彩文章等你解鎖❤️❤️❤️

參考資料

Commit message 和 Change log 編寫指南

git 經常使用命令

Git 教程

Git 分支-分支簡介

相關文章
相關標籤/搜索