什麼是Git,怎麼使用Git,一篇就夠了

2020-08-11 16:16:46

什麼是Git

Git 是一個開源的分佈式版本控制系統,是目前世界上最先進、最流行的版本控制系統。可以快速高效地處理從很小到非常大的專案版本管理。

特點:專案越大越複雜,協同開發者越多,越能體現出 Git 的高效能和高可用性!

Git 的特性

Git 之所以快速和高效,主要依賴於它的如下兩個特性:
① 直接記錄快照,而非差異比較
② 近乎所有操作都是本地執行

Git 的記錄快照

Git 快照是在原有檔案版本的基礎上重新生成一份新的檔案,類似於備份。爲了效率,如果檔案沒有修改,Git 不再重新儲存該檔案,而是隻保留一個鏈接指向之前儲存的檔案。
缺點:佔用磁碟空間較大
優點: 版本切換時非常快,因爲每個版本都是完整的檔案快照,切換版本時直接恢復目標版本的快照即可。
特點: 空間換時間
近乎所有操作都是本地執行
在 Git 中的絕大多數操作都只需要存取本地檔案和資源,一般不需要來自網路上其它計算機的資訊
特性
① 斷網後依舊可以在本地對專案進行版本管理
② 聯網後,把本地修改的記錄同步到雲端伺服器即可

Git 中的三個區域

使用 Git 管理的專案,擁有三個區域,分別是工作區、暫存區、Git 倉庫

Git 中的三種狀態

  • 已修改 modified
    • 表示修改了檔案,但還沒將修改的結果放到暫存區
  • 已暫存 staged
    • 表示對已修改檔案的當前版本做了標記,使之包含在下次提交的列表中
  • 已提交 committed
    • 表示檔案已經安全地儲存在原生的 Git 倉庫中
      注意:
  • 工作區的檔案被修改了,但還沒有放到暫存區,就是已修改狀態。
  • 如果檔案已修改並放入暫存區,就屬於已暫存狀態。
  • 如果 Git 倉庫中儲存着特定版本的檔案,就屬於已提交狀態。

基本的 Git 工作流程如下:
① 在工作區中修改檔案
② 將你想要下次提交的更改進行暫存
③ 提交更新,找到暫存區的檔案,將快照永久性儲存到 Git 倉庫

安裝並設定 Git

在 Windows 中下載並安裝 Git
在開始使用 Git 管理專案的版本之前,需要將它安裝到計算機上。可以使用瀏覽器存取如下的網址,根據自己的操作系統,選擇下載對應的 Git 安裝包: https://git-scm.com/downloads

設定使用者資訊
安裝完 Git 之後,要做的第一件事就是設定自己的使用者名稱和郵件地址。因爲通過 Git 對專案進行版本管理的時候,Git 需要使用這些基本資訊,來記錄是誰對專案進行了操作:

git config --global user.name "xxx"
git config --global user.email "[email protected]"

注意:如果使用了 --global 選項,那麼該命令只需要執行一次,即可永久生效。

Git 的全域性組態檔

通過 git config --global user.name 和 git config --global user.email 設定的使用者名稱和郵箱地址,會被寫入到 C:/Users/使用者名稱資料夾/.gitconfig 檔案中。這個檔案是 Git 的全域性組態檔,設定一次即可永久生效。

可以使用記事本開啓此檔案,從而檢視自己曾經對 Git 做了哪些全域性性的設定。

檢查設定資訊
除了使用記事本檢視全域性的設定資訊之外,還可以執行如下的終端命令,快速的檢視 Git 的全域性設定資訊:
檢視所有的全域性設定項
git config --list --global
檢視指定的全域性設定項
git config user.name
git config user.email

獲取幫助資訊
可以使用 git help 命令,無需聯網即可在瀏覽器中開啓幫助手冊,例如:

# 開啓 git config 命令的幫助手冊
git help config

如果不想檢視完整的手冊,那麼可以用 -h 選項獲得更簡明的「help」輸出:

想要獲取 git config 命令的快速參考
 git config -h

Git 的基本操作

獲取 Git 倉庫的兩種方式
① 將尚未進行版本控制的本地目錄轉換爲 Git 倉庫
② 從其它伺服器克隆一個已存在的 Git 倉庫
以上兩種方式都能夠在自己的電腦上得到一個可用的 Git 倉庫

在現有目錄中初始化倉庫

如果自己有一個尚未進行版本控制的專案目錄,想要用 Git 來控制它,需要執行如下兩個步驟:
① 在專案目錄中,通過滑鼠右鍵開啓「Git Bash」
② 執行 git init 命令將當前的目錄轉化爲 Git 倉庫

git init 命令會建立一個名爲 .git 的隱藏目錄,這個 .git 目錄就是當前專案的 Git 倉庫,裏面包含了初始的必要檔案,這些檔案是 Git 倉庫的必要組成部分

工作區中檔案的 4 種狀態
未跟蹤(不被git所管理的檔案) 未修改(工作區中內容和git倉庫檔案保持一致)
已修改(工作區中內容和git倉庫檔案不一致)已暫存(工作區被修改的檔案已被放入暫存區,準備將修改後的檔案儲存到git倉庫中)
Git 操作的終極結果:讓工作區中的檔案都處於「未修改」的狀態。

檢查檔案的狀態 可以使用 git status 命令檢視檔案處於什麼狀態
以精簡的方式顯示檔案狀態

git status -s
git status --short

跟蹤新檔案

git add index.html

如果檔案過多,你項跟蹤目錄下所有檔案

git add *.*

提交更新
現在暫存區中有一個 index.html 檔案等待被提交到 Git 倉庫中進行儲存。可以執行 git commit 命令進行提交,其中 -m 選項後面是本次的提交訊息,用來對提交的內容做進一步的描述:

git commit -m "新建了index.html 檔案"

向暫存區中一次性新增多個檔案
如果需要被暫存的檔案個數比較多,可以使用如下的命令,一次性將所有的新增和修改過的檔案加入暫存區:

git add .

取消暫存的檔案
如果需要從暫存區中移除對應的檔案,可以使用如下的命令:

git reset HEAD 要移出的檔名稱

跳過使用暫存區域
Git 標準的工作流程是工作區 → 暫存區 → Git 倉庫,但有時候這麼做略顯繁瑣,此時可以跳過暫存區,直接將工作區中的修改提交到 Git 倉庫,這時候 Git 工作的流程簡化爲了工作區 → Git 倉庫

Git 提供了一個跳過使用暫存區域的方式, 只要在提交的時候,給 git commit 加上 -a 選項,Git 就會自動把所有已經跟蹤過的檔案暫存起來一併提交,從而跳過 git add 步驟:

git commit -a -m "日誌資訊"

移除檔案
從 Git 倉庫中移除檔案的方式有兩種:
① 從 Git 倉庫和工作區中同時移除對應的檔案
② 只從 Git 倉庫中移除指定的檔案,但保留工作區中對應的檔案

從 Git倉庫和工作區中同時移除 index.js 檔案
git rm -f index.js
#只從 Git 倉庫中移除 index.css,但保留工作區中的 index.css 檔案
git rm --cached index.css

忽略檔案
一般我們總會有些檔案無需納入 Git 的管理,也不希望它們總出現在未跟蹤檔案列表。 在這種情況下,我們可以建立一個名爲 .gitignore 的組態檔,列出要忽略的檔案的匹配模式
檔案 .gitignore 的格式規範如下:
① 以 # 開頭的是註釋
② 以 / 結尾的是目錄
③ 以 / 開頭防止遞回
④ 以 ! 開頭表示取反
⑤ 可以使用 glob 模式進行檔案和資料夾的匹配(glob 指簡化了的正則表達式)

  • 星號 * 匹配零個或多個任意字元
  • [abc] 匹配任何一個列在方括號中的字元 (此案例匹配一個 a 或匹配一個 b 或匹配一個 c)
  • 問號 ? 只匹配一個任意字元
  • 兩個星號 ** 表示匹配任意中間目錄(比如 a/**/z 可以匹配 a/z 、 a/b/z 或 a/b/c/z 等)
  • 在方括號中使用短劃線分隔兩個字元, 表示所有在這兩個字元範圍內的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的數位)

檢視提交歷史
如果希望回顧專案的提交歷史,可以使用 git log 這個簡單且有效的命令

 按時間先後順序列出所有的提交歷史,最近的提交在最上面
 git log
只展示最新的兩條提交歷史,數位可以按需進行填寫
git log -2
在一行上展示最近兩條提交歷史的資訊
git log -2 --pretty=oneline
#在一行上展示最近兩條提交歷史資訊,並自定義輸出的格式
#&h 提交的簡寫雜湊值  %an 作者名字  %ar 作者修訂日誌  %s 提交說明
git log -2 --pretty=format:"%h | %an | %ar | %s"

回退到指定的版本

 在一行上展示所有的提交歷史
git log --pretty=oneline
#使用 git reset --hard 命令,根據指定的提交 ID 回退到指定版本
git reset --hard <CommitID>
#在舊版本中使用 git reflog --pretty=oneline 命令,檢視命令操作的歷史
git reflog --pretty=onelone
再次根據最新的提交 ID,跳轉到最新的版本
git reset --hard <CommitID>