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)
git config2.git init3.git clone4.git config --global5.git config --list6.git config --unset
狀態與追蹤 (Status & Tracking)
git status8.git add9.git add .10.git diff11.git diff --staged12.git ls-files13.git check-ignore14.git commit15.git commit -m16.git commit --amend
分支管理 (Branching)
git branch18.git branch --list19.git branch -d20.git branch -D21.git checkout22.git checkout -b23.git switch24.git switch -c25.git merge26.git merge --abort27.git rebase28.git rebase --abort29.git cherry-pick
遠端協作 (Remote)
git remote31.git remote -v32.git remote add33.git remote remove34.git push35.git push -u36.git push --tags37.git fetch38.git pull39.git pull --rebase
檔案操作與刪除 (File Operations)
git rm41.git mv42.git restore43.git checkout -- [file]
歷史與修復 (History & Undo)
git log45.git log --oneline46.git log --graph47.git show48.git reflog49.git reset50.git revert
暫存進度 (Stash)
git stash52.git stash list53.git stash pop54.git stash apply55.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 的最強大之處不在於它能幫你記錄代碼,而是在於它能讓你「勇敢地嘗試」。有了版本控制的保護,你可以隨時進行實驗、隨時回溯錯誤。建議將這篇文章加入你的開發者書籤,並在遇到陌生指令時,回頭查閱這份清單,逐步將這些指令內化成你的開發本能。