D.N.

Git

Git 基本概念說明

Git 是什麼?

  • Git 是一個分散式版本控制系統 (DVCS),主要用來追蹤檔案變化,尤其是程式碼。
  • 每個人本地端都有完整的版本歷史 → 不依賴中央伺服器也能工作。

三大區域 (工作流程核心)

Git 把檔案管理分為三個區域:👉 流程: 工作目錄 → git add → 暫存區 → git commit → 儲存庫

  1. 工作目錄 (Working Directory)
    • 你實際編輯檔案的地方。
    • 可以修改、建立、刪除檔案。
  2. 暫存區 (Staging Area / Index)
    • 透過 git add 放進來的檔案。
    • 表示「準備好要提交的變更」。
  3. 儲存庫 (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 *# 取回*


常見工作流 (實務)

  1. Clone or 建立本地庫
  2. 修改檔案
  3. git add → 放進暫存區
  4. git commit → 建立版本快照
  5. git push → 推送到遠端
  6. 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 → 很方便查看分支合併樹狀結構。

其他主題

Git Flow

Git Submodule

語義化版本號

bonobo git server on docker

Using multiple GitHub accounts on one computer

© 2024 D.N.. All rights reserved.