Skip to content

Git 入門

對於軟件開發者來說,Git 就像可以回到過去的時光機器。在開發過程中,追蹤和管理代碼的變更至關重要。版本控制系統(Version Control System, VCS)能記錄每一次代碼的修改歷史,讓開發者可以輕鬆地回到過去的任何一個版本,並促進團隊協作。Git 是當今最流行、最強大的分佈式版本控制系統,幾乎是所有開發者的必備技能。

這篇文章將帶你從零開始學習 Git,了解它的核心概念,並掌握最常用的指令。文章會專注於使用指令列(Command Line Interface, CLI)來操作 Git,因為這是最直接且功能最強大的方式。

🤔 Git、GitHub 與相關工具

初學者常常會混淆 Git 和 GitHub,讓我們先來釐清它們的關係。

  • Git:是一個工具,一個安裝在你電腦上的版本控制軟件。它在本地運行,負責追蹤你專案中所有文件的變更歷史。你可以把它想像成一個擁有「時光機」功能的本地數據庫。

  • GitHub:是一個服務,一個基於 Git 的網頁託管平台。它提供一個遠端的伺服器,讓你儲存你的 Git 倉庫(Repository),方便你備份代碼、與他人協作。簡單來說 GitHub 可以託管 Git 倉庫,還可以公開 Git 倉庫。

GitHub 是最著名的 Git 託管服務,但它並不是唯一的選擇,還有其他平台如 GitLab 和 Bitbucket。

此外,許多現代的代碼編輯器,如 Visual Studio Code (VSC),都內置了 Git 整合功能。這讓你可以在圖形化使用者介面(GUI)中完成大部分 Git 操作,例如提交(Commit)或推送(Push)。儘管 GUI 很方便,但學習指令列操作能讓你更深入地理解 Git 的運作原理。本文將專注於指令列的教學。

🛠️ 安裝與設定 Git

在 Windows 環境下安裝 Git 非常簡單。

  1. 前往 Git 官方網站 下載適用於 Windows 的安裝程式。
  2. 執行安裝程式,基本上按照預設選項一直點擊「Next」即可完成安裝。

安裝完成後,開啟終端機(例如 Command Prompt 或 Git Bash),你需要進行一些基本設定,告訴 Git 你的身份。每當你提交一個變更時,這些資訊將會被記錄下來。

bash
# 設定你的使用者名稱
git config --global user.name "Your Name"

# 設定你的電子郵件
git config --global user.email "your.email@example.com"

你可以使用以下指令來檢查你的設定是否成功:

bash
git config --list

🚀 建立你的第一個 Git 倉庫

有兩種常見的方式來開始一個 Git 專案:

1. 初始化一個新倉庫 (git init)

如果你已經有一個專案資料夾,但還沒有使用 Git 進行版本控制,你可以在該資料夾內執行 git init

bash
# 進入你的專案資料夾
cd my-project

# 初始化 Git 倉庫
git init

這個指令會在你的專案資料夾中建立一個隱藏的 .git 子目錄,所有版本控制相關的歷史和元數據都儲存在這裡。

2. 複製一個遠端倉庫 (git clone)

如果你想參與一個已經存在於 GitHub 或其他平台上的專案,你需要使用 git clone 將它複製到你的本地電腦。

bash
# 複製一個遠端的倉庫到你的電腦
git clone https://github.com/psf/requests.git

這會建立一個名為 requests 的資料夾,其中包含了該專案的所有文件和完整的版本歷史。

關於 .gitignore 文件

在專案中,通常會有一些不需要被 Git 追蹤的文件,例如編譯後的檔案、日誌文件或包含敏感資訊的設定檔(如 env 文件)。你可以在專案的根目錄下建立一個名為 .gitignore 的文件,並在其中列出你希望 Git 忽略的文件或資料夾模式。

一個簡單的 .gitignore 範例如下:

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

# 忽略 node_modules 資料夾
/node_modules

# 忽略 .env 檔案
.env

🧠 Git 核心概念

要有效地使用 Git,理解其核心概念是至關重要的。下面是 Git 工作流程中最重要的幾個術語。

術語 (Term)中文解釋
Working Directory工作目錄你在電腦上實際看到和編輯的專案資料夾。
Staging Area暫存區一個中介區域,用來存放你準備要提交的變更。它像是一個購物籃,讓你在「結帳」前決定要買哪些東西。
Local Repository本地倉庫儲存在你電腦上(.git 資料夾內)的版本數據庫,包含了專案所有的提交歷史。
Remote Repository遠端倉庫託管在伺服器上(如 GitHub)的倉庫,用於團隊協作和備份。
Commit提交將暫存區中的變更永久儲存到本地倉庫的動作,每次 commit 都會產生一個獨一無二的快照。
Branch分支專案開發的一條獨立線。可以讓你開發新功能而不影響主要(main)分支的穩定性。
HEAD一個指標,指向你當前所在的本地分支的最新一次 commit。
Checkout簽出用來切換分支,或將工作目錄恢復到某個特定的 commit 狀態。
Restore還原用於撤銷工作目錄或暫存區中的變更。
Stash暫存臨時儲存尚未提交的變更,讓你可以切換到其他分支工作,之後再回來繼續。
Push推送將本地倉庫的 commit 上傳到遠端倉庫。
Pull拉取從遠端倉庫下載最新的變更,並自動與你的本地分支合併 (fetch + merge)。
Fetch擷取從遠端倉庫下載最新的變更,但不會自動合併。

✍️ 基本工作流程:Add & Commit

Git 最基本的工作流程就是 addcommit 的循環。這個流程確保了每一次儲存的歷史記錄都是一個有意義的、完整的變更單元。

  1. 修改文件:在你的工作目錄中,建立新文件或修改現有文件。

  2. 檢查狀態 (git status):這是你最常使用的指令之一。它會告訴你目前工作目錄和暫存區的狀態。

    bash
    git status

    你會看到哪些文件被修改了(modified)、哪些是新建立但未被追蹤的(untracked)。

  3. 加入暫存區 (git add):使用 git add 將你想要包含在下一次 commit 中的變更,從工作目錄移到暫存區。

    bash
    # 將特定檔案加入暫存區
    git add file1.txt
    
    # 將所有變更(新增、修改、刪除)加入暫存區
    git add .
  4. 提交變更 (git commit):使用 git commit 將暫存區中的所有變更永久儲存到你的本地倉庫。每次 commit 都需要附上一段訊息,清楚描述這次變更的內容。

    bash
    git commit -m "Add new feature for user login"

這個 add -> commit 的流程就像是為你的專案建立一個個「存檔點」。如果之後的開發出了問題,你可以隨時利用這些存檔點回溯到任何一個穩定的狀態,這對於軟件開發和除錯非常有幫助。

⏪ 管理與撤銷變更

人非聖賢,孰能無過。寫錯代碼或提交了不該提交的內容是常有的事。Git 提供了多種方式來管理和撤銷變更。

  • 撤銷工作目錄的變更:如果你修改了一個文件但還沒 add,想放棄這些修改,可以使用 git restore

    bash
    # 拋棄特定檔案在工作目錄中的修改
    git restore index.html
  • 將文件移出暫存區:如果你不小心 add 了一個文件到暫存區,但不想將它包含在下一次 commit 中,可以使用 git restore --staged

    bash
    # 將特定檔案從暫存區移回工作目錄
    git restore --staged config.js
  • 查看歷史版本:如果你想查看某個舊版本的樣貌,可以使用 git checkout 搭配 commit 的雜湊值(commit hash)。

    bash
    # 切換到某個特定的 commit 狀態(這會進入 "detached HEAD" 狀態)
    git checkout a1b2c3d4
    
    # 完成查看後,切換回你的主要分支
    git checkout main
  • 刪除文件:如果你想刪除一個文件,並讓 Git 記錄這次刪除,使用 git rm

    bash
    git rm old-file.txt
    git commit -m "Remove obsolete file"

    這相當於手動刪除文件後再執行 git add old-file.txt

  • 臨時儲存工作 (git stash):假設你正在開發一個功能,但突然需要切換到另一個分支修復緊急 bug。你的工作還沒完成,不想 commit。這時 git stash 就派上用場了。

    bash
    # 儲存當前的所有變更
    git stash
    
    # ... 切換分支去修 bug ...
    # 修完後切回來
    
    # 取回之前儲存的變更並繼續工作
    git stash pop

☁️ 與遠端倉庫協作

當你與團隊合作時,你需要與遠端倉庫(例如 GitHub)進行互動。

  • 推送變更 (git push):當你在本地完成了一些 commit 後,你需要使用 git push 將這些變更上傳到遠端倉庫,讓其他人也能看到你的工作。

    bash
    # 將當前分支的 commit 推送到名為 origin 的遠端倉庫
    git push origin main
  • 拉取變更 (git pull):在開始新工作前,一個好習慣是先用 git pull 從遠端倉庫獲取最新的版本,確保你的本地倉庫與遠端同步。

    bash
    # 從遠端倉庫拉取最新變更並合併到當前分支
    git pull origin main

關於衝突 (Conflict)

當你執行 git pull 時,如果遠端倉庫的變更和你本地的變更修改了同一個文件的同一部分,Git 將無法自動合併它們,這時就會產生衝突(Conflict)

Git 會在有衝突的文件中用特殊標記(<<<<<<<, =======, >>>>>>>)標示出衝突的部分。你需要手動編輯這些文件,解決衝突(即決定要保留哪一部分的代碼,或將兩者結合),然後再次 addcommit 來完成這次合併。解決衝突是團隊協作中必須掌握的技能。

📋 常用指令總結

以下是本文提到的常用 Git 指令總結表:

指令範例描述
git configgit config --global user.name "John"設定 Git 的使用者資訊。
git initgit init在目前資料夾初始化一個新的本地倉庫。
git clonegit clone [url]複製一個遠端倉庫到本地。
git statusgit status顯示工作目錄和暫存區的狀態。
git addgit add .將文件變更加入到暫存區。
git commitgit commit -m "Message"將暫存區的內容提交到本地倉庫。
git restoregit restore file.txt撤銷工作目錄中對文件的修改。
git checkoutgit checkout dev-branch切換分支或恢復文件。
git rmgit rm old.txt從工作目錄和索引中刪除文件。
git stashgit stash臨時儲存未提交的變更。
git pushgit push origin main將本地 commit 推送到遠端倉庫。
git pullgit pull origin main從遠端倉庫拉取變更並合併。
git fetchgit fetch origin從遠端倉庫下載變更,但不合併。

Git 是一個功能極其豐富的工具,本文僅涵蓋了最基礎和核心的部分。掌握這些基本指令,你就可以開始使用 Git 來管理你的個人專案,並為參與團隊協作打下堅實的基礎。

📚 參考資料

KF Software House