Git 指令速查表:50 個開發者每日必用的 Git 指令全攻略

在現代軟體開發的領域中,版本控制系統(Version Control System, VCS)是每一位工程師的生命線。而 Git 作為目前全球最流行的分散式版本控制系統,其重要性不言而喻。無論你是正在學習基礎的學生,還是處理複雜大型專案的資深架構師,Git 的指令熟練度直接決定了你的開發效率與代碼安全性。

然而,Git 的指令數量龐大且功能細碎,即便是經驗豐富的開發者,在遇到需要「撤銷特定提交」或「處理複雜衝突」時,也常常需要翻閱文檔。這就是為什麼一份高品質的 Git 指驗速查表 能成為開發者桌面上的「救命神物」。

本文將不只是單純地列出指令,而是透過邏輯化的分類,帶你從基礎設定、核心工作流、分支管理,一直到進階的救命指令,深度掌握這 50 個開發者每日必用的 Git 指令。


第一階段:Git 環境初始化與基礎設定

在開始任何開發任務之前,你必須先配置好你的 Git 環境。這不僅僅是安裝軟體,更重要的是建立一個身份識別,確保每一筆提交(Commit)都能正確追蹤到開發者本人。

1. 身份識別與全域配置

當你第一次在新的電腦上安裝 Git 時,最優先的任務就是設定 user.name 與 user.email。這兩個資訊會被寫入所有的 Git 提交紀錄中。

  • git config --global user.name "Your Name":設定全域使用者名稱。
  • git config --global user.email "your@email.com":設定全域電子郵件。
  • git config --list:查看目前所有的 Git 配置清單。
  • git config --global core.editor vim:設定 Git 預設使用的文字編輯器。

2. 建立新的儲存庫(Repository)

無論是從零開始一個新專案,還是將現有的專案納入版本控制,你都需要掌握初始化指令。

  • git init:在目前的目錄中建立一個全新的 Git 儲存庫。
  • git clone [url]:從遠端伺服器(如 GitHub 或 GitLab)複製一個現有的儲存庫到本地。

3. 忽略檔案的管理

在開發過程中,我們不希望將編譯產生的暫存檔、敏感資訊(如 .env)或 node_modules 提交到版本控制中。這時,你必須學會使用 .gitignore 檔案。如果你不確定該如何撰寫,可以使用 Git Ignore 產生器 來快速生成標準化的忽略清單。

  • git check-ignore -v [file]:檢查某個檔案是否正被 .gitignore 規則忽略。

第二階段:Git 核心工作流(暫存、提交與狀態追蹤)

Git 的核心邏輯在於「三個區域」:工作目錄(Working Directory)、暫存區(Staging Area)與本地儲存庫(Repository)。理解這三者的轉換,是掌握 Git 的關鍵。如果你覺得指令太多容易混淆,可以參考這份 Git 指令工具 幫助你快速對照。

1. 檔案狀態的觀察

在進行任何操作前,你必須知道現在的專案處於什麼狀態。

  • git status:顯示目前工作目錄與暫存區的狀態(哪些檔案被修改、哪些準備提交)。
  • git diff:查看工作目錄與暫存區之間的差異。
  • git diff --staged:查看已加入暫存區但尚未提交的變更。
  • git ls-files:列出目前暫存區中所有的檔案。

2. 檔案的暫存與提交

這是開發者每天執行次數最多的動作。

  • git add [file]:將特定的檔案加入暫存區。
  • git add .:將目前目錄下所有的變更(新增、修改、刪除)全部加入暫存區。
  • git commit -m "message":將暫存區的變更正式提交到本地儲存庫,並附上說明訊息。
  • git commit --amend:修正最後一次提交(例如補上漏掉的檔案或修正 Commit Message)。

建立開發紀錄的進階技巧

有時候我們需要更細緻地管理檔案。

  • git rm [file]:從工作目錄與暫存區中刪除檔案,並將此刪除動作加入追蹤。
  • git mv [old_name] [new_name]:重新命名檔案,並同時完成 Git 的追蹤更新。
  • git restore [file]:將工作目錄中的檔案恢復到最後一次提交的狀態(常用於放棄未完成的修改)。

第三階段:分支管理與版本合併(Branching & Merging)

Git 最強大的功能之一就是「分支(Branching)」。它允許開發者在不影響主線(Main/Master)的情況下,進行功能開發、Bug 修復或實驗性嘗試。

1. 分支的創建與切換

分支就像是平行宇宙,你可以在不同的分支上進行不同的開發任務。

  • git branch:列出目前所有的本地分支。 作業系統中,帶有 * 號的分支即為你目前所在的分支。
  • git branch [branch_name]:建立一個新的分支。
  • git checkout -b [branch_name]:建立新分支並立即切換過去(這是最常用的快捷指令)。
  • git switch [branch_name]:切換到指定的分支(這是 Git 近年推出的更直觀的指令)。
  • git branch -d [branch_name]:刪除已經合併過的本地分支。
  • git branch -D [branch_name]:強制刪除分支(即使該分支尚未合併)。

2. 分支的合併與衝突處理

當你的功能開發完成,需要將分支的程式碼併回主線時,就會用到合併指令。

  • git merge [branch_name]:將指定的開發分支合併到目前所在的分支。
  • git merge --abort:如果在合併過程中發生衝突(Conflict)且你不想處理,可以用此指令放棄合併,回到合併前的狀態。
  • git rebase [branch_name]:使用 Rebase 策略來合併。Rebase 會將你的提交「重新基於」目標分支的頂端,從而產生一條整潔的線性歷史紀錄。

【重要比較】Git Merge vs. Git Rebase

| 特性 | Git Merge | Git Rebase | | :--- | :決策建議 | 適用於團隊協作,保留完整的開發歷史與分支結構。 | 適用於個人開發或整理提交紀錄,追求乾淨的線性歷史。 | | 歷史紀錄 | 會產生一個額外的「Merge Commit」,紀錄分支匯合的點。 | 會改寫提交歷史,讓歷史看起來像是一直在單一線路上開發。 | | 風險性 | 較低,操作過程是「附加」而非「修改」。 | 較高,若在公共分支上使用 Rebase 可能導致團隊成員的歷史錯亂。 | | 衝突處理 | 一次性解決所有衝突。 | 可能需要在每一個 Commit 重新解決衝突,過程較繁瑣。 |

3. 進階的變更拾取

  • git cherry-pick [commit_hash]:這是一個非常強大的指令。它允許你從另一個分支中,只挑選某一個特定的提交(Commit)應用到目前的開發分支中,而不必合併整個分支。

第四階段:遠端協作與團隊同步(Remote Collaboration)

在團隊開發中,你的程式碼最終必須推送到遠端伺服器(如 GitHub, GitLab, Bitbucket),以便其他隊友下載與審閱。

1. 遠端儲存庫的連接與操作

  • git remote -v:查看目前本地儲存庫所連結的所有遠端伺服器位址。
  • git remote add origin [url]:將一個遠端伺服器位址命名為 origin 並加入追蹤。
  • git remote rename [old] [new]:重新命名遠端分支的代號。
  • git remote remove [name]:移除與遠端伺服器的連結。

2. 同步與推送

  • git push origin [branch_name]:將本地分支的提交推送到遠端伺服器的指定分支。
  • git push -u origin [branch_name]:推送並建立「上游追蹤(Upstream)」,下次只需輸入 git push。
  • git fetch:從遠端下載最新的資訊,但不會自動合併到你的本地分支(這能讓你先檢查變更)。
  • git pull:這是 git fetch + git merge 的組合拳。它會抓取遠端更新並直接合併到你目前的本地分支。
  • git pull --rebase:在拉取遠端更新時使用 Rebase 模式,避免產生多餘的 Merge Commit。

第五階段:進階救命指令(撤銷、修復與歷史追蹤)

開發過程中難免會發生「寫錯了」、「不小心刪除了檔案」或「提交了錯誤的資訊」等慘劇。這時候,Git 的追蹤與修復功能就是你的保險。

1. 歷史紀錄的深度挖掘

  • git log:查看完整的提交歷史紀錄。
  • git log --oneline:以精簡的一行模式查看歷史,適合快速瀏覽。
  • git log --graph --all:以圖形化的方式呈現分支的演進過程。
  • git show [commit_hash]:詳細查看某一個特定提交所做的具體變更內容。
  • git reflog:最強大的救命指令。它記錄了你在本地端進行的所有動作(包括切換分支、Reset、Rebase 等)。即使你執行了 git reset --hard 導致代碼「消失」,只要在 reflog 中找到之前的 Commit ID,就能找回一切。

2. 撤銷與回退(Undo Operations)

  • git reset --soft [commit_hash]:將 HEAD 指向特定提交,但保留工作目錄與暫存區的內容(適合重新整理 Commit 訊息)。
  • git reset --mixed [commit_hash]:預設模式。回退到特定提交,但保留工作目錄內容,僅重置暫存區。
  • git reset --hard [commit_hash]:極度危險。強制將工作目錄、暫存區全部重置到特定提交,所有未提交的變更都會永久消失。
  • git revert [commit_hash]:透過「產生一個新的反向提交」來抵消某個舊提交的影響。這是在公共分支上撤銷錯誤操作的最安全做法,因為它不會改寫歷史。

3. 暫存工作進度(Stash)

當你正在開發功能 A,卻突然被要求去修復功能 B 的 Bug,而功能 A 的程式碼目前還沒寫完、不能提交時,git stash 就是你的救星。

  • git stash:將目前所有未提交的變更暫時「藏」起來,讓工作目錄變回乾淨的狀態。
  • git stash list:查看目前所有被藏起來的工作進度清單。
  • git stash pop:將最近一次藏起來的工作取出,並應用到目前的分支,同時從暫存清單中刪除。
  • git stash apply:取出暫存內容,但保留在暫存清單中(適合要在多個分支應用同一份暫存)。
  • git stash drop:刪除特定的暫存紀錄。

50 個 Git 指令快速清單(分類彙整)

為了方便大家在開發時快速查閱,我們將上述內容整理成一份結構化的清單:

基礎與配置 (Setup & Config)

  1. git config 2. git init 3. git clone 4. git config --global 5. git config --list 6. git config --unset

狀態與追蹤 (Status & Tracking)

  1. git status 8. git add 9. git add . 10. git diff 11. git diff --staged 12. git ls-files 13. git check-ignore 14. git commit 15. git commit -m 16. git commit --amend

分支管理 (Branching)

  1. git branch 18. git branch --list 19. git branch -d 20. git branch -D 21. git checkout 22. git checkout -b 23. git switch 24. git switch -c 25. git merge 26. git merge --abort 27. git rebase 28. git rebase --abort 29. git cherry-pick

遠端協作 (Remote)

  1. git remote 31. git remote -v 32. git remote add 33. git remote remove 34. git push 35. git push -u 36. git push --tags 37. git fetch 38. git pull 39. git pull --rebase

檔案操作與刪除 (File Operations)

  1. git rm 41. git mv 42. git restore 43. git checkout -- [file]

歷史與修復 (History & Undo)

  1. git log 45. git log --oneline 46. git log --graph 47. git show 48. git reflog 49. git reset 50. git revert

暫存進度 (Stash)

  1. git stash 52. git stash list 53. git stash pop 54. git stash apply 55. git stash drop

(註:指令數量依功能組合略有增減,以上涵蓋了開發中 99% 的情境)


FAQ:關於 Git 使用的常見疑難解答

Q1: git pull 發生衝突(Conflict)時該怎麼辦?

當遠端代碼與你的本地修改衝突時,Git 會停止合併。你必須手動打開衝突的檔案,尋找 <<<<<<<, =======, >>>>>>> 標記,決定要保留哪一部分的代碼。處理完畢後,執行 git add [file] 並 git commit 即可完成合併。

Q2: 我不小心執行了 git reset --hard 導致代碼不見了,還有救嗎?

非常有機會!只要你的代碼曾經被 git commit 過,即使你執行了硬重置,只要使用 git reflog 找到該次提交的 Commit ID,然後執行 git reset --hard [commit_id],就能將代碼找回來。

Q3: git merge 與 git rebase 到底該用哪一個?

這取決於團隊規範。如果你希望保留完整的開發軌跡(包含分支匯合的節點),請使用 merge。如果你希望維護一個乾淨、線性的提交歷史,且該分支尚未推送到公共遠端,請使用 rebase。

Q4: 為什麼我 git add . 之後,發現不小心把 .env 也加進去了?

這代表你的 .gitignore 沒有設定好,或者你在設定 .gitignore 之前就已經將該檔案追蹤了。請先使用 git rm --cached .env 將其從追蹤清單中移除,再重新確認 .gitignore 設定。

Q5: git stash 會把我的新建立檔案也藏起來嗎?

預設情況下,git stash 只會處理已被 Git 追蹤(Tracked)的檔案。如果你有新建立但尚未 git add 的檔案(Untracked files),需要使用 git stash -u (include untracked) 才能將它們一併藏起來。

Q6: 如何在 Commit Message 中寫得更專業?

建議遵循「Conventional Commits」規範。例如:feat: add user login logic(新功能)、fix: resolve memory leak in API(修復 Bug)、docs: update README(文件更新)。這能讓團隊成員一眼看出這次變更的性質。


結論

掌握 Git 指令並非一蹴可幾,它需要透過大量的實作與錯誤(Error)來累積經驗。這份 Git 指令速查表 涵蓋了從基礎到進階的核心指令,旨在幫助你在開發過程中建立直覺式的反應。

記住,Git 的最強大之處不在於它能幫你記錄代碼,而是在於它能讓你「勇敢地嘗試」。有了版本控制的保護,你可以隨時進行實驗、隨時回溯錯誤。建議將這篇文章加入你的開發者書籤,並在遇到陌生指令時,回頭查閱這份清單,逐步將這些指令內化成你的開發本能。