第 1 章:起步
1.1 初次運(yùn)行 Git 前的配置
-
/etc/gitconfig 文件:
系統(tǒng)中對所有用戶都普遍適用的配置。使用
--system選項讀寫。 -
~/.gitconfig 文件:
用戶目錄下的配置文件只適用于該用戶。使用
--global選項讀寫。在 Windows 下路徑為:C:\Documents and Settings\$USER\.gitconfig。
-
.git/config 文件:
這里的配置僅僅針對當(dāng)前項目有效。
配置用戶信息
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
配置文本編輯器
$ git config --global core.editor code
配置差異分析工具
$ git config --global merge.tool code
查看配置信息
$ git config --list
1.2 獲取幫助
$ git help <verb>
$ git <verb> --help
$ man git-<verb>
第2章 Git 基礎(chǔ)
2.1 獲取項目的 Git 倉庫
在工作目錄初始化新倉庫
$ git init
從現(xiàn)有倉庫克隆
$ git clone https://github.com/schacon/grit.git
2.2 記錄每次更新到倉庫
文件狀態(tài)的變化周期

檢查當(dāng)前文件狀態(tài)
$ git status
跟蹤新文件或暫存已修改文件
$ git add [file or folder path]
忽略某些文件
.gitignore 文件的格式規(guī)范:
- 空行和注釋(#)被 Git 忽略
- 可以使用標(biāo)準(zhǔn)的 glob 模式匹配
- 匹配模式最后跟 / 說明要忽略的是目錄
- 要忽略指定模式模式意外的文件或目錄,可以在模式前加上 !取反。
.gitignore 文件例子:
# 忽略以 .a 結(jié)尾的文件
*.a
# 但 lib.a 除外
!lib.a
# 僅僅忽略根目錄下的 TODO 文件,但不包括子目錄下的 TODO
/TODO
# 忽略 build/ 目錄下的所有文件
build/
# 忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
查看已暫存和未暫存的更新
$ git diff
此命令比較的是工作目錄中當(dāng)前文件和暫存區(qū)域快照之間的差異,也就是修改之后還沒有暫存起來的變化內(nèi)容。
若要看已經(jīng)暫存起來的文件和上次提交時的快照之間的差異,可以用:
$ git diff --cached
$ git diff --staged # 效果一樣,但更好記。
提交更新
$ git commit -m "Fix benchmarks for speed"
跳過使用暫存區(qū)域
在提交的時候,添加 -a 選項,則可以跳過使用暫存區(qū),直接提交。
$ git commit -a -m "Fix benchmarks for speed"
# 相當(dāng)于(只對修改過的文件有效)。
$ git add .; git commit -m "Fix benchmarks for speed"
刪除文件
要從 Git 中移除某個文件,就必須要從已跟蹤文件清單中移除(從暫存區(qū)域移除),然后提交。
$ git rm hello.txt
移動文件
$ git mv old-filepath new-filepath
2.3 查看提交歷史
$ git log
默認(rèn)不用任何參數(shù)的話,git log 會按提交時間列出所有的更新,最近的更新排在最上面。
git log 的一些選項:
-
-p
展示每次提交內(nèi)容的差異
-
-2
僅顯示最近兩次的提交
-
--stat
顯示監(jiān)要的增改函數(shù)的統(tǒng)計
-
--pretty=oneline
將每個提交放在一行顯示(完整哈希)
-
--pretty=format:"%h - %an, %ar : %s"
以格式化的方式顯示提交信息
-
--graph
以圖的方式顯示
-
--oneline
將每個提交放在一行顯示(簡短哈希)
限制記錄范圍
使用一下一些選項,可以限制記錄的范圍:
-
--since, --after
僅顯示指定時間之后的提交
-
--until, --before
僅顯示指定時間之前的提交
-
--author
僅顯示指定作者的提交
-
--committer
僅顯示指定提交者的提交
-
--grep
僅顯示包含選項關(guān)鍵字的提交
$ git log --since=2.weeks
$ git log --pretty="%h - %s" --author=gister --since="2008-01-15" --before="2008-11-01"
2.4 撤銷操作
修改最后一次提交
有時候我們提交完了才發(fā)現(xiàn)漏掉了幾個文件沒有加,或者提交信息寫錯了。想要撤消剛才的提交操作,可以使用 --amend 選項重新提交:
$ git commit -amend -m "message"
取消已經(jīng)暫存的文件
$ git reset HEAD <file>...
取消對文件的修改
$ git checkout <file>...
2.5 遠(yuǎn)程倉庫的使用
查看當(dāng)前的遠(yuǎn)程庫
$ git remote -v
$ git remote --verbose
添加遠(yuǎn)程倉庫
$ git remote add [remote-name] [remote-repo-url]
從遠(yuǎn)程倉庫抓取數(shù)據(jù)
$ git fetch [remote-name]
如果是克隆了一個倉庫,此命令會自動將遠(yuǎn)程倉庫歸于 origin 名下。
$ git fetch origin
推送數(shù)據(jù)到遠(yuǎn)程倉庫
$ git push [remote-name] [branch-name]
$ git push origin master # 默認(rèn)就是 origin 和 master
查看遠(yuǎn)程倉庫信息
$ git remote show [remote-name]
遠(yuǎn)程倉庫的刪除和重命名
$ git remote remove <remote-name>
$ git remote rename <remote-old-name> <remote-new-name>
2.6 打標(biāo)簽
列顯已有的標(biāo)簽
$ git tag
新建標(biāo)簽
Git 使用的標(biāo)簽有兩種類型:輕量級的(lightweight)和含附注的(annotated)。
輕量級標(biāo)簽就像是個不會變化的分支,實際上它就是個指向特定提交對象的引用。
含附注標(biāo)簽,實際上是存儲在倉庫中的一個獨(dú)立對象,它有自身的校驗和信息,包含著標(biāo)簽的名字,電子郵件地址和日期,以及標(biāo)簽說明,標(biāo)簽本身也允許使用 GNU Privacy Guard (GPG) 來簽署或驗證。
含附注的標(biāo)簽(使用 -a)
$ git tag -a v1.4 -m "version 1.4"
輕量級標(biāo)簽
$ git tag v1.4-lightweight # 不用 -a 即創(chuàng)建輕量級的標(biāo)簽
后期加注標(biāo)簽(從以前的提交創(chuàng)建標(biāo)簽)
git tag -a v1.2 9fceb02
可以使用 git show 命令查看相應(yīng)標(biāo)簽的版本信息,并連同顯示打標(biāo)簽時的提交對象。
$ git show v1.4
分享標(biāo)簽
默認(rèn)情況下,git push 并不會把標(biāo)簽傳送到遠(yuǎn)端服務(wù)器上,只有通過顯式命令才能分享標(biāo)簽到遠(yuǎn)端倉庫。
$ git push origin v1.4 # 將 v1.4 推送到遠(yuǎn)程
$ git push origin --tags # 將所有的新增的標(biāo)簽推送到遠(yuǎn)程
第 3 章 Git 分支
3.1 何謂分支
Git 中的分支,其實本質(zhì)上僅僅是個指向 commit 對象的可變指針。Git 會使用 master 作為分支的默認(rèn)名字。
Git 是如何知道你當(dāng)前在哪個分支上工作的呢?其實答案也很簡單,它保存著一個名為 HEAD 的特別指針,它是一個指向你正在工作中的本地分支的指針。

3.2 分支的新建與合并
新建分支
# 新建分支
$ git branch <branch>
# 切換到分支
$ git checkout <branch>
# 新建并切換到分支
$ git checkout -b <branch>
刪除分支
$ git branch -d <branch>
合并分支
$ git merge <branch>
3.3 分支的管理
顯示前所有分支的清單
$ git branch
$ git branch -v # 查看最后一個提交對象的信息
顯示已合并或未合并的分支
$ git branch --merged
$ git branch --no-merged
3.5 遠(yuǎn)程分支
拉取遠(yuǎn)程數(shù)據(jù)
$ git fetch [remote-name]
推送本地分支
$ git push [remote-name] [branch-name]
跟蹤遠(yuǎn)程分支
跟蹤分支是一種和某個遠(yuǎn)程分支有直接聯(lián)系的本地分支。
# 創(chuàng)建跟蹤分支
$ git checkout -b [branch-name] [remote-name]/[branch-name]
$ git checkout --track [remote-name]/[branch-name]
刪除遠(yuǎn)程分支
推送時分支名前面加冒號,可以刪除遠(yuǎn)程分支。
$ git push [remote-name]:[branch-name]
3.6 rebase
rebase 命令,可以把在一個分支里提交的改變移到另一個分支里重放一遍。
$ git rebase <branch-name>

rebase 的風(fēng)險
一旦分支中的提交對象發(fā)布到公共倉庫,就千萬不要對該分支進(jìn)行衍合操作。