Git 筆記 02 - Git 的基本操作
tags: git
1. 獲取 Git 儲存庫的兩種方式
- 將尚未進行版本控制的本地目錄轉換為 git 儲存庫
- 從其他託管儲存庫中 clone 一個已存在的 git 儲存庫
2. 在現有的目錄中初始化儲存庫
如果自己有一個尚未進行版控的專案目錄,想要用 Git 來控制它,須執行下列兩步驟:
- 在專案目錄中打開 CMD 或是 git bash
- 執行
git init
指令將當前目錄轉換為 git 儲存庫
git init 指令會建立一個名為 .git 的隱藏檔案,這個 .git 檔案就是當前專案的 Git 儲存庫,裡面包含了初始的必要檔案,這些檔案是 Git 儲存庫的必要組成部分。
※ 查看隱藏檔案方法
3. 工作區中檔案的 4 種狀態
工作區的每一支檔案可能有 4 種狀態,這四種狀態共分為兩大類,如圖所示:
INFO
Git 操作的最終結果:讓工作區的檔案都處於未修改狀態
4. 檢查檔案狀態
可以使用 git status
指令查看檔案處於什麼狀態,例如:
在修改檔案清單中可以看到新建的 index.html 檔案處在 Untracked files (未追蹤的檔案) 下面。
未追蹤的檔案意味著 Git 在之前的提交中沒有這些檔案;Git 不會自動將之納入追蹤範圍,除非明確地告訴它 "我需要使用 Git 追蹤管理該檔案"。
5. 以精簡的方式顯示檔案狀態
使用 git status
輸出的修改檔案清單很詳細,但有些繁瑣。 如果希望以精簡的方式顯示檔案的狀態,可以使用如下兩條完全相等的指令,其中 -s 是 --short 的縮寫:
# 以精簡的方式顯示檔案狀態
git status -s
git status --short
未追蹤的檔案有紅色的 ?? 標記,例如:
6. 追蹤新檔案
使用指令 git add
開始追蹤一個檔案。 所以,要追蹤 index.html 檔案,只須執行如下指令即可:
git add index.html
此時再執行 git status
指令,會看到 index.html 檔案在 Changes to be committed 這行的下面,說明已被追蹤,並處於暫存狀態:
精簡模式則顯示為綠色的 A
7. 提交更新
現在暫存區有一個 index.html 等待被提交到 Git 儲存庫進行保存。 可以執行 git commit
指令進行提交,其中 -m 選項後面是本次的提交訊息,用來對提交的內容做進一步的描述:
git commit -m "新增了一個 index.html 檔案"
提交成功後,會出現以下的訊息:
提交成功後,再次檢查檔案的狀態,得到的提示如下:
證明工作區中所有的檔案都處於 "未修改" 狀態,沒有任何檔案需要提交。
8. 對已提交的檔案進行修改
目前,index.html 檔案已被 Git 追蹤,並且工作區與 Git 儲存庫中的 index.html 保持一致。 當我們修改了工作區中的 index.html 的內容之後,再次執行 git status
或是 git status -s
指令,會看到如下內容:
index.html 出現在 Changes not staged for commit 這行下面,說明已追蹤的檔案內容發生了改變,但還沒有放到暫存區。
9. 暫存已修改的檔案
目前,工作區中的 index.html 已被修改,如果要暫存這次修改,需要再次執行 git add
指令,這個指令是個多功能指令,主要有 3 個功用:
- 可以用它開始追蹤新檔案
- 把已追蹤的、且已修改的檔案放到暫存區
- 把有衝突的檔案標記為已解決狀態
10. 提交已暫存的檔案
再次執行 git commit -m "提交訊息"
指令,即可將暫存區中記錄的 index.html 的 commit,提交到 Git 儲存庫進行保管:
11. 撤銷對檔案的修改
撤銷操作的本質: 用 Git 儲存庫中的檔案覆蓋掉工作區指定的檔案,一般實際開發中比較少使用到。
撤銷對檔案的修改指的是:把對工作區中對應檔案的修改,還原成 Git 儲存庫中所保管的版本。 操作的結果:所有的改動會丟失,且無法恢復! 危險性較高,請慎重操作!
假設我改動了 index.html 裡面的內容,但是突然後悔了,此時使用 git checkout -- index.html
指令,即可撤銷對 index.html 的修改
12. 向暫存區中一次性添加多個檔案
如果需要被暫存的檔案比較多,可以使用如下的指令,一次性將所有新增或修改的檔案加入暫存區:
git add .
:::success 在實際開發中,會經常下這行指令,將新增和修改過後的檔案加到暫存區 :::
13. 取消暫存的檔案
如果想要從暫存區中移除對應的檔案,可以使用如下的指令:
git reset HEAD 要移除的檔案名稱
14. 跳過使用暫存區
Git 標準工作流程為工作區 → 暫存區 → Git 儲存庫,但有時候這麼做略為繁瑣,此時可以跳過暫存區,直接將工作區中的修改提交到 Git 儲存庫,這時候 Git 工作流程簡化為了工作區 → Git儲存庫。
Git 提供了一個跳過使用暫存區的方式,只要在提交的時候,給 git commit 加上 -a 選項,Git 就會自動把所有已經追蹤過的檔案暫存起來一併提交,從而跳過 git add 步驟:
git commit -a -m "提交訊息"
15. 移除檔案
從 Git 儲存庫中移除檔案的方式有兩種:
- 從 Git 儲存庫和工作區中同時移除對應檔案
- 只從 Git 儲存庫中移除指定檔案,但保留工作區中的對應檔案
# 從 Git 儲存庫和工作區中同時移除 index.js 檔案
git rm -f index.js
# 只從 Git 儲存庫中移除 index.css, 但保留工作區中的 index.css 檔案
git rm --cached index.css
16. 忽略檔案
一般我們總會有些檔案無須納入 Git 的管理,也不希望它出現在未追蹤的檔案列表。 在這種情況下,我們可以新建一個 .gitignore 的忽略檔案,將要忽略的檔案寫入至 .gitignore 製作忽略檔案清單。但是 .gitignore 本身是需要提交的。
.gitignore 的格式規範如下:
- 以 # 開頭是註釋
- 以 / 結尾的是目錄
- 以 / 開頭防止遞迴
- 以 ! 開頭表示取反
- 可以使用 glob 模式進行檔案和資料夾的匹配 (glob 指簡化的正規表示式)
17. glob 模式
所謂的 glob 模式即簡化了的正規表示式:
- 星號 * 匹配零個或多個任意字符
- [abc] 匹配任何一個列在中括號裡的字符 (此案例匹配一個 a 或匹配一個 b 或匹配一個 c)
- 問號 ? 指匹配一個任意字符
- 在中括號裡使用短橫槓分隔兩個字符,表示所有在這兩個字範圍內的都可以匹配 (比如 [0-9] 表示匹配 0 到 9 的數字)
- 兩個星號 ** 表示匹配任意中間目錄 (比如
a/**/z
可以匹配 a/z、a/b/z 或 a/b/c/z 等)
18. .gitignore
檔案的範例
# 忽略所有的 .a 文件
*.a
# 但追蹤所有的 lib.a, 即使你在前面忽略了 .a 文件
!lib.a
# 只忽略當前目錄下的 TODO 檔案, 而不忽略 subdir/TODO
/TODO
# 忽略任何目錄下名為 build 的資料夾
build/
# 忽略 doc/notes.txt 但不忽略 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目錄及其所有子目錄下的 .pdf 檔
doc/**/*.pdf
19. 查看提交歷史
如果希望回顧專案的提交歷史,可以使用 git log
這個簡單且有效的指令。
# 按時間先後順序列出所有的提交歷史,最近的提交排在最上面 (按 q 可以退出查看)
git log
# 只展示最新的兩條提交歷史,數字可以按需填寫
git log -2
# 在一行上展示最近兩條提交歷史的訊息
git log -2 --pretty=oneline
# 在一行上展示最近兩條提交歷史的訊息,並自定義輸出的格式
# %h提交的簡寫 hash 值 %an作者名字 %ar作者修訂日期,按多久以前的方式顯示 %s提交說明
git log -2 --pretty=format:"%h | %an | %ar | %s"
20. 退回到指定版本
# 在一行上展示所有提交歷史
git log --pretty=oneline
# 使用 git reset --hard 指令,根據指定的提交 ID 退回到指定版本
git reset --hard <commitID>
# 在舊版本中使用 git reflog --pretty=oneline 指令,查看指令操作的歷史
git reflog --pretty=oneline
# 再次根據最新的提交 ID,跳轉到最新的版本
git reset --hard <commitID>
21. 小結
- 初始化 Git 儲存庫
git init
- 查看檔案狀態
git status
或git status -s
- 一次性將多個檔案加入至暫存區
git add .
- 將暫存區中的檔案提交至 Git 儲存庫
git commit -m "提交訊息"