Git 基本操作:掌握版本控制的核心技能

在上一篇文章中,我們已經成功安裝並設定了 Git。今天,我們要開始實際操作,學習 Git 的核心功能。就像學開車一樣,理論很重要,但真正的技能來自於實際操作。

建立你的第一個 Git 倉庫

方法一:從零開始建立倉庫(git init)

假設你要開始一個新的專案,首先建立一個資料夾:

# 建立專案資料夾
mkdir my-first-project
cd my-first-project

# 初始化 Git 倉庫
git init

執行 git init 後,你會看到類似這樣的訊息:

Initialized empty Git repository in /Users/username/my-first-project/.git/

這就像在你的專案資料夾中設置了一個「監控攝影機」,從現在開始,Git 會開始記錄這個資料夾中所有檔案的變化。

方法二:複製現有的倉庫(git clone)

如果你要參與一個已經存在的專案,可以使用 git clone

# 複製遠端倉庫到本地
git clone https://github.com/username/repository-name.git

# 複製後進入專案資料夾
cd repository-name

這就像是得到一本書的完整影印本,包含所有的內容和歷史記錄。

理解檔案的生命週期

在 Git 中,每個檔案都有四種可能的狀態,理解這些狀態對於掌握 Git 至關重要:

1. Untracked(未追蹤)

這些是 Git 不知道存在的檔案,就像你桌上有一張新的便條紙,但你還沒有決定要不要把它放進檔案夾。

2. Unmodified(未修改)

這些檔案已經被 Git 追蹤,且內容沒有改變,就像檔案夾中已經歸檔且沒有更動的文件。

3. Modified(已修改)

你已經修改了這些檔案,但還沒有告訴 Git 你想要保存這些變更,就像你在文件上做了筆記,但還沒有正式簽名確認。

4. Staged(已暫存)

你已經告訴 Git 要在下次提交時包含這些變更,就像你已經把要寄出的信件放在桌上的「待寄」區域。

檢查倉庫狀態

在進行任何操作之前,先檢查目前的狀態是個好習慣:

git status

剛初始化的空倉庫會顯示:

On branch main

No commits yet

nothing to commit (create/copy files and use "git add" to track)

這告訴我們:

  • 目前在 main 分支上
  • 還沒有任何提交記錄
  • 沒有檔案需要處理

開始追蹤檔案

讓我們建立第一個檔案:

# 建立一個簡單的文字檔
echo "Hello, Git!" > README.txt

再次檢查狀態:

git status

現在你會看到:

On branch main

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	README.txt

nothing added to commit but untracked files present (use "git add" to track)

Git 發現了新檔案 README.txt,但它還在 “Untracked” 狀態。

將檔案加入暫存區

git add README.txt

再檢查一次狀態:

git status

現在顯示:

On branch main

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
	new file:   README.txt

檔案現在已經在暫存區中,準備被提交。

一次加入多個檔案

如果你有多個檔案要加入暫存區:

# 加入特定檔案
git add file1.txt file2.txt

# 加入所有新檔案和修改的檔案
git add .

# 加入所有 .txt 檔案
git add *.txt

# 加入特定資料夾中的所有檔案
git add src/

作為工程師,我建議初學者先習慣明確指定檔案名稱,避免意外加入不想要的檔案。

提交變更

將檔案加入暫存區後,就可以進行提交:

git commit -m "新增 README 檔案"

你會看到類似的輸出:

[main (root-commit) a1b2c3d] 新增 README 檔案
 1 file changed, 1 insertion(+)
 create mode 100644 README.txt

這表示:

  • 在 main 分支上建立了第一次提交
  • 提交的 ID 是 a1b2c3d(實際會是不同的數字)
  • 有 1 個檔案改變,新增了 1 行內容

提交訊息的最佳實踐

好的提交訊息應該:

  • 簡潔明瞭,說明這次改變做了什麼
  • 使用現在式動詞(例如:「修復」而不是「修復了」)
  • 第一行不超過 50 個字元
  • 如需詳細說明,空一行後再寫
# 好的提交訊息範例
git commit -m "修復使用者登入驗證邏輯"
git commit -m "新增產品搜尋功能"
git commit -m "更新使用者介面樣式"

# 不好的提交訊息範例
git commit -m "修復"
git commit -m "更新一些東西"
git commit -m "WIP"  # Work In Progress

查看提交歷史

git log

輸出會類似:

commit a1b2c3d4e5f6789... (HEAD -> main)
Author: 張小明 <ming@example.com>
Date:   Mon Jan 15 14:30:25 2024 +0800

    新增 README 檔案

更簡潔的歷史檢視

# 一行顯示一次提交
git log --oneline

# 顯示最近 3 次提交
git log --oneline -3

# 顯示檔案變更統計
git log --stat

修改檔案並再次提交

讓我們修改 README.txt:

echo "這是我的第一個 Git 專案" >> README.txt

檢查狀態:

git status

你會看到:

On branch main
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   README.txt

no changes added to commit (use "git add" to add changes)

檔案現在處於 “Modified” 狀態。

查看具體的變更內容

git diff

這會顯示檔案的具體變更:

diff --git a/README.txt b/README.txt
index 10ddd6d..e3f5a47 100644
--- a/README.txt
+++ b/README.txt
@@ -1 +1,2 @@
 Hello, Git!
+這是我的第一個 Git 專案

符號說明:

  • + 表示新增的行
  • - 表示刪除的行
  • 沒有符號的行表示沒有變更

暫存並提交修改

git add README.txt
git commit -m "在 README 中新增專案描述"

一次性加入和提交

對於已經被追蹤的檔案,你可以跳過暫存步驟:

# 這個指令只對已追蹤的檔案有效
git commit -am "快速提交已追蹤檔案的變更"

注意:這個指令不會處理新檔案(Untracked files)。

.gitignore 的使用

在實際開發中,有些檔案我們不想被 Git 追蹤,例如:

  • 編譯產生的檔案
  • 暫存檔案
  • 包含密碼的設定檔
  • 作業系統產生的系統檔

建立 .gitignore 檔案:

# 建立 .gitignore 檔案
touch .gitignore

在檔案中加入要忽略的規則:

# 忽略所有 .log 檔案
*.log

# 忽略特定檔案
secret-config.txt

# 忽略特定資料夾
temp/
build/

# 忽略所有 .tmp 檔案,但保留 important.tmp
*.tmp
!important.tmp

.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

復原變更的不同方法

復原工作區的變更(還沒加入暫存區)

# 復原特定檔案
git restore README.txt

# 復原所有變更
git restore .

取消暫存(已經 git add,但還沒 commit)

# 取消特定檔案的暫存
git restore --staged README.txt

# 取消所有檔案的暫存
git restore --staged .

修改最後一次提交

如果你發現最後一次提交有錯誤,可以修改:

# 修改提交訊息
git commit --amend -m "修正後的提交訊息"

# 在最後一次提交中加入忘記的檔案
git add forgotten-file.txt
git commit --amend --no-edit

實用的檢視指令

查看暫存區和工作區的差異

# 查看尚未暫存的變更
git diff

# 查看已暫存的變更
git diff --staged

# 查看特定檔案的變更
git diff README.txt

查看檔案的提交歷史

# 查看特定檔案的修改歷史
git log README.txt

# 查看檔案每一行是誰修改的
git blame README.txt

建立有意義的專案結構

讓我們建立一個更完整的專案結構:

# 建立資料夾結構
mkdir src docs tests
touch src/main.py docs/README.md tests/test_main.py

# 建立 .gitignore
cat > .gitignore << EOF
# Python
__pycache__/
*.pyc
*.pyo

# 編輯器
.vscode/
*.swp

# 作業系統
.DS_Store
Thumbs.db
EOF

# 加入所有檔案並提交
git add .
git commit -m "建立基本專案結構"

常見的新手錯誤與解決方法

錯誤 1:忘記設定使用者資訊

Author identity unknown

解決方法:

git config --global user.name "你的姓名"
git config --global user.email "your.email@example.com"

錯誤 2:提交了不該提交的檔案

如果檔案還沒有 push 到遠端:

# 從最後一次提交中移除檔案,但保留在工作區
git reset --soft HEAD~1
git reset HEAD unwanted-file.txt
git commit -m "修正後的提交"

錯誤 3:提交訊息寫錯

# 修改最後一次提交的訊息
git commit --amend -m "正確的提交訊息"

檢查和維護倉庫健康

定期檢查倉庫狀態是個好習慣:

# 檢查倉庫狀態
git status

# 檢查是否有未追蹤的檔案
git ls-files --others --exclude-standard

# 檢查倉庫的完整性
git fsck

小結

今天我們學習了 Git 的基本操作,這些是你日常開發中最常用的指令:

  1. 建立倉庫git initgit clone
  2. 檢查狀態git status(這是最重要的指令之一)
  3. 追蹤檔案git add
  4. 提交變更git commit
  5. 查看歷史git log
  6. 查看差異git diff
  7. 復原變更git restore

記住這個基本流程:

修改檔案 → git add → git commit → 重複

在下一篇文章中,我們將學習 Git 的分支功能,這是 Git 最強大的特色之一。分支讓你可以同時進行多個功能開發,而不會互相干擾。


練習是掌握 Git 的關鍵。我建議你建立一個練習用的倉庫,嘗試今天學到的所有指令。犯錯是學習的一部分,在練習環境中大膽嘗試,這樣在真正的專案中你就會更有信心。

404NOTE
404NOTE
文章: 40

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *