Git
Git 基本概念說明
Git 是什麼?
- Git 是一個分散式版本控制系統 (DVCS),主要用來追蹤檔案變化,尤其是程式碼。
- 每個人本地端都有完整的版本歷史 → 不依賴中央伺服器也能工作。
三大區域 (工作流程核心)
Git 把檔案管理分為三個區域:👉 流程: 工作目錄 → git add → 暫存區 → git commit → 儲存庫
- 工作目錄 (Working Directory)
- 你實際編輯檔案的地方。
- 可以修改、建立、刪除檔案。
- 暫存區 (Staging Area / Index)
- 透過
git add
放進來的檔案。 - 表示「準備好要提交的變更」。
- 透過
- 儲存庫 (Repository / .git 目錄)
- 透過
git commit
把暫存區的內容永久記錄下來。 - 包含完整歷史記錄 (commits, branches, tags)。
- 透過
版本控制 (Commits)
- Commit 就像是一個「代碼快照」 (snapshot)。
- 每次 Commit 都有:
- 唯一的 SHA-1 ID
- 提交訊息
- 作者資訊
- 指向「前一個 Commit」的連結 (形成時間線/樹狀結構)。
分支 (Branches)
- 分支是指向 Commit 的指標 (Pointer)。
- 預設分支:
main
(舊版是master
)。 - 新建分支:相當於建立一條「開發支線」,不會影響主線。
- 常見工作流:
main
/master
→ 穩定版本develop
→ 主要開發線feature/*
→ 功能分支hotfix/*
→ 緊急修補
合併 (Merge / Rebase)
- Merge:把兩個分支歷史合併在一起。
git merge
→ 可以產生一個「合併提交」。git merge --no-ff
→ 保留完整合併紀錄。
- Rebase:把一條分支移動到另一條分支的最新點上。
- 清爽線性紀錄 ,但會改歷史 (要小心)。
遠端儲存庫 (Remote)
- 遠端是另一個 Repository,通常在伺服器 (GitHub / GitLab / Gitea)。
- 常見指令:
git clone
→ 複製遠端庫git remote add origin <url>
→ 新增遠端git push
→ 把本地提交推上去git pull
→ 把遠端資料抓下來、合併到本地git fetch
→ 單純抓資料 (不合併)
Tag (標籤)
- 標籤是用來標記 Commit 的「特殊名稱」。
- 常用在版本管理,例如
v1.0.0
。 - 有兩種:
- 輕量標籤:只是指向某個提交。
- 附註標籤:帶有訊息、時間、簽名。
Stash (暫存工作進度)
-
場景:工作到一半但需要切換分支 → 又不想 Commit 半成品。
-
解法:
bashgit stash *# 暫存變更* git stash pop *# 取回*
常見工作流 (實務)
- Clone or 建立本地庫
- 修改檔案
git add
→ 放進暫存區git commit
→ 建立版本快照git push
→ 推送到遠端git pull
/git fetch
→ 與團隊同步
Git 常用指令整理 (Cheat Sheet)
基本設定
git config --global user.name "<使用者名字>"
git config --global user.email "<電子信箱>"
建議加上 git config --global init.defaultBranch main,
避免不同 Git 版本預設分支不一致 (master / main 問題)。
新增儲存庫
git init *# 初始化本地儲存庫*
git init --bare *# 建立裸庫 (通常用於伺服器端共享)*
本地儲存庫 (工作目錄下的 .git):包含 版本資訊 + 索引 (Index/Stage) + 狀態資訊 共用儲存庫 (bare repository):只有 版本物件 (Objects),沒有工作目錄。常用於 遠端/伺服器。
狀態檢查與操作
git status *# 查看目前狀態*
git add <file>... *# 加入檔案到暫存區*
git commit -m "訊息" *# 提交*
git log *# 查看提交歷史*
gitk *# 圖形化歷史 (需安裝 gitk)*
檔案與版本回溯
git checkout <branch|commit|file> *# 切換分支 / 回復檔案*
git reset --soft <commit> *# 保留工作目錄與暫存,回到特定提交*
git reset --hard <commit> *# 移除所有變更,回到特定提交*
git revert <commit> *# 建立新提交,撤銷某次提交 (安全做法)*
分支 (Branch)
-
建立、切換
git branch <branch> *# 建立分支* git checkout <branch> *# 切換分支* git checkout -b <branch> *# 建立 + 切換*
-
刪除
git branch -d <branch> *# 刪除分支 (僅已合併)* git branch -D <branch> *# 強制刪除 (即便未合併)*
-
合併
git checkout master git merge hotfix *# 標準合併* git merge --no-ff hotfix *# 保留合併紀錄* git reset --hard ORIG_HEAD *# 回復合併前狀態*
標籤 (Tag)
git tag <tag> *# 建立輕量標籤*
git tag -a <tag> -m "訊息" *# 建立附註標籤*
git show <tag> *# 查看標籤對應提交*
git push origin <tag> *# 推送指定標籤*
git push origin --tags *# 推送所有標籤*
遠端操作
-
git push -u <remote name> <branch name>
參數 -u 等同於 --set-upstream,設定 upstream 可以使分支開始追蹤指定的遠端分支。換句話說,它會將本地分支與遠端分支建立一個關聯,讓你在下次推送時可以直接使用git push
,而不需要指定遠端名稱和分支名稱。git remote -v *# 查看遠端* git remote add <name> <url> *# 新增遠端* git remote set-url --add <name> <url> *# 增加另一個 URL* git remote rm <name> *# 移除遠端* git remote rename <old> <new> *# 重新命名遠端*
-
推送 / 拉取
git branch -a *# 查看本地與遠端分支* git push <remote> <branch> *# 推送分支* git push -u <remote> <branch> *# 推送 + 設定追蹤 (之後可直接 git push)* git pull *# 拉取並合併* git fetch *# 只抓遠端資料不合併*
暫存 (stash)
git stash *# 暫存已追蹤檔案(Stage 區)*
git stash -u *# 包含未追蹤檔案 (WD + Stage)*
git stash save -u "訊息" *# 暫存 + 註解*
git stash pop *# 取出最近的暫存並刪除*
git stash list *# 查看暫存清單*
git stash clear *# 清除所有暫存*
實務 (建議補充)
- 使用
.gitignore
避免提交不必要檔案(如 IDE 設定、編譯輸出)。 - 在多人開發時:建分支 → 開發 → Commit → Pull Request → Merge,避免直接改 master/main。
- 避免濫用
git push -f
,因為會覆蓋遠端歷史,容易害隊友痛苦。 - 如果要回到之前的狀態但又想保留歷史,優先用
git revert
而非 reset。 git log --oneline --graph --decorate --all
→ 很方便查看分支合併樹狀結構。