好的,這是一份非常全面的 Git 命令指南,涵蓋了從入門到進(jìn)階的常用命令,并對每條命令的作用進(jìn)行了詳細(xì)解釋。
Git 命令核心概念
在開始之前,理解 Git 的三個主要工作區(qū)域至關(guān)重要:
- 工作目錄 (Working Directory):你正在查看和編輯的本地文件。
- 暫存區(qū) (Staging Area / Index):一個準(zhǔn)備下次提交的文件列表。它像是購物車,你把需要的改動放進(jìn)去。
-
本地倉庫 (Local Repository):存儲項目元數(shù)據(jù)和對象數(shù)據(jù)庫的地方,位于你的
.git目錄中。HEAD是一個指向當(dāng)前所在分支的指針。
一、 初始化和配置
這些命令通常只在開始一個新項目或配置新環(huán)境時使用一次。
| 命令 | 解釋 |
|---|---|
git init |
在當(dāng)前目錄創(chuàng)建一個新的 Git 倉庫。這會創(chuàng)建一個 .git 子目錄,其中包含所有必需的倉庫文件。 |
git clone <repo_url> |
克?。ㄏ螺d)一個遠(yuǎn)程倉庫到本地。它會自動創(chuàng)建一個與遠(yuǎn)程倉庫同名的目錄,并初始化 .git 目錄,拉取所有數(shù)據(jù),并檢出默認(rèn)分支(通常是 main 或 master)的最新版本。 |
git config --global user.name "Your Name" |
設(shè)置全局的用戶名,你在這個機(jī)器上所有的 Git 提交都會使用這個名稱。 |
git config --global user.email "your_email@example.com" |
設(shè)置全局的郵箱地址,同樣用于所有提交。 |
git config --list |
列出當(dāng)前所有的 Git 配置項。 |
二、 基礎(chǔ)工作流
這是你日常開發(fā)中使用最頻繁的命令集合。
| 命令 | 解釋 |
|---|---|
git status |
查看工作目錄和暫存區(qū)的狀態(tài)。它會顯示哪些文件已被修改、哪些文件已暫存、哪些文件未被跟蹤。這是最常用的命令之一。 |
git add <file> |
將工作目錄中的文件改動添加到暫存區(qū)。準(zhǔn)備下次提交。 |
git add . 或 git add -A
|
添加所有修改和新增的文件到暫存區(qū)(-A 是 --all 的縮寫)。 |
git commit -m "Commit message" |
將暫存區(qū)的內(nèi)容提交到本地倉庫,并附帶一條描述性的提交信息。-m 選項用于直接在命令行中輸入信息。 |
git commit -a -m "Message" |
-a 選項可以跳過 git add 步驟,自動將所有已跟蹤文件的修改添加到暫存區(qū)并提交。(對新文件無效)。 |
git log |
顯示當(dāng)前分支的提交歷史。按 q 鍵退出。 |
git log --oneline |
以簡潔的單行形式顯示提交歷史。 |
git diff |
顯示工作目錄與暫存區(qū)之間的差異(即,你修改了但還沒 git add 的內(nèi)容)。 |
git diff --staged |
顯示暫存區(qū)與最后一次提交之間的差異(即,你已經(jīng) git add 了但還沒提交的內(nèi)容)。 |
三、 分支與合并
分支是 Git 的核心功能,用于并行開發(fā)。
| 命令 | 解釋 |
|---|---|
git branch |
列出所有本地分支。當(dāng)前分支會用 * 標(biāo)出。 |
git branch <branch_name> |
創(chuàng)建一個新分支,但不會自動切換到該分支。 |
git checkout <branch_name> |
切換到指定的分支。 |
git switch <branch_name> |
(較新版本 Git) 一個更直觀的切換分支的命令,專門用于切換,避免 checkout 的多重職責(zé)帶來的混淆。 |
git checkout -b <branch_name> |
創(chuàng)建并立即切換到新分支。這是非常常用的組合命令。 |
git switch -c <branch_name> |
(較新版本 Git) git checkout -b 的替代命令,創(chuàng)建并切換。 |
git merge <branch_name> |
將指定分支的更改合并到當(dāng)前分支。通常用于合并特性分支到主分支。 |
git branch -d <branch_name> |
刪除指定的分支(如果該分支已被合并)。 |
git branch -D <branch_name> |
強(qiáng)制刪除分支,即使它還沒有被合并。慎用。 |
git log --graph --oneline |
以圖形化方式顯示分支和合并歷史,非常直觀。 |
四、 撤銷與回退
當(dāng)你犯錯時,這些命令是你的救命稻草。
| 命令 | 解釋 |
|---|---|
git restore <file> |
(較新版本 Git) 丟棄工作目錄中指定文件的修改,將其恢復(fù)到最后一次提交的狀態(tài)(或暫存區(qū)的狀態(tài),如果已暫存)。 |
git restore --staged <file> |
(較新版本 Git) 將文件從暫存區(qū)移回工作目錄,即取消 git add 操作。文件內(nèi)容保持不變。 |
git reset --hard HEAD |
危險命令。將工作目錄和暫存區(qū)都重置到最近一次提交(HEAD)的狀態(tài),丟棄所有未提交的修改。 |
git reset --hard <commit_hash> |
危險命令。重置到指定的某次提交,丟棄該提交之后的所有提交和修改。<commit_hash> 可以從 git log 中獲取。 |
git revert <commit_hash> |
安全撤銷。創(chuàng)建一個新的提交,該提交的內(nèi)容與指定提交的修改相反,從而“撤銷”那次提交的更改。這是公共分支(如 main)上推薦的撤銷方法,因為它不會重寫歷史。 |
五、 遠(yuǎn)程協(xié)作
與團(tuán)隊其他成員共享代碼。
| 命令 | 解釋 |
|---|---|
git remote -v |
查看已配置的遠(yuǎn)程倉庫及其 URL。-v 顯示詳細(xì)信息。 |
git remote add <name> <url> |
添加一個新的遠(yuǎn)程倉庫,并為其起一個簡稱(如 origin)。 |
git fetch <remote> |
從遠(yuǎn)程倉庫下載所有新的分支和數(shù)據(jù)到你的本地倉庫,但不會自動合并到你的工作文件中。這是一個安全的操作。 |
git pull <remote> <branch> |
git fetch + git merge 的組合。從遠(yuǎn)程倉庫拉取指定分支的最新更改,并立即合并到當(dāng)前本地分支。 |
git push <remote> <branch> |
將本地分支的提交上傳到遠(yuǎn)程倉庫。 |
git push -u <remote> <branch> |
第一次推送分支時使用 -u (或 --set-upstream) 選項,它會建立本地分支與遠(yuǎn)程分支的跟蹤關(guān)系,之后可以直接使用 git push。 |
git branch -r |
查看所有遠(yuǎn)程分支。 |
git branch -a |
查看所有本地和遠(yuǎn)程分支。 |
六、 高級與實用命令
| 命令 | 解釋 |
|---|---|
git stash |
將當(dāng)前工作目錄和暫存區(qū)的修改臨時保存起來,讓你有一個干凈的工作區(qū)去處理其他事情(如切換分支)。修改被保存在一個“堆?!敝?。 |
git stash pop |
應(yīng)用最近一次儲藏(stash)的修改,并將其從儲藏堆棧中移除。 |
git stash list |
列出所有儲藏條目。 |
git tag <tag_name> |
為當(dāng)前提交創(chuàng)建一個輕量級標(biāo)簽(通常用于版本發(fā)布,如 v1.0.0)。 |
git tag -a <tag_name> -m "Message" |
創(chuàng)建一個帶注解的標(biāo)簽,包含更多信息。 |
git push <remote> --tags |
將所有本地標(biāo)簽推送到遠(yuǎn)程倉庫。 |
.gitignore |
(這是一個文件,不是命令) 創(chuàng)建一個名為 .gitignore 的文件,在其中列出你希望 Git 忽略的文件和目錄模式(如 log/, *.tmp, node_modules/)。 |
總結(jié)工作流示例
一個典型的日常 Git 工作流如下:
# 1. 開始新功能前,確保在主分支上是最新的
git switch main
git pull origin main
# 2. 為新功能創(chuàng)建一個分支
git switch -c feature/awesome-new-feature
# ...(編寫代碼,修改文件)...
# 3. 檢查修改了哪些文件
git status
# 4. 查看具體修改了什么內(nèi)容
git diff
# 5. 將改動添加到暫存區(qū)
git add .
# 6. 提交到本地倉庫
git commit -m "Implement the awesome new feature"
# 7. 推送到遠(yuǎn)程倉庫(首次推送需要 -u)
git push -u origin feature/awesome-new-feature
# (然后在 GitHub/GitLab 上創(chuàng)建 Pull/Merge Request)
# 8. 功能合并后,回到主分支并拉取最新代碼
git switch main
git pull origin main
# 9. 刪除已合并的本地特性分支
git branch -d feature/awesome-new-feature
好的,在之前的基礎(chǔ)上,我再補(bǔ)充一些更高級和實用的 Git 命令,這些命令在日常開發(fā)和問題排查中非常有用。
七、 歷史查看與比較進(jìn)階
這些命令幫助你更精細(xì)地查看項目歷史和分析改動。
| 命令 | 解釋 |
|---|---|
git log -p |
顯示提交歷史的補(bǔ)丁(diff)信息,可以看到每次提交具體修改了哪些內(nèi)容。 |
git log --stat |
顯示提交歷史的簡要統(tǒng)計信息,包括哪些文件被修改,以及添加/刪除了多少行。 |
git log --oneline --graph --all |
以圖形化方式顯示所有分支的提交歷史,讓你對整個倉庫的結(jié)構(gòu)一目了然。 |
git show <commit_hash> |
顯示某次特定提交的詳細(xì)信息,包括提交元數(shù)據(jù)和內(nèi)容差異。 |
git blame <file> |
逐行顯示指定文件,并標(biāo)注每一行最后是由誰在哪個提交中修改的。用于追溯代碼來源。 |
git diff <commit1> <commit2> |
比較兩次提交之間的差異。 |
git diff <branch1>..<branch2> |
比較兩個分支最新提交之間的差異。 |
git diff <branch1>...<branch2> |
比較兩個分支從共同祖先分叉點(diǎn)開始的差異,這在查看 Pull Request 的改動時特別有用。 |
git shortlog |
匯總提交日志,按作者分組顯示提交信息,用于生成貢獻(xiàn)者列表。 |
八、 提交歷史重寫(謹(jǐn)慎使用)
這些命令會修改提交歷史,主要用于在推送前整理本地提交。對已推送到公共倉庫的提交使用這些命令是極其危險的,因為它會強(qiáng)制其他人解決沖突。
| 命令 | 解釋 |
|---|---|
git commit --amend |
修改最后一次提交。它可以讓你:1) 將新的更改追加到上次提交;2) 修改上次提交的提交信息。 |
git rebase -i <base_branch> |
交互式變基。這是一個非常強(qiáng)大的工具,可以: - 重新排序提交 - 將多個提交壓縮(squash) 成一個 - 編輯某個提交的內(nèi)容 - 刪除提交 - 拆分提交 常用于在合并到主分支前清理自己的分支歷史。 |
git rebase <base_branch> |
變基。將當(dāng)前分支的提交“移植”到目標(biāo)分支(如 main)的最新提交之后,從而形成一條線性的歷史。與 merge 不同,它不會產(chǎn)生合并提交。 |
九、 問題排查與調(diào)試
| 命令 | 解釋 |
|---|---|
git bisect start |
啟動一個二分查找過程,用于快速定位引入 bug 的提交。你需要告訴 Git 一個“好”的提交(沒有 bug)和一個“壞”的提交(有 bug),Git 會自動在中間切換,讓你測試,直到找到第一個引入 bug 的提交。 |
git bisect good <commit> |
標(biāo)記當(dāng)前提交為“好”。 |
git bisect bad <commit> |
標(biāo)記當(dāng)前提交為“壞”。 |
git bisect reset |
結(jié)束二分查找,回到開始前的狀態(tài)。 |
git reflog |
救命命令。顯示 HEAD 和分支引用的移動歷史(包括被 reset 或 rebase 刪除的提交)。如果你不小心誤操作丟失了提交,可以通過 reflog 找到提交哈希并恢復(fù)它。 |
十、 子模塊與工作樹
用于管理復(fù)雜項目結(jié)構(gòu)。
| 命令 | 解釋 |
|---|---|
git submodule add <repo_url> <path> |
將一個 Git 倉庫作為子模塊添加到當(dāng)前項目中。 |
git submodule update --init --recursive |
克隆主項目后,初始化并更新所有子模塊。 |
git worktree add <path> <branch> |
為同一個倉庫創(chuàng)建另一個鏈接的工作目錄。允許你同時在多個分支上工作,而無需來回切換。非常適合同時處理一個項目的多個功能或修復(fù)。 |
十一、 配置與別名
讓 Git 更符合你的使用習(xí)慣。
| 命令 | 解釋 |
|---|---|
git config --global alias.<alias> <command> |
為 Git 命令創(chuàng)建別名,簡化輸入。 例如: git config --global alias.co checkout -> 之后可以用 git cogit config --global alias.l "log --oneline --graph --all" -> 之后可以用 git l
|
git config --global core.editor "code --wait" |
設(shè)置 VS Code 作為 Git 的默認(rèn)文本編輯器(用于提交信息等)。 |
十二、 文件操作
| 命令 | 解釋 |
|---|---|
git rm <file> |
從工作目錄和 Git 倉庫中刪除文件,并暫存這個刪除操作。 |
git rm --cached <file> |
僅從 Git 倉庫的暫存區(qū)中刪除文件(取消跟蹤),但保留在工作目錄中。常用于當(dāng)你忘記將文件添加到 .gitignore 時。 |
git mv <old_file> <new_file> |
移動或重命名文件,并暫存這個操作。Git 能更好地跟蹤文件的歷史。 |
高級工作流示例
1. 使用 git commit --amend:
# 提交后發(fā)現(xiàn)漏了一個文件,或者提交信息寫錯了
git add forgotten_file.txt
git commit --amend -m "New corrected commit message"
# 這會替換上一次的提交,不會產(chǎn)生新的提交記錄
2. 使用 git rebase -i 壓縮提交:
# 假設(shè)你最近有3次提交,想合并成1個清晰的提交
git rebase -i HEAD~3
# 在打開的編輯器中,將后兩次提交前面的 'pick' 改為 'squash' 或 's'
# 保存退出后,Git會讓你編輯合并后的新提交信息
3. 使用 reflog 恢復(fù)誤刪的提交:
# 不小心用 `git reset --hard` 刪除了一個提交
git reflog
# 找到刪除前的那個提交的哈希值(例如 abc123f)
git reset --hard abc123f
# 你的提交就恢復(fù)了!
掌握這些補(bǔ)充命令將使你從一個 Git 基礎(chǔ)用戶升級為一個高效、能處理復(fù)雜場景的 Git 高手。記住,涉及重寫歷史的命令在共享分支上要格外小心!