Git 從入門到精通
涵蓋了核心概念、常用命令、協作流程和高級技巧:
核心理念:
- 版本控制: 記錄文件變化歷史,可回溯到任意版本。
- 分布式: 每個開發者擁有完整的倉庫副本(包括完整歷史),可離線工作。
- 快照(Snapshot): Git 記錄的是文件系統的快照,而非差異(雖然內部優化存儲)。
- 三個區域:
- 工作目錄 (Working Directory): 你實際看到和修改文件的地方。
- 暫存區 (Staging Area / Index): 一個準備區,標記了哪些修改將要被提交。
- 本地倉庫 (Local Repository):
.git
目錄,存儲項目的完整歷史、元數據(如分支、標簽)。
- 三種狀態:
- 已修改 (Modified): 文件在工作目錄中被修改,但尚未放入暫存區。
- 已暫存 (Staged): 修改的文件已放入暫存區,等待提交。
- 已提交 (Committed): 數據已安全地保存在本地倉庫中。
第一部分:入門基礎 (Getting Started)
- 安裝:
- 官網 (https://git-scm.com/) 下載對應操作系統的安裝包。
- 安裝時注意選擇適合你環境的配置(如默認編輯器、PATH 環境變量)。
- 初始配置 (首次使用必做):
git config --global user.name "Your Name"
(設置用戶名)git config --global user.email "your.email@example.com"
(設置郵箱)git config --global core.editor "vim"
(可選,設置默認文本編輯器,如 vscode, nano, vim)git config --list
(查看當前配置)
- 創建倉庫:
- 初始化新倉庫:
git init
(在當前目錄創建新的空 Git 倉庫) - 克隆現有倉庫:
git clone <repository_url>
(將遠程倉庫完整復制到本地)
- 初始化新倉庫:
- 基本工作流 (單兵作戰):
- 修改文件: 在工作目錄編輯文件 -> 狀態變為
Modified
。 - 添加文件到暫存區:
git add <file_name>
或git add .
(添加所有修改/新文件) -> 狀態變為Staged
。 - 提交更改:
git commit -m "Descriptive commit message"
-> 狀態變為Committed
,快照存入本地倉庫。 - 查看狀態:
git status
(查看工作目錄、暫存區狀態) - 查看歷史:
git log
(查看提交歷史)git log --oneline
(簡潔歷史)git log -p
(帶詳細差異)
- 修改文件: 在工作目錄編輯文件 -> 狀態變為
- 忽略文件 (.gitignore):
- 創建
.gitignore
文件,列出不想被 Git 跟蹤的文件/目錄模式(如編譯產物、日志、臨時文件、敏感信息)。 - 規則支持通配符 (
*
,?
), 目錄 (/
), 取反 (!
)。
- 創建
第二部分:分支與協作 (Branching & Collaboration)
- 分支 (Branch):
- 概念: 輕量級的可移動指針,指向某個提交。用于隔離開發(新功能、修復 Bug)、實驗。
- 創建分支:
git branch <branch_name>
(基于當前提交創建新分支) - 切換分支:
git checkout <branch_name>
或git switch <branch_name>
(更新工作目錄到該分支最新狀態) - 創建并切換:
git checkout -b <new_branch>
或git switch -c <new_branch>
- 查看分支:
git branch
(列出本地分支,*
表示當前分支)git branch -a
(列出所有分支,包括遠程) - 刪除分支:
git branch -d <branch_name>
(安全刪除,需合并過)git branch -D <branch_name>
(強制刪除未合并分支)
- 遠程倉庫 (Remote):
- 概念: 托管在網絡上的倉庫(如 GitHub, GitLab, Bitbucket),用于團隊協作和備份。
- 查看遠程:
git remote -v
- 添加遠程:
git remote add <remote_name> <repository_url>
(通常遠程默認名為origin
) - 拉取更新:
git fetch <remote_name>
(從遠程下載最新數據到本地倉庫的remote/<remote_name>/<branch>
,不自動合并) - 拉取并合并:
git pull <remote_name> <remote_branch>
(相當于git fetch
+git merge origin/<remote_branch>
) - 推送更新:
git push <remote_name> <local_branch>:<remote_branch>
(將本地分支推送到遠程分支,常用git push origin main
) - 跟蹤分支:
git push -u origin <local_branch>
(首次推送時設置上游跟蹤,后續可直接git push
)
- 合并 (Merge):
- 概念: 將一個分支的更改集成到另一個分支。
- 操作: 切換到目標分支 (如
main
),執行git merge <source_branch>
。 - 結果: 創建一個新的“合并提交”(Merge Commit),該提交有兩個父提交。
- 沖突解決: 當同一文件的同一區域在不同分支有不同修改時發生。需手動編輯文件(Git 會標記沖突內容),
git add
解決后的文件,然后git commit
完成合并。
- 變基 (Rebase):
- 概念: 將當前分支的提交“重放”在目標分支(通常是更上游的分支,如
main
)的最新提交之上。 - 操作: 切換到要變基的分支 (如
feature
),執行git rebase <target_branch>
(如main
)。 - 結果: 歷史線變得線性、整潔,避免了不必要的合并提交。本質是重寫歷史!
- 適用場景: 整理本地分支歷史、保持特性分支更新。
- 黃金法則: 永遠不要變基已經推送到遠程倉庫且與他人共享的分支! (會導致協作混亂)
- 交互式變基:
git rebase -i <commit>
(如HEAD~3
),可編輯、壓縮(squash)、刪除、重排提交。強大但需謹慎。
- 概念: 將當前分支的提交“重放”在目標分支(通常是更上游的分支,如
- 協作工作流:
- 集中式工作流 (Centralized): 類似 SVN,所有人向一個
main
分支提交。簡單但易沖突。 - 功能分支工作流 (Feature Branch): 每個新功能/修復在獨立分支開發,完成后通過 Pull Request (PR) / Merge Request (MR) 請求合并到
main
。主流協作方式。 - Gitflow: 更復雜的分支模型(
main
,develop
,feature
,release
,hotfix
分支),適合有嚴格發布流程的項目。學習成本稍高。 - Forking Workflow: 常用于開源項目。貢獻者 Fork 主倉庫到自己的賬號下,在 Fork 出的倉庫開發,然后向主倉庫發起 PR。
- 集中式工作流 (Centralized): 類似 SVN,所有人向一個
第三部分:進階技巧 (Advanced Techniques)
- 撤銷更改:
- 丟棄工作目錄修改:
git restore <file>
(Git 2.23+) 或git checkout -- <file>
- 取消暫存:
git restore --staged <file>
(Git 2.23+) 或git reset HEAD <file>
- 撤銷最近提交:
- 創建新提交撤銷:
git revert <commit>
(安全,推薦用于已推送的提交) - 移除提交 (重寫歷史):
git reset [--soft|--mixed|--hard] <commit>
(危險! 慎用于已推送提交)--soft
:移動HEAD
和分支指針,保留修改在暫存區。--mixed
(默認):移動指針,保留修改在工作目錄(未暫存)。--hard
:移動指針,丟棄工作目錄和暫存區所有修改。
- 創建新提交撤銷:
- 丟棄工作目錄修改:
- 儲藏更改 (Stash):
- 概念: 臨時保存工作目錄和暫存區的修改,以便切換分支處理其他事情。
- 儲藏:
git stash
或git stash push -m "message"
- 查看儲藏列表:
git stash list
- 應用儲藏:
git stash apply [stash@{n}]
(不刪除儲藏項)git stash pop [stash@{n}]
(應用并刪除) - 刪除儲藏:
git stash drop [stash@{n}]
- 標簽 (Tag):
- 概念: 給某個重要的提交(如發布版本)打上永久標記。
- 創建輕量標簽:
git tag <tagname>
(指向特定提交) - 創建附注標簽:
git tag -a <tagname> -m "message"
(包含打標者、日期、信息,是完整的 Git 對象) - 查看標簽:
git tag
git show <tagname>
- 推送標簽:
git push origin <tagname>
或git push origin --tags
(推送所有標簽)
- 子模塊 (Submodule):
- 概念: 將一個 Git 倉庫作為另一個倉庫的子目錄嵌套使用。
- 添加子模塊:
git submodule add <repository_url> <path>
- 克隆包含子模塊的倉庫:
git clone --recurse-submodules <repository_url>
或git clone
后git submodule update --init --recursive
- 更新子模塊: 進入子模塊目錄手動
git pull
或git submodule update --remote
- 注意: 管理較復雜,需謹慎使用。
- 二分查找 (Bisect):
- 概念: 自動化地使用二分搜索定位引入 Bug 的提交。
- 開始:
git bisect start
- 標記壞提交:
git bisect bad [commit]
(通常當前HEAD
是壞的) - 標記好提交:
git bisect good <commit>
(已知沒有 Bug 的提交) - 測試與標記: Git 會自動檢出中間提交,你測試并標記
git bisect good
或git bisect bad
,重復直到找到第一個壞提交。 - 結束:
git bisect reset
- 鉤子 (Hooks):
- 概念: 在特定 Git 操作(如
commit
,push
,pre-receive
)前后自動觸發的自定義腳本(位于.git/hooks/
)。 - 常見用途: 代碼風格檢查、測試運行、提交信息格式校驗、部署觸發。
- 注意: 鉤子腳本不隨倉庫分發(
.git/hooks/
不被跟蹤),需其他機制共享(如模板)。
- 概念: 在特定 Git 操作(如
- Reflog:
- 概念: 記錄本地倉庫中
HEAD
和分支指針移動的歷史日志,是后悔藥。 - 查看:
git reflog
或git reflog show <branch>
- 用途: 恢復誤刪的分支、找回丟失的提交(即使
reset --hard
過)、理解操作歷史。
- 概念: 記錄本地倉庫中
第四部分:精通與最佳實踐 (Mastery & Best Practices)
- 理解 Git 內部原理 (提升故障診斷能力):
- 對象: Blob (文件內容), Tree (目錄結構), Commit (提交信息、父提交指針、Tree), Tag (標簽)。
- 引用 (Refs): 分支 (
refs/heads/
), 標簽 (refs/tags/
), 遠程跟蹤分支 (refs/remotes/
),HEAD
(指向當前檢出的提交或分支)。 - 存儲: 對象存儲在
.git/objects/
中,通過 SHA-1 哈希值尋址。 - 打包: Git 自動打包松散對象以節省空間 (
git gc
)。
- 編寫優秀的提交信息 (Commit Message):
- 格式:
- 第一行:簡短摘要 (<50字符),動詞開頭,說明做了什么。
- 空一行。
- 詳細描述:解釋為什么做這些改動,解決了什么問題,可能的影響。使用現在時態。
- 參考規范: Conventional Commits。
- 格式:
- 高效工作流:
- 頻繁提交: 小步快跑,每個提交聚焦一個邏輯更改。
- 善用分支: 隔離開發,避免在主分支直接修改。
- 保持主分支穩定:
main
/master
分支應總是可部署狀態。 - Code Review: 使用 PR/MR 進行代碼審查是提高質量的關鍵。
- 定期拉取更新: 減少合并沖突。
- 清理分支: 合并/廢棄后及時刪除本地和遠程分支。
- 處理大型倉庫/文件:
- Git LFS (Large File Storage): 將大文件(二進制、媒體)存儲在外部服務器,倉庫中只存指針。
- 淺克隆:
git clone --depth=1
(只克隆最近一次提交,節省空間和時間)。 - 稀疏檢出:
git sparse-checkout
(只檢出倉庫的指定子目錄)。
- 選擇 GUI 工具 (輔助理解):
- 官方:
git gui
(提交工具),gitk
(歷史查看器)。 - 第三方: Sourcetree, Fork, GitKraken, VS Code GitLens, GitHub Desktop, Tower 等。可視化操作有助于理解分支關系、提交歷史。
- 官方:
- 持續學習:
- 官方文檔:
git help <command>
或 https://git-scm.com/doc 是最權威的參考。 - Pro Git 書籍: https://git-scm.com/book/en/v2 (免費在線,非常全面)。
- 社區: Stack Overflow, Git 官方郵件列表/論壇。
- 官方文檔:
關鍵警告:
- 謹慎使用
git reset --hard
和git push --force
(或git push --force-with-lease
): 它們會重寫歷史。如果歷史已被推送到共享遠程倉庫,強制推送會破壞其他協作者的工作。僅在絕對必要且了解后果時使用(如在個人分支上整理未推送的本地提交)。 - 理解
rebase
vsmerge
: 選擇哪種取決于團隊約定和對歷史整潔度的要求。變基提供更干凈的歷史,但操作不當風險更高(尤其是在共享分支上)。
總結:
從入門到精通 Git 是一個循序漸進的過程:
- 掌握基礎:
init
,clone
,add
,commit
,status
,log
,.gitignore
。 - 理解分支與協作:
branch
,checkout
/switch
,fetch
,pull
,push
,merge
, 沖突解決。 - 提升效率:
rebase
,stash
,tag
,revert
, 撤銷操作。 - 深入原理與高級: 理解對象模型、Reflog、鉤子、二分查找、子模塊、內部命令。
- 實踐最佳實踐: 優秀提交信息、高效工作流、善用工具、安全操作。
實踐是最好的老師! 多動手操作,遇到問題善用 git help
和搜索。理解 Git 的思維方式(快照、分支指針)比死記命令更重要。祝你 Git 之旅順利!