
Git Logo
- Git 是什麼 ?
你是否有過這種經驗,同一份文件修改了4、5次,每次都得另存新檔,結果資料夾內堆滿了「最終版」、「最終版 2」、「真正的最終版」這類文件?甚至修改到後面發現方向錯了,或是第 2 版加上某版的修正才是正確的。這時候,你會深刻體會到「版本控制」的重要性。
Git 就是為了解決這些問題而誕生的,作為一種分散式版本控制系統 (Distributed Version Control System, DVCS),它能夠幫你回到任何一個歷史版本,並在多人協作時避免產生混亂。
另一種系統稱為集中式版本控制,附上兩者的差別,有興趣的讀者可以自行前往分散式版本控制 — 維基百科,自由的百科全書
本篇會以稍微程式經驗的角度做介紹,不會有太複雜的說明,以下會從最基本的文件建立開始,一步步帶你了解 Git 的核心概念與常用指令,完整掌握 Git 的使用方法。
若還沒有安裝 Git 套件的話,可以到官網下載
為了方便介紹,以一個簡單的 Python 專案的資料夾為例,逐步說明 Git 的基本操作。假設我們有個初始資料夾,結構如下:
# 初始資料夾
git-project\
git-project\ # 虛擬環境
main.py
輸入指令:
git init
這個步驟會初始化一個新的 Git 倉庫 (Repository),目錄下會生成一個隱藏的.git
文件,如果你使用 IDE (例如 VSCode),會發現 main.py
顏色發生變化,這表示它正在被 Git 追蹤。

git 追蹤示意
你可能會好奇,為什麼 git-porject
會沒被 Git 記錄?這就是下一步要介紹的文件 .gitignore
,展開虛擬環境 git-porject
會發現它的存在,* 表示忽略所有檔案。

.gitignore
通常,我們會將機密資料 (例如 .env
、 config
)或是非必要的套件 (例如虛擬環境 venv\
)列入 .gitignore
,以避免它們被納入版本控制。由於虛擬環境內部的.gitignore
紀錄不到外面,所以我們在外部的專案底下再建立一個,並且輸入以下內容,可以發現 git-project
顏色發生變化,這就是被忽略的檔案。

新增 .gitignore
假設程式完成一個段落,想要做一個版本紀錄,輸入指令:
# 添加至暫存區
git add .
然後再輸入:
# 檢查當前狀態
git status
可以看到下列的訊息:

git 當前狀態
main.py
與 .gitignore
被標記為「Changes to be committed」,表示目前被存入暫存區 (Staging Area),準備提交到本地倉庫。
接下來執行指令:
# 提交變更
git commit -m "initial commit"
# 檢查提交紀錄
git log
此時可以看到以下的提交紀錄:

git 提交紀錄
更詳細的資訊:
git log --stat

git log --stat
log 紀錄時間、版本 hash 編碼以及作者。 stat
可以看到異動過的文件,commit 之後的 hash 編碼它是用來標示唯一提交,未來管理分支、合併以及回朔到某個版本會需要它,下一篇會有更詳細的說明,這邊先不用在意。
commit 結果確認之後,接下來要把程式碼推上遠端倉庫(repository),這邊我們以 GitHub 為例,首先設定 remote URL位置 :
# 列出現有的 remote URL路徑
git remote -v
# 新增 URL路徑至 origin 上
git remote add origin <遠端倉庫的 URL>

倉庫的 URL
新增後再檢查一次 :

git remote -v
確認沒問題後即可推上 GitHub 的倉庫
*這邊有個小細節,GitHub 上預設的分支名稱是main
,而我們常用的可能是master
,如果希望名稱對齊可以將先將分支名稱修改後再推送,已經推送的遠端分支也能透過指令刪除 :
# 刪除遠端分支
git push origin --delete master
# 更改分支名稱
git branch -m master main
# 將想要的分支推上 origin
git push origin main
成功推送 :

成功推送

遠端倉庫
至此,基礎的版本控制就已經完成了,在下一篇『版本控制的藝術:Git 進階篇』中,我們將深入探討分支管理、遠端協作、處理合併衝突以及其他應用。如果內文有任何錯誤,麻煩留言指正我一下,非常感謝!