# Pro Git 閱讀筆記

第 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)的變化周期

image

檢查當(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 的特別指針,它是一個指向你正在工作中的本地分支的指針。

image

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>
image

rebase 的風(fēng)險

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 基本須知 Git 文件流轉(zhuǎn)的三個工作區(qū)域: Git的本地數(shù)據(jù)目錄, 工作目錄,以及暫存區(qū)域 Git 內(nèi)只存在三種狀...
    baby熊_熊姐閱讀 316評論 0 2
  • Git保證完整性 Git 中所有數(shù)據(jù)在存儲前都計算校驗和,然后以校驗和來引用。SHA-1散列(hash, 哈希)....
    飲長刀閱讀 422評論 0 2
  • 本文作者陳云峰,轉(zhuǎn)載請注明。 這篇文章記錄個人常用的一些命令,和記不住的一些命令,轉(zhuǎn)載了并不斷更新。 Git官網(wǎng) ...
    陳云峰閱讀 2,914評論 0 24
  • Git 是目前最流行的分布式版本控制系統(tǒng)之一。 版本控制指的是,記錄每次版本變更的內(nèi)容和時間等細(xì)節(jié),保留各版本之間...
    神齊閱讀 1,508評論 0 7
  • [TOC] Git 內(nèi)部實現(xiàn)原理剖析[http://www.itdecent.cn/p/8154ac47d406...
    Whyn閱讀 987評論 0 0

友情鏈接更多精彩內(nèi)容