Git 筆記分享

Written by Mark Hong
Last updated October 27, 2025
Git 筆記分享

最近整理了一些我常用的 Git 指令,這些都是平常開發時會遇到的情況:正在寫功能時突然要切分支、不小心把設定檔加入版本控制、commit 訊息打錯想重來,或者協作時歷史變成一團亂。

想說寫下來當筆記,順便分享給需要的人。

先講重點:Git 的三個區域

在搞懂指令前,先理解一下 Git 的三個區域(也可稱`狀態`):

  1. 工作目錄:正在編輯的檔案 (還沒被 git add 的檔案)
  2. 暫存區:已經被 git add ,準備要提交的檔案
  3. Git 倉庫:已經 commit 的歷史記錄

了解這三個區域的差異後,接下來的指令就好理解多了。

處理遠端倉庫:git remote

超重要的命令!要把自己專案中的 git 推上 GitHub、GitLab 就會用到。

看看現在專案中有哪些遠端

git remote -v

這個指令會列出現在所有的遠端 URL,還有是 fetch(下載)還是 push(上傳)。

add 和 set-url 差在哪?

  • git remote add新增一個遠端
  • git remote set-url改掉已存在的遠端 URL

如果遠端已經存在你還用 add,會看到錯誤訊息:

fatal: remote origin already exists.

這時候要用 set-url

git remote set-url origin https://github.com/user/new-repo.git

多遠端協作:怎麼設 origin 和 upstream

維護 Fork 專案時,可以這樣:

# 你的 Fork
git remote add origin https://github.com/your-username/awesome-project.git

# 原始專案(通常叫 upstream)
git remote add upstream https://github.com/original-author/awesome-project.git

Push 到自己 Fork 的用法:

git push origin main

從原始專案拉更新:

git pull upstream main

這樣設定後,隨時可以跟上游保持同步,想在自己的 Fork 上改東西也方便。

切換工作最常用的:git stash

git stash 是我工作中很常用到的命令。情況通常是這樣:我正在寫某個功能,突然要切到另一個分支處理 bug,但手上的東西還沒寫完不想 commit。這時候就用 stash 先存起來。

# 把現在的修改存起來
git stash

# 看看存了哪些
git stash list

# 取出來,取出後會刪掉記錄
git stash pop

# 取出來,但保留記錄(較少使用)
git stash apply

popapply 的差別是:pop 用完就刪了,apply 用過後記錄還在。我自己主要都用 popapply 沒什麼用。

小技巧

可以用訊息命名,之後比較好認:

git stash save "正在開發登入功能"

撤銷 commit:git reset

有時候 commit 完才發現訊息打錯,或者還想加檔案進去,就會用到 git reset。這個指令有三種模式,看你要保留多少東西。

reset 的三種模式

(還記得剛剛講的三個區域嗎?)

模式 影響 Commit 歷史 影響暫存區 影響工作目錄
--soft ✓ 移動 HEAD 指針 ✗ 保留變更(git add 的檔案仍在暫存區) ✗ 保留檔案內容
--mixed(預設) ✓ 移動 HEAD 指針 ✓ 清空暫存區(變更回到工作目錄) ✗ 保留檔案內容
--hard ✓ 移動 HEAD 指針 ✓ 清空暫存區 永久刪除檔案變更

--soft:改訊息或加檔案

git reset --soft HEAD~1

這是我最常用的。剛 commit 完發現訊息打錯,或者還想加檔案進去時,用 --soft 最方便。所有變更都還在暫存區,直接再 commit 就好。

--mixed:重新整理一下

git reset HEAD~1
# 等同於
git reset --mixed HEAD~1

這是預設模式,不寫參數就是這個。撤銷後變更會回到工作目錄,可以重新 git add 想提交的東西。

--hard:全部放棄

git reset --hard HEAD~1

這個很危險! 會把工作內容都刪掉。我通常是確定要完全放棄某個版本才會用。

如果不小心用了,還有 git reflog 可以救(後面會講)。

我的使用情境

假設狀態是這樣:

Commit 歷史: A - B - C (HEAD)
工作目錄: 有修改但未暫存
暫存區: 有一個已 add 的檔案

--soft 撤銷最後一次 commit 後:

Commit 歷史: A - B (HEAD)
工作目錄: 保持原狀
暫存區: 有 C 的所有變更(已 add)

可以直接再 commit,很方便。

--mixed 撤銷:

Commit 歷史: A - B (HEAD)
工作目錄: 有 C 的所有變更(未 add)
暫存區: 空的

需要重新 git add 想提交的東西。

--hard 撤銷:

Commit 歷史: A - B (HEAD)
工作目錄: 乾淨(所有變更消失)
暫存區: 空的

⚠️ 東西都被刪掉了,小心!

協作整合:pull vs. rebase

當本地跟遠端都有新的 commit 時,要整合差異。git pull 預設用 merge,但我習慣用 rebase。

Merge 和 Rebase 差在哪

假設是這樣的情況:

遠端: A - B - C
本地: A - B - D

如果直接用 git pull(merge):

git pull origin main

會變成這樣:

A - B - C (遠端)
  \     /
   D - M (本地,M 是 merge commit)

歷史會有分支線,有點亂。

如果改用 rebase

git pull --rebase origin main

會變成乾淨的直線:

A - B - C - D'

我自己都習慣用 rebase,因為歷史比較乾淨,用 git bisect 找 bug 也比較準。

⚠️ 注意:rebase 會改寫 commit 歷史,如果別人也在用這個分支要小心。

維護 Fork 時的流程

# 從 upstream 同步,用 rebase
git pull --rebase upstream main

# Push 到自己的 Fork
git push origin main

這樣 Fork 的歷史會保持乾淨,提 PR 時也比較清楚。

處理誤加的檔案:git rm --cached

有時候不小心把不該追蹤的檔案(像是設定檔、密鑰、編譯產物)加入 Git 了,可以用 git rm --cached 停止追蹤,但保留檔案在本地。

為什麼會用到

通常會把 .envconfig.json 這類檔案加進 .gitignore,但有時候已經 commit 了才發現。如果直接用 git rm 會把檔案刪掉,但 --cached 只停止追蹤,檔案還在本地。

常用的情境

遇到誤把敏感資料加入 Git:

# 步驟 1:停止追蹤但保留檔案
git rm --cached config.json

# 步驟 2:加到 .gitignore 避免下次又加
echo "config.json" >> .gitignore

# 步驟 3:commit 變更
git add .gitignore
git commit -m "Remove config.json from tracking"

這樣 config.json 還在你電腦上,只是 Git 不追蹤了。建議記得把 config.json.example 這類範例檔加進 Git,讓其他開發者知道需要哪些設定。

如果真的要刪檔案

如果要真正刪掉檔案,用 git rm

git rm filename.txt

這會把檔案從硬碟刪掉,刪除動作會記錄到暫存區,記得 commit。

救命稻草:git reflog

git reflog 記錄你所有操作,包括「看起來已經消失」的那些。可以把它當作 Git 的時光機。

什麼時候會用到

  • 誤用 git reset --hard 把工作清掉了
  • 誤刪分支
  • 忘記重要的 commit ID
git reflog

會看到類似這樣:

abc1234 HEAD@{0}: commit: 最新的提交
def5678 HEAD@{1}: reset: moving to HEAD~1
abc1234 HEAD@{2}: commit: 之前的提交

把遺失的 commit 找回來

找到想要的 commit ID 後:

# 用 commit ID 開個新分支
git branch recovered-branch abc1234

# 或者直接 reset 回去
git reset --hard abc1234

注意:reflog 只會保留一段時間(預設約 90 天),有問題要趕快處理。

總結

這篇整理了我自己常用的幾個 Git 指令,順序如下:

  1. Git 的三個區域:工作目錄、暫存區、Git 倉庫
  2. git remote:處理遠端連線,設多遠端協作
  3. git stash:暫時存工作,方便切分支
  4. git reset:撤銷 commit,有三種模式
  5. git pull --rebase:用 rebase 保持乾淨歷史
  6. git rm --cached:停止追蹤但保留檔案
  7. git reflog:找回遺失的東西,最後的救兵

掌握這些指令後,用 Git 會順很多。我的經驗是 Git 幾乎不會真的遺失東西,只要知道怎麼把它們找回來就好 ~

訂閱資訊儲存失敗,請稍後再試
您已成功完成訂閱 🎉 🎉

電子報

除了創作本站內容以外,我也關注科技、商業、行銷等議題,我會把一些好資訊、酷東西寫成電子報跟你分享,歡迎免費訂閱。

  • 每月最多兩封信
  • 隨時可取消訂閱