Git 是現代軟件開發中不可或缺的分布式版本控制系統。它不僅能追蹤代碼變更,還能協調多人協作、管理項目歷史。本文從核心概念入手,逐步深入講解 Git 的基礎與高級命令,結合實用場景,幫助您從入門到精通。
一、Git 核心概念
理解 Git 的工作原理是高效使用它的前提。以下是三個核心概念及其關系:
1. 項目目錄(工作區)
項目目錄是你直接操作的本地文件夾,也叫“工作區”(Working Directory)。它包含代碼文件、配置文件等所有內容。Git 不會自動管理這里的任何文件,除非你明確告訴它哪些需要追蹤。工作區是你編寫代碼的起點。
2. 暫存區
暫存區(Staging Area 或 Index)是工作區與 Git 倉庫之間的中間層。通過 git add
,你可以選擇性地將工作區的變更“暫存”到這里,準備提交。暫存區的存在讓你可以分步驟組織提交內容,而不是一次性提交所有修改。例如,你可以先暫存部分文件,檢查后再提交。
3. Git 倉庫
Git 倉庫(Repository)是存儲項目歷史和版本數據的地方。本地倉庫位于項目目錄下的 .git
文件夾,包含所有提交記錄、分支信息等。遠程倉庫(如 GitHub、GitLab)則是多人協作時的共享存儲。通過 git commit
,暫存區的更改會被永久記錄到本地倉庫。
三者關系
- 工作區 → 暫存區:通過
git add
將修改“暫存”。 - 暫存區 → 倉庫:通過
git commit
將暫存內容提交。 - 倉庫 → 工作區:通過
git checkout
或git restore
恢復文件。
這三層結構是 Git 的核心邏輯,貫穿所有操作。
二、基礎命令詳解
1. Git 配置(git config)
在使用 Git 前,配置用戶身份和偏好是必要步驟。這些設置會影響提交記錄和操作體驗。
git config --global user.name "Your Name"
設置全局用戶名,所有提交都會攜帶此信息。例如:git config --global user.name "Alice"
。git config --global user.email "your.email@example.com"
設置全局郵箱,通常與代碼托管平臺(如 GitHub)賬號一致。例如:git config --global user.email "alice@example.com"
。git config --global core.editor "vim"
指定默認編輯器,用于編寫提交信息。支持 Vim、Nano、VS Code(需配置路徑,如"code --wait"
)等。git config --global core.autocrlf true
處理換行符問題。Windows 用戶建議設為true
(自動轉換 CRLF 為 LF),Linux/Mac 用戶設為input
(僅提交時轉換)或false
(不轉換)。git config --global -e
使用默認編輯器打開全局配置文件(通常是~/.gitconfig
),手動編輯所有設置。
案例
新手小明剛安裝 Git,他運行:
git config --global user.name "Ming"
git config --global user.email "ming@example.com"
git config --global core.editor "code --wait"
現在,他的每條提交都會標記為 “Ming ming@example.com”,并且用 VS Code 編寫提交信息。
2. 文件操作(git add / git rm / git mv)
添加文件到暫存區
git add file.txt
將指定文件(如file.txt
)加入暫存區。git add *.txt
添加所有.txt
文件,支持通配符。git add .
添加當前目錄下所有改動(新增、修改、刪除)的文件。
Git 只追蹤顯式添加的文件。每次修改已追蹤文件后,需再次 git add
更新暫存區。例如,你修改了 readme.txt
,必須運行 git add readme.txt
才能提交最新版本。
刪除文件
git rm file.txt
從工作區和暫存區同時刪除文件,下次提交時記錄刪除操作。git rm --cached file.txt
停止追蹤某文件,但保留工作區副本。常用于誤提交的文件(如日志文件)。git rm -r bin/
遞歸刪除文件夾及其內容(如bin/
目錄)。
重命名或移動
git mv oldname.txt newname.txt
重命名文件并更新暫存區。例如:git mv readme.md README.md
。git mv file.txt dir/
將文件移動到指定目錄。
案例
小明新建了 test.txt
,并運行:
git add test.txt
后來他決定重命名:
git mv test.txt test_new.txt
若想刪除:
git rm test_new.txt
3. 查看狀態(git status)
git status
顯示當前工作區和暫存區的狀態,包括:- 未暫存的修改(Changes not staged for commit)。
- 已暫存待提交的內容(Changes to be committed)。
- 未追蹤的文件(Untracked files)。
git status -s
簡潔輸出,例如:M file.txt
:已修改但未暫存。A file.txt
:已暫存的新文件。?? newfile.txt
:未追蹤文件。
案例
小明修改了 main.py
并新增 notes.txt
,運行 git status
:
Changes not staged for commit:modified: main.py
Untracked files:notes.txt
他運行 git add .
,再檢查:
Changes to be committed:modified: main.pynew file: notes.txt
4. 提交更改(git commit)
git commit -m "Fix the bug"
提交暫存區內容,附帶簡潔消息。社區慣例使用現在時,如 “Add feature” 而不是 “Added feature”。git commit
打開默認編輯器(如 Vim)輸入多行提交信息。保存并關閉后提交。git commit -a
自動暫存所有已追蹤文件的修改并提交,但不包括新增文件。
注意事項
- 提交消息要清晰。例如:
"Update login validation logic"
比"Update"
更具描述性。 -a
不適用于新文件,需先git add
。
案例
小明修復了一個 bug:
git add bugfix.py
git commit -m "Fix login error handling"
若想跳過暫存:
git commit -a -m "Update readme"
5. 查看差異(git diff)
git diff
比較工作區與暫存區的差異。git diff --staged
比較暫存區與上次提交的差異。git diff HEAD
比較工作區與上次提交的差異(包括未暫存和已暫存)。
配置差異工具
git config --global diff.tool vscode
使用 VS Code 查看差異。git config --global difftool.vscode.cmd "code --wait --diff $LOCAL $REMOTE"
設置調用命令。git difftool
啟動配置的工具。
輸出解讀
- 綠色
+
:新增行。 - 紅色
-
:刪除行。 @
符號:指示變更位置。
案例
小明修改了 main.py
,運行 git diff
:
- print("Hello")
+ print("Hello, Git!")
暫存后運行 git diff --staged
,確認變更正確。
6. 查看歷史(git log / git show)
git log
顯示提交歷史,每條包括哈希值、作者、日期和消息。git log --oneline
每條提交一行,僅顯示哈希和消息。git log --oneline --reverse
正序顯示簡潔歷史。git log --graph
顯示分支合并圖。git show d601
查看指定提交(d601
是哈希前綴)的詳情。git show HEAD
查看最新提交。git show HEAD~1
查看上一次提交。
案例
小明運行 git log --oneline
:
d601f2e Fix the bug
a3b9c1d Add main.py
他用 git show d601f2e
查看具體變更。
7. 文件列表與結構
git ls-files
列出暫存區追蹤的文件。git ls-tree HEAD
顯示當前提交的樹結構,包括文件和目錄。
案例
小明運行 git ls-files
:
main.py
readme.txt
8. 撤銷操作(git restore)
git restore file.txt
丟棄工作區中file.txt
的未暫存修改。git restore --staged file.txt
將暫存區的file.txt
撤銷回工作區。git restore --source=HEAD~1 file.txt
恢復文件到上一次提交的狀態。
案例
小明誤改了 readme.txt
,運行:
git restore readme.txt
若已暫存,運行:
git restore --staged readme.txt
三、遠程倉庫操作
遠程倉庫是團隊協作的關鍵,常用平臺包括 GitHub、GitLab 和 Bitbucket。
1. 初始化與克隆
git init
在當前目錄創建新倉庫。git clone https://github.com/user/repo.git
克隆遠程倉庫到本地,自動關聯遠程。
案例
小明克隆項目:
git clone https://github.com/ming/project.git
cd project
2. 關聯遠程倉庫
git remote add origin https://github.com/user/repo.git
添加遠程倉庫,命名為origin
。git remote -v
查看關聯的遠程地址。git remote remove origin
刪除關聯。
3. 推送與拉取
git push origin main
推送本地main
分支到遠程。git push -u origin main
推送并設置上游分支,便于后續簡化為git push
。git pull origin main
拉取遠程main
分支并合并。
案例
小明提交后推送:
git push origin main
若遠程有更新:
git pull origin main
4. 分支管理
git branch
列出本地分支,帶*
表示當前分支。git branch -r
列出遠程分支。git branch feature
創建分支feature
。git checkout feature
切換到feature
分支。git checkout -b feature
創建并切換。git push origin feature
推送分支到遠程。
案例
小明開發新功能:
git checkout -b login-feature
git add login.py
git commit -m "Add login validation"
git push origin login-feature
四、高級用法與技巧
1. 分支合并與沖突解決
git merge feature
將feature
分支合并到當前分支。- 沖突解決:若有沖突,Git 會標記沖突文件。手動編輯后:
git add resolved_file.txt git commit
案例
小明合并分支:
git checkout main
git merge login-feature
若沖突,編輯文件后提交。
2. 變基(git rebase)
git rebase main
將當前分支變基到main
,保持線性歷史。git rebase -i HEAD~3
交互式變基,修改最近三次提交。
3. 回滾操作
git reset --soft HEAD~1
撤銷最后一次提交,保留修改。git reset --hard HEAD~1
撤銷提交并丟棄修改。
4. 忽略文件
創建 .gitignore
文件,內容如:
*.log
node_modules/
運行 git add .gitignore
并提交。
五、常見問題與解答
- 誤刪文件怎么辦?
若未提交:git restore file.txt
。若已提交:git checkout HEAD file.txt
。 - 提交錯了消息?
修改最后一次提交:git commit --amend -m "New message"
。 - 推送被拒絕?
先拉取更新:git pull --rebase
,再推送。
六、結語
Git 的強大在于其靈活性和分布式特性。從基礎的 add
、commit
到遠程協作的 push
、pull
,再到分支管理和沖突解決,本文涵蓋了日常開發所需的核心操作。通過實踐這些命令,您將能高效管理代碼并與團隊協作。繼續探索 stash
、tag
等高級功能,Git 將成為您開發的得力助手!