0. Git簡介
git是一個分布式版本控制軟件,最初由林納斯·托瓦茲(Linus Torvalds)創作,于2005年以GPL發布。最初目的是為更好地管理Linux內核開發而設計。Git可以在任何時間點,把文檔的狀態作為更新記錄保存起來。因此可以把編輯過的文檔復原到以前的狀態,也可以顯示編輯前后的內容差異。
而且,編輯舊文件后,試圖覆蓋較新的文件的時候(即上傳文件到服務器時),系統會發出警告,因此可以避免在無意中覆蓋了他人的編輯內容。
更多內容請查看Git維基百科。
1. Git Vs SVN
分布式 vs 集中管理 (多份版本庫 vs 一份版本庫,設想下版本服務器掛了?)
無需網絡,隨時隨地進行版本控制,在沒有網絡的情況下你想回退到某個版本svn基本沒戲;
分支的新建、合并非常方便、快速,沒有任何成本,基本不耗時,svn的版本基本上等同于又復制了一份代碼。
stackoverflow 上關于svn和git的區別的討論,說的很詳細,請參考 Why is Git better than Subversion?
Github上通過版本庫結構、歷史、子項目(submudle)的不同來對比兩者,請參考Github的 What are the differences between SVN and Git?
2.安裝
通過官網安裝。
下面推薦各個OS的GUI( 圖形用戶界面)Git工具,但還是強烈推薦使用命令行操作Git。
Windows
烏龜Tortoisegit
https://tortoisegit.org/Mac
免費的SourceTree客戶端。
http://www.sourcetreeapp.com/Linux
不推薦客戶端,可以使用發行版包含的基礎軟件包管理工具來安裝。 如果以 Fedora 上為例,你可以使用 yum:
$ sudo yum install git
如果你在基于 Debian 的發行版上,請嘗試用 apt-get:
$ sudo apt-get install git
3. 配置
Git 自帶一個 git config 的工具來幫助設置控制 Git 外觀和行為的配置變量。 這些變量存儲在三個不同的位置:
/etc/gitconfig
文件: 包含系統上每一個用戶及他們倉庫的通用配置。 如果使用帶有--system
選項的git config
時,它會從此文件讀寫配置變量。~/.gitconfig
或~/.config/git/config
文件:只針對當前用戶。 可以傳遞--global
選項讓 Git 讀寫此文件。當前使用倉庫的 Git 目錄中的 config 文件(就是
.git/config
):針對該倉庫。
每一個級別覆蓋上一級別的配置,所以 .git/config 的配置變量會覆蓋 /etc/gitconfig 中的配置變量。
在 Windows 系統中,Git 會查找 $HOME 目錄下(一般情況下是 C:\Users\$USER
)的 .gitconfig 文件。 Git 同樣也會尋找 /etc/gitconfig
文件,但只限于 MSys 的根目錄下,即安裝 Git 時所選的目標位置。
3.1 用戶信息配置
每一個 Git 的提交都會使用這些信息,并且它會寫入到你的每一次提交中,不可更改:
$ git config --global user.name "mantoudev"
$ git config --global user.email mantoudev@163.com
如果使用了 --global 選項,那么該命令只需要運行一次,因為之后無論你在該系統上做任何事情, Git 都會使用那些信息。 當你想針對特定項目使用不同的用戶名稱與郵件地址時,可以在那個項目目錄下運行沒有 --global 選項的命令來配置。
很多 GUI 工具都會在第一次運行時幫助你配置這些信息。
3.2 檢查配置信息
如果想要檢查你的配置,可以使用 git config --list
命令來列出所有 Git 當時能找到的配置。
$ git config --list
user.name=mantoudev
user.email=mantoudev@163.com
color.status=auto
color.branch=auto
color.interactive=auto
color.diff=auto
...
你可能會看到重復的變量名,因為 Git 會從不同的文件中讀取同一個配置(例如:/etc/gitconfig 與 ~/.gitconfig
)。 這種情況下,Git 會使用它找到的每一個變量的最后一個配置。
你可以通過輸入 git config <key>:
來檢查 Git 的某一項配置
$ git config user.name
mantoudev
4. 基本常用命令
4.1 添加文件到暫存區(staged)
$ git add filename
#或
$ git stage filename
4.2 將所有修改文件添加到暫存區(staged)
$ git add --all
#或
$ git add -A
4.3 提交修改到暫存區(staged)
$ git commit -m 'commit message'
$ git commit -a -m 'commit message'
注意理解 -a 參數的意義
4.4 從Git倉庫中刪除文件:
$ git rm filename
4.5 從Git倉庫中刪除文件,但本地文件保留:
$ git rm --cached filename
4.6 重命名某個文件:
$ git mv filename newfilename
#或者直接修改完畢文件名 ,進行
$ git add -A && git commit -m 'commit message'
Git會自動識別是重命名了文件
4.7 獲取遠程最新代碼到本地:
$ git pull (origin branchname)
可以指定分支名,也可以忽略。pull 命令自動 fetch 遠程代碼并且 merge,如果有沖突,會顯示在狀態欄,需要手動處理。更推薦使用:git fetch
之后 git merge --no-ff origin branchname
拉取最新的代碼到本地倉庫,并手動 merge 。
5. Git commit messge規范
查看Commit message
$ git log <last tag> HEAD --pretty=format:%s
5.0 Commit Message格式
每次提交,Commit message 都包括三個部分:Header,Body 和 Footer。
<type>(<scope>): <subject>
// 空一行
<body>
// 空一行
<footer>
其中,Header 是必需的,Body 和 Footer 可以省略。
不管是哪一個部分,任何一行都不得超過72個字符(或100個字符)。
5.1 Header
Header部分只有一行,包括三個字段:type(必需)、scope(可選)和subject(必需)。
(1)type
type
用于說明 commit 的類別,只允許使用下面7個標識。
- feat:新功能(feature)
- fix:修補bug
- docs:文檔(documentation)
- style: 格式(不影響代碼運行的變動)
- refactor:重構(即不是新增功能,也不是修改bug的代碼變動)
- test:增加測試
- chore:構建過程或輔助工具的變動
- revert: 撤銷以前的 commit,后面跟著被撤銷 Commit 的 Header。
(2)scope
scope
用于說明 commit 影響的范圍,比如數據層、控制層、視圖層等等,視項目不同而不同。
(3)subject
subject是 commit 目的的簡短描述,不超過50個字符。
- 以動詞開頭,使用第一人稱現在時,比如change,而不是changed或changes
- 第一個字母小寫
- 結尾不加句號(.)
5.2 Body
Body 部分是對本次 commit 的詳細描述,可以分成多行。下面是一個范例。
此次修改主要對****功能模塊進行重構,包含以下部分:
1. AAAAAAA....
2. BBBBBBB....
3. CCCCCCC....
body中還可以與一些Bug管理工具進行關聯,在Header之后換行添加
Bug: <Bug編號>
5.4 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
(2) 關閉 Issue
如果當前 commit 針對某個issue,那么可以在 Footer 部分關閉這個 issue 。
Closes #234
(3) 簽名
如果commit使用簽名的話,footer中會包含簽名信息
Signed-off-by: mantoudev <mantoudev@163.com>
(4) 其他
使用gerrit(代碼審查工具,gerrit維基百科),在footer中會生成一個ChanggeId,一個ChangeId標識一次內容變化,可以包含多個commit,即多個commit如果changeid一致的話,可以認為是一個change。