# 【Git】常用指令

# Git 進階指令速查表（實戰版）

<table id="bkmrk-%E9%A1%9E%E5%88%A5-%E6%8C%87%E4%BB%A4-%E8%AA%AA%E6%98%8E-%E5%B8%B8%E8%A6%8B%E6%83%85%E5%A2%83-merge-"><thead><tr><th>類別</th><th>指令</th><th>說明</th><th>常見情境</th></tr></thead><tbody><tr><td>Merge</td><td>`git merge branch`</td><td>合併 branch</td><td>feature 合併到 main</td></tr><tr><td>Rebase</td><td>`git rebase branch`</td><td>重排 commit</td><td>整理 commit 歷史</td></tr><tr><td>Rebase</td><td>`git rebase -i HEAD~3`</td><td>互動式 rebase</td><td>squash commit</td></tr><tr><td>Cherry-pick</td><td>`git cherry-pick <commit>`</td><td>套用指定 commit</td><td>hotfix</td></tr><tr><td>Revert</td><td>`git revert <commit>`</td><td>回復某 commit</td><td>線上 rollback</td></tr><tr><td>Reflog</td><td>`git reflog`</td><td>查看 HEAD 歷史</td><td>找回被 reset 的 commit</td></tr></tbody></table>

---

# Rebase vs Merge

<table id="bkmrk-%E6%93%8D%E4%BD%9C-%E6%8C%87%E4%BB%A4-%E7%B5%90%E6%9E%9C-merge-git-m"><thead><tr><th>操作</th><th>指令</th><th>結果</th></tr></thead><tbody><tr><td>merge</td><td>`git merge main`</td><td>保留 merge commit</td></tr><tr><td>rebase</td><td>`git rebase main`</td><td>重新排列 commit</td></tr></tbody></table>

### Merge

```
A---B---C main
     \
      D---E feature
           \
            F (merge)

```

### Rebase

```
A---B---C main
           \
            D'---E' feature

```

📌 **結論**

<table id="bkmrk-%E6%93%8D%E4%BD%9C-%E4%BD%BF%E7%94%A8%E6%83%85%E5%A2%83-merge-%E4%BF%9D%E7%95%99%E6%AD%B7%E5%8F%B2-r"><thead><tr><th>操作</th><th>使用情境</th></tr></thead><tbody><tr><td>merge</td><td>保留歷史</td></tr><tr><td>rebase</td><td>整理 commit</td></tr></tbody></table>

---

# Interactive Rebase（整理 commit）

```bash
git rebase -i HEAD~3

```

會出現

```
pick a1b2 commit1
pick c3d4 commit2
pick e5f6 commit3

```

可修改為

```
pick a1b2 commit1
squash c3d4 commit2
squash e5f6 commit3

```

結果：

```
commit1 + commit2 + commit3
變成一個 commit

```

常用於：

```
PR 整理 commit

```

---

# Cherry-pick（套用某 commit）

```bash
git cherry-pick <commit-id>

```

用途：

<table id="bkmrk-%E6%83%85%E5%A2%83-%E7%AF%84%E4%BE%8B-hotfix-%E5%BE%9E-dev-%E8%A4%87"><thead><tr><th>情境</th><th>範例</th></tr></thead><tbody><tr><td>hotfix</td><td>從 dev 複製到 main</td></tr><tr><td>patch</td><td>套用某 bug fix</td></tr></tbody></table>

例如：

```
dev
A--B--C--D

main
A--B

```

```
git cherry-pick D

```

結果

```
main
A--B--D

```

---

# Revert（安全 rollback）

```bash
git revert <commit>

```

Git 會產生一個 **反向 commit**

例如：

```
A--B--C

```

revert B

```
A--B--C--D
        ↑
     undo B

```

📌 適合

```
production rollback

```

---

# Reflog（救命指令）

查看 HEAD 歷史

```bash
git reflog

```

例如

```
a1b2 HEAD@{0}: reset: moving to HEAD~1
c3d4 HEAD@{1}: commit: fix bug

```

恢復：

```bash
git reset --hard c3d4

```

很多工程師不知道：

```
Git 幾乎不會真的丟資料
reflog 都能救回

```

---

# Detached HEAD

發生情況

```bash
git checkout <commit-id>

```

Git 會顯示

```
You are in 'detached HEAD' state

```

代表：

```
HEAD 沒有 branch

```

解法

建立 branch：

```bash
git checkout -b new-branch

```

---

# Clean（清除未追蹤檔案）

查看將刪除

```bash
git clean -n

```

刪除

```bash
git clean -fd

```

常用於：

```
CI pipeline
重新 build

```

---

# Force Push

```bash
git push -f

```

⚠️ 危險

可能覆蓋他人 commit

安全方式：

```bash
git push --force-with-lease

```

這會檢查遠端是否被更新。

---

# Reset / Restore / Checkout 差異

<table id="bkmrk-%E6%8C%87%E4%BB%A4-%E5%BD%B1%E9%9F%BF%E7%AF%84%E5%9C%8D-reset-commit"><thead><tr><th>指令</th><th>影響範圍</th></tr></thead><tbody><tr><td>reset</td><td>commit + staging</td></tr><tr><td>restore</td><td>working tree</td></tr><tr><td>checkout</td><td>branch 或檔案</td></tr></tbody></table>

---

# Git 三層結構（核心概念）

Git 有三個區域：

```
Working Directory
↓
Staging Area (Index)
↓
Repository (Commit)

```

對應指令：

<table id="bkmrk-%E6%93%8D%E4%BD%9C-%E6%8C%87%E4%BB%A4-working-%E2%86%92-stag"><thead><tr><th>操作</th><th>指令</th></tr></thead><tbody><tr><td>working → staging</td><td>`git add`</td></tr><tr><td>staging → repo</td><td>`git commit`</td></tr><tr><td>repo → working</td><td>`git checkout`</td></tr><tr><td>repo → staging</td><td>`git reset`</td></tr></tbody></table>

---

# DevOps 常用 Git 重置流程

很多 CI pipeline 會用：

```bash
git fetch origin
git reset --hard origin/main
git clean -fd

```

作用：

```
確保 workspace 乾淨

```

---

# Git Flow（常見分支策略）

常見 branch：

```
main
develop
feature/*
hotfix/*
release/*

```

流程：

```
feature -> develop
develop -> release
release -> main
hotfix -> main

```

---

# Git Debug 指令

<table id="bkmrk-%E6%8C%87%E4%BB%A4-%E7%94%A8%E9%80%94-git-blame-file"><thead><tr><th>指令</th><th>用途</th></tr></thead><tbody><tr><td>`git blame file`</td><td>查看誰修改</td></tr><tr><td>`git bisect`</td><td>找 bug commit</td></tr><tr><td>`git show`</td><td>查看 commit</td></tr><tr><td>`git diff commit1 commit2`</td><td>比較 commit</td></tr></tbody></table>

---

# 工程師最強 Git 指令 TOP 10

<table id="bkmrk-%E6%8C%87%E4%BB%A4-%E7%94%A8%E9%80%94-git-log---onel"><thead><tr><th>指令</th><th>用途</th></tr></thead><tbody><tr><td>`git log --oneline --graph`</td><td>查看歷史</td></tr><tr><td>`git reflog`</td><td>救 commit</td></tr><tr><td>`git rebase -i`</td><td>整理 commit</td></tr><tr><td>`git cherry-pick`</td><td>套 commit</td></tr><tr><td>`git revert`</td><td>rollback</td></tr><tr><td>`git clean -fd`</td><td>清 workspace</td></tr><tr><td>`git reset --hard`</td><td>重置</td></tr><tr><td>`git stash`</td><td>暫存</td></tr><tr><td>`git blame`</td><td>找修改人</td></tr><tr><td>`git bisect`</td><td>找 bug</td></tr></tbody></table>

---

💡 **給你一個小建議**

如果你常用 Git（你目前 DevOps / CI / Jenkins workflow 看起來是這樣），  
最推薦記住 **這 6 個核心指令**：

```
git log --oneline --graph
git reflog
git rebase -i
git cherry-pick
git reset --hard
git clean -fd

```

- 

這份會非常接近 **資深工程師 Git 操作指南**。