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 非常簡單。
- 前往 Git 官方網站 下載適用於 Windows 的安裝程式。
- 執行安裝程式,基本上按照預設選項一直點擊「Next」即可完成安裝。
安裝完成後,開啟終端機(例如 Command Prompt 或 Git Bash),你需要進行一些基本設定,告訴 Git 你的身份。每當你提交一個變更時,這些資訊將會被記錄下來。
# 設定你的使用者名稱
git config --global user.name "Your Name"
# 設定你的電子郵件
git config --global user.email "your.email@example.com"
你可以使用以下指令來檢查你的設定是否成功:
git config --list
🚀 建立你的第一個 Git 倉庫
有兩種常見的方式來開始一個 Git 專案:
1. 初始化一個新倉庫 (git init
)
如果你已經有一個專案資料夾,但還沒有使用 Git 進行版本控制,你可以在該資料夾內執行 git init
。
# 進入你的專案資料夾
cd my-project
# 初始化 Git 倉庫
git init
這個指令會在你的專案資料夾中建立一個隱藏的 .git
子目錄,所有版本控制相關的歷史和元數據都儲存在這裡。
2. 複製一個遠端倉庫 (git clone
)
如果你想參與一個已經存在於 GitHub 或其他平台上的專案,你需要使用 git clone
將它複製到你的本地電腦。
# 複製一個遠端的倉庫到你的電腦
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 最基本的工作流程就是 add
和 commit
的循環。這個流程確保了每一次儲存的歷史記錄都是一個有意義的、完整的變更單元。
修改文件:在你的工作目錄中,建立新文件或修改現有文件。
檢查狀態 (
git status
):這是你最常使用的指令之一。它會告訴你目前工作目錄和暫存區的狀態。bashgit status
你會看到哪些文件被修改了(modified)、哪些是新建立但未被追蹤的(untracked)。
加入暫存區 (
git add
):使用git add
將你想要包含在下一次 commit 中的變更,從工作目錄移到暫存區。bash# 將特定檔案加入暫存區 git add file1.txt # 將所有變更(新增、修改、刪除)加入暫存區 git add .
提交變更 (
git commit
):使用git commit
將暫存區中的所有變更永久儲存到你的本地倉庫。每次 commit 都需要附上一段訊息,清楚描述這次變更的內容。bashgit 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
。bashgit 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 會在有衝突的文件中用特殊標記(<<<<<<<
, =======
, >>>>>>>
)標示出衝突的部分。你需要手動編輯這些文件,解決衝突(即決定要保留哪一部分的代碼,或將兩者結合),然後再次 add
和 commit
來完成這次合併。解決衝突是團隊協作中必須掌握的技能。
📋 常用指令總結
以下是本文提到的常用 Git 指令總結表:
指令 | 範例 | 描述 |
---|---|---|
git config | git config --global user.name "John" | 設定 Git 的使用者資訊。 |
git init | git init | 在目前資料夾初始化一個新的本地倉庫。 |
git clone | git clone [url] | 複製一個遠端倉庫到本地。 |
git status | git status | 顯示工作目錄和暫存區的狀態。 |
git add | git add . | 將文件變更加入到暫存區。 |
git commit | git commit -m "Message" | 將暫存區的內容提交到本地倉庫。 |
git restore | git restore file.txt | 撤銷工作目錄中對文件的修改。 |
git checkout | git checkout dev-branch | 切換分支或恢復文件。 |
git rm | git rm old.txt | 從工作目錄和索引中刪除文件。 |
git stash | git stash | 臨時儲存未提交的變更。 |
git push | git push origin main | 將本地 commit 推送到遠端倉庫。 |
git pull | git pull origin main | 從遠端倉庫拉取變更並合併。 |
git fetch | git fetch origin | 從遠端倉庫下載變更,但不合併。 |
Git 是一個功能極其豐富的工具,本文僅涵蓋了最基礎和核心的部分。掌握這些基本指令,你就可以開始使用 Git 來管理你的個人專案,並為參與團隊協作打下堅實的基礎。