Git 常用命令 Git 基本操作 快速上手
Git 是目前最流行的分佈式版本控制系統,由 Linux 之父 Linus Torvalds 創建。無論你是初學者還是有經驗的開發者,掌握 Git 常用命令都是必不可少的技能。本文將系統性地介紹 Git 的核心命令和操作技巧。
創建目錄
在開始使用 Git 之前,我們需要先創建項目目錄:
mkdir "目錄名稱"
cd "目錄名稱"常用目錄操作命令:
# 創建多級目錄
mkdir -p project/src/components
# 查看當前目錄
pwd
# 列出目錄內容
ls -la
# 切換目錄
cd ../Git 常用命令
以下是 Git 最基礎且最常用的命令,每個開發者都應該熟練掌握:
| 命令 | 說明 | 使用場景 |
|---|---|---|
git init | 初始化 Git 本地倉庫 | 在新項目中首次啟用版本控制 |
git status | 查看當前狀態 | 隨時檢查工作區和暫存區的變化 |
git add [文件名] | 添加文件到緩存區 | 準備提交特定文件 |
git add . | 添加當前目錄下的所有文件到緩存區中 | 準備提交所有變更 |
git commit -m "描述信息" | 提交至版本庫(本地倉庫) | 保存變更快照 |
git clone [線上倉庫地址] | 克隆線上倉庫到本地 | 獲取遠程項目的完整副本 |
git push | 推送到線上倉庫 | 將本地提交同步到遠程 |
git pull | 從線上倉庫拉取到本地 | 獲取遠程的最新變更 |
git reset | 在緩存區的文件取消暫存 | 撤銷 add 操作 |
git rm [文件名] | 刪除文件 | 從工作區和版本庫中移除文件 |
命令詳細解析
1. git init - 初始化倉庫
# 在當前目錄初始化 Git 倉庫
git init
# 初始化並指定分支名稱(推薦)
git init -b main
# 初始化裸倉庫(用於服務器端)
git init --bare注意事項:
- 執行後會生成
.git隱藏目錄,包含所有版本控制信息 - 只需執行一次,重複執行不會覆蓋已有數據
- 建议在項目根目錄執行
2. git status - 查看狀態
# 查看簡要狀態
git status -s
# 查看詳細狀態
git status
# 查看忽略的文件
git status --ignored輸出解讀:
- Changes not staged for commit: 已修改但未添加到暫存區
- Changes to be committed: 已添加到暫存區,準備提交
- Untracked files: 未被 Git 追蹤的新文件
3. git add - 添加文件到暫存區
# 添加單個文件
git add README.md
# 添加多個文件
git add file1.txt file2.txt
# 添加整個目錄
git add src/
# 添加所有變更(包括新增、修改、刪除)
git add .
# 交互式添加(選擇性添加)
git add -i
# 添加所有 .js 文件
git add *.js
# 添加已修改和刪除的文件(不包括新文件)
git add -u
# 只添加新文件(不包括已修改的文件)
git add -N最佳實踐:
- 避免使用
git add .提交所有文件,應該審視每個變更 - 相關變更應該分批提交,保持提交的原子性
- 使用
.gitignore排除不需要版本控制的文件
4. git commit - 提交變更
# 基本提交
git commit -m "feat: 添加用戶登錄功能"
# 詳細描述(多行消息)
git commit -m "feat: 添加用戶登錄功能" -m "- 實現 JWT 認證\n- 添加登錄頁面\n- 集成後端 API"
# 修改最後一次提交
git commit --amend
# 跳過暫存區直接提交(不推薦)
git commit -a -m "quick fix"
# 空提交(用於觸發 CI/CD)
git commit --allow-empty -m "trigger build"提交信息規範(Conventional Commits):
<type>(<scope>): <subject>
<body>
<footer>常用 type:
feat: 新功能fix: 修復 bugdocs: 文檔變更style: 代碼格式(不影響功能)refactor: 重構test: 測試相關chore: 構建過程或輔助工具的變動
示例:
git commit -m "feat(auth): 添加 OAuth2 登錄支持"
git commit -m "fix(api): 修復用戶數據查詢錯誤"
git commit -m "docs(readme): 更新安裝說明"5. git clone - 克隆倉庫
# 基本克隆
git clone https://github.com/username/repo.git
# 克隆到指定目錄
git clone https://github.com/username/repo.git my-project
# 克隆特定分支
git clone -b develop https://github.com/username/repo.git
# 淺克隆(只獲取最近一次提交,速度快)
git clone --depth 1 https://github.com/username/repo.git
# 克隆子模塊
git clone --recursive https://github.com/username/repo.git使用場景:
- 新成員加入項目時獲取代碼
- 在不同機器上同步工作
- 開源項目貢獻代碼
6. git push - 推送至遠程
# 推送到默認遠程和分支
git push
# 首次推送並設置上游分支
git push -u origin main
# 推送到特定分支
git push origin feature/login
# 強制推送(謹慎使用!)
git push --force
git push --force-with-lease # 更安全的強制推送
# 推送標籤
git push origin --tags
# 推送所有分支
git push --all origin⚠️ 警告:
--force會覆蓋遠程歷史,可能丟失他人的提交- 優先使用
--force-with-lease,它會在推送前檢查遠程是否有新提交 - 避免在共享分支上使用強制推送
7. git pull - 拉取遠程變更
# 基本拉取(等於 fetch + merge)
git pull
# 拉取特定分支
git pull origin main
# 使用 rebase 代替 merge(保持線性歷史)
git pull --rebase
# 僅獲取不合併
git fetch
# 查看所有遠程分支
git fetch --allpull vs fetch + merge:
# 這兩種方式等效
git pull origin main
# 等價於
git fetch origin main
git merge origin/main推薦使用 rebase:
# 配置全局使用 rebase
git config --global pull.rebase true
# 或在拉取時指定
git pull --rebase origin main8. git reset - 重置狀態
# 軟重置:保留工作區和暫存區,只移動 HEAD
git reset --soft HEAD~1
# 混合重置(默認):保留工作區,清空暫存區
git reset HEAD~1
git reset --mixed HEAD~1
# 硬重置:清空工作區和暫存區(危險!)
git reset --hard HEAD~1
# 重置到特定提交
git reset --hard abc1234
# 重置特定文件
git reset HEAD filename.txt使用場景:
--soft: 重新組織多次提交為一次--mixed: 撤銷 add,保留修改--hard: 完全放棄最近的提交和修改
9. git rm - 刪除文件
# 刪除文件並從版本庫中移除
git rm filename.txt
# 僅從版本庫移除,保留工作區文件
git rm --cached filename.txt
# 遞歸刪除目錄
git rm -r folder/
# 強制刪除(即使有修改)
git rm -f filename.txt與普通刪除的區別:
# 普通刪除(Git 會檢測到文件缺失)
rm filename.txt
git status # 顯示 deleted: filename.txt
# Git 刪除(同時從工作區和版本庫移除)
git rm filename.txt
git status # 顯示 Changes to be committed: deleted: filename.txt添加遠程倉庫
遠程倉庫是代碼的集中存儲地,方便團隊協作和備份。
基本操作
# 添加遠程倉庫
git remote add origin https://github.com/username/repository.git
# 提交到遠程倉庫(首次推送需設置上游分支)
git push -u origin master
# 或使用現代默認分支名
git push -u origin main查看已配置的遠程倉庫
# 查看遠程倉庫名稱
git remote
# 輸出:origin
# 查看遠程倉庫詳細信息
git remote show origin
# 查看遠程倉庫 URL
git remote -v
# 輸出:
# origin https://github.com/username/repo.git (fetch)
# origin https://github.com/username/repo.git (push)管理遠程倉庫
# 移除遠程倉庫(只移除本地記錄,不影響遠程)
git remote remove origin
# 或
git remote rm origin
# 重命名遠程倉庫
git remote rename origin upstream
# 修改遠程倉庫 URL
git remote set-url origin https://new-url.com/repo.git
# 添加多個遠程倉庫
git remote add upstream https://github.com/original/repo.git多遠程倉庫工作流
# 常見於開源項目貢獻
# origin: 你的 fork
# upstream: 原始項目
# 添加兩個遠程
git remote add origin https://github.com/yourname/repo.git
git remote add upstream https://github.com/original/repo.git
# 從 upstream 同步最新代碼
git fetch upstream
git merge upstream/main
# 推送到你的 fork
git push origin mainGit 分支操作
分支是 Git 最強大的特性之一,允許並行開發不同功能而不互相干擾。
分支基本操作
| 命令 | 說明 | 備註 |
|---|---|---|
git branch | 查看本地分支 | 當前分支前有 * 號 |
git branch -r | 查看遠程分支 | |
git branch -a | 查看本地和遠程全部分支 | |
git branch 分支名 | 創建分支 | 不切換到新分支 |
git checkout 分支名 | 切換分支 | |
git push origin 分支名 | 推送分支到遠程倉庫 | |
git branch -d 分支名 | 刪除分支 | 只能刪除已合併的分支 |
git branch -D 分支名 | 強制刪除分支 | 即使未合併也刪除 |
git push origin -d 分支名稱 | 刪除遠程分支 | |
git merge 被合併的分支名 | 合併分支 | 將指定分支合併到當前分支 |
git checkout -b 分支名 | 創建並切換到該分支 | 相當於 git branch + git checkout |
分支操作詳解
查看分支
# 查看本地分支
git branch
# 輸出:
# * main
# feature/login
# bugfix/header
# 查看遠程分支
git branch -r
# 輸出:
# origin/main
# origin/develop
# 查看所有分支
git branch -a
# 查看分支的最後提交信息
git branch -v
# 查看已合併到當前分支的分支
git branch --merged
# 查看未合併的分支
git branch --no-merged創建和切換分支
# 方法1:分兩步
git branch feature/user-profile
git checkout feature/user-profile
# 方法2:一步完成(推薦)
git checkout -b feature/user-profile
# 方法3:使用 switch 命令(Git 2.23+)
git switch -c feature/user-profile
# 基於特定提交創建分支
git branch hotfix abc1234
# 基於遠程分支創建本地分支
git checkout -b feature/login origin/feature/login分支命名規範:
feature/xxx: 新功能bugfix/xxx: Bug 修復hotfix/xxx: 緊急修復release/x.x: 發布分支docs/xxx: 文檔更新
合併分支
# 切換到目標分支
git checkout main
# 合併 feature 分支
git merge feature/login
# 使用 squash 合併(將多次提交壓縮為一次)
git merge --squash feature/login
git commit -m "feat: 添加登錄功能"
# 中止合併(如果有衝突)
git merge --abort
# 繼續合併(解決衝突後)
git merge --continue合併策略:
Fast-forward(快進合併)
- 當目標分支沒有新提交時
- 只是簡單地移動指針
Three-way merge(三方合併)
- 當兩個分支都有新提交時
- 創建一個新的合併提交
Rebase(變基)
bash# 將當前分支的提交「移動」到目標分支頂部 git checkout feature/login git rebase main # 優點:保持線性歷史 # 缺點:改寫歷史,不適用於共享分支
處理合併衝突
# 當合併出現衝突時
git status
# 顯示:both modified: filename.txt
# 1. 打開文件,手動解決衝突
# 衝突標記:
# <<<<<<< HEAD
# 當前分支的內容
# =======
# 要合併分支的內容
# >>>>>>> feature/login
# 2. 編輯文件,保留需要的內容
# 3. 標記衝突已解決
git add filename.txt
# 4. 完成合併
git commit刪除分支
# 刪除本地分支(只能刪除已合併的)
git branch -d feature/login
# 強制刪除本地分支(即使未合併)
git branch -D feature/experiment
# 刪除遠程分支
git push origin --delete feature/login
# 或
git push origin -d feature/login
# 清理已刪除的遠程分支引用
git remote prune origin
# 刪除所有已合併的本地分支(謹慎使用!)
git branch --merged main | grep -v "\* main" | xargs git branch -d分支工作流示例
Git Flow 工作流
# 1. 從 main 創建新功能分支
git checkout main
git pull origin main
git checkout -b feature/payment
# 2. 開發過程中定期提交
git add .
git commit -m "feat: 添加支付接口"
# 3. 同步 main 的最新變更
git fetch origin
git rebase origin/main
# 4. 推送到遠程
git push -u origin feature/payment
# 5. 創建 Pull Request / Merge Request
# 6. 合併後刪除分支
git checkout main
git pull origin main
git branch -d feature/payment
git push origin --delete feature/paymentGitHub Flow(更簡單)
# 1. 從 main 創建分支
git checkout -b update-readme
# 2. 提交變更
git add .
git commit -m "docs: 更新 README"
# 3. 推送到遠程
git push -u origin update-readme
# 4. 在 GitHub 上創建 PR
# 5. Code Review 通過後合併
# 6. 更新本地 main
git checkout main
git pull origin main忽略文件
.gitignore 文件用於指定哪些文件或目錄不應被 Git 追蹤。
創建 .gitignore 文件
# 創建 .gitignore 文件
touch .gitignore
# 或使用 git 命令
git touch .gitignore # 注意:這不是標準 Git 命令.gitignore 語法規則
# 這是註釋
# 過濾整個文件夾
/mtk/
node_modules/
dist/
build/
# 過濾所有 .zip 文件
*.zip
*.tar.gz
*.exe
# 過濾某個具體文件
/mtk/do.c
config/local.json
# 不過濾某個文件(例外規則)
!important.log
!keep.txt
# 匹配任意層級目錄
**/temp
**/*.log
# 匹配文件擴展名
*.pyc
*.class
*.o
# 忽略所有以 . 開頭的文件(除了 .gitignore 本身)
.*
!.gitignore常見的 .gitignore 模板
Node.js 項目
# Dependencies
node_modules/
.pnp
.pnp.js
# Testing
coverage/
.nyc_output/
# Production
build/
dist/
.next/
out/
# Misc
.DS_Store
.env
.env.local
.env.*.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# IDE
.vscode/
.idea/
*.swp
*.swoPython 項目
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# Virtual environments
venv/
env/
.venv/
# Distribution / packaging
dist/
build/
*.egg-info/
# IDE
.vscode/
.idea/
.pytest_cache/
# Environment variables
.env
.env.localJava 項目
# Compiled class files
*.class
# Log files
*.log
# Package Files
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# Maven
target/
pom.xml.tag
pom.xml.releaseBackup
# Gradle
.gradle/
build/
!gradle-wrapper.jar
!**/src/main/**/build/
!**/src/test/**/build/
# IDE
.idea/
*.iml
.vscode/.gitignore 不生效的解決方法
# 問題:添加了規則但文件仍被追蹤
# 原因:文件之前已被 Git 追蹤
# 解決方案:
# 1. 從 Git 緩存中移除
git rm -r --cached .
# 2. 重新添加所有文件
git add .
# 3. 提交變更
git commit -m "chore: update .gitignore"Git 標籤
標籤用於標記重要的歷史節點,通常用於發布版本。
標籤類型
- 輕量標籤(Lightweight):類似於不變的分支
- 附註標籤(Annotated):包含完整信息的標籤對象
標籤操作
| 命令 | 說明 | 示例 |
|---|---|---|
git tag 標籤名 | 創建輕量標籤 | git tag v1.0 |
git tag -a 標籤名 -m "描述" | 創建附註標籤 | git tag -a v1.0 -m "Release version 1.0" |
git tag | 查看所有標籤 | |
git tag -l "v1.*" | 查找匹配的標籤 | |
git show 標籤名 | 查看標籤詳情 | git show v1.0 |
git push origin 標籤名 | 將標籤推送到遠程 | git push origin v1.0 |
git push origin --tags | 推送所有標籤 | |
git tag -d 標籤名 | 刪除本地標籤 | git tag -d v1.0 |
git push origin :refs/tags/標籤名 | 刪除遠程標籤 | |
git push origin --delete tag 標籤名 | 刪除遠程標籤(簡化版) |
標籤操作詳解
創建標籤
# 創建輕量標籤(當前提交)
git tag v1.0
# 創建附註標籤(推薦,包含更多信息)
git tag -a v1.0 -m "Release version 1.0"
# 在特定提交上創建標籤
git tag -a v1.0 abc1234 -m "Version 1.0"
# 創建簽名標籤(需要 GPG 密鑰)
git tag -s v1.0 -m "Signed release"查看標籤
# 查看所有標籤
git tag
# 輸出:
# v0.1
# v0.2
# v1.0
# 按模式搜索標籤
git tag -l "v1.*"
git tag -l "*beta*"
# 查看標籤詳情
git show v1.0
# 查看標籤的提交信息
git log --oneline --decorate --graph --all | grep v1.0推送標籤
# 推送單個標籤
git push origin v1.0
# 推送所有標籤
git push origin --tags
# ⚠️ 注意:git push 不會自動推送標籤,必須顯式指定刪除標籤
# 刪除本地標籤
git tag -d v1.0
# 刪除遠程標籤(方法1)
git push origin :refs/tags/v1.0
# 刪除遠程標籤(方法2,更直觀)
git push origin --delete tag v1.0
# 批量刪除本地標籤
git tag -l "v0.*" | xargs git tag -d
# 批量刪除遠程標籤
git tag -l "v0.*" | xargs -I {} git push origin --delete tag {}檢出標籤
# 查看標籤對應的代碼(分離 HEAD 狀態)
git checkout v1.0
# 基於標籤創建新分支
git checkout -b hotfix-v1.0 v1.0
# 回到主分支
git checkout main標籤最佳實踐
使用語義化版本號
bashgit tag -a v1.0.0 -m "Major release" git tag -a v1.1.0 -m "Minor release with new features" git tag -a v1.1.1 -m "Patch release with bug fixes"始終使用附註標籤
bash# ✅ 推薦 git tag -a v1.0 -m "Release notes here" # ❌ 不推薦 git tag v1.0在穩定的提交上打標籤
bash# 確保所有測試通過 # 確保代碼已審查 # 然後再打標籤 git tag -a v2.0.0 -m "Production release"標籤不可變
- 標籤一旦創建就不應修改
- 如果需要修正,刪除舊標籤並創建新標籤(需通知團隊)
實用技巧和快捷命令
Git 別名配置
# 配置常用別名
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
# 使用別名
git st # 等同於 git status
git co main # 等同於 git checkout main
git lg # 漂亮的日誌輸出查看歷史
# 查看提交歷史
git log
# 簡潔的日誌
git log --oneline
# 圖形化顯示
git log --graph --oneline --all
# 查看特定文件的歷史
git log --follow filename.txt
# 查看某作者的提交
git log --author="John Doe"
# 查看最近 n 次提交
git log -n 5比較差異
# 查看工作區和暫存區的差異
git diff
# 查看暫存區和最新提交的差異
git diff --staged
# 比較兩個分支
git diff main..develop
# 比較兩個提交
git diff abc1234 def5678
# 查看統計信息
git diff --stat暫存工作進度
# 暫存當前工作
git stash
# 暫存並包含未追蹤的文件
git stash -u
# 查看暫存列表
git stash list
# 恢復最新的暫存
git stash pop
# 恢復特定的暫存
git stash apply stash@{1}
# 刪除暫存
git stash drop stash@{0}
# 清空所有暫存
git stash clear常見問題排查
問題 1:提交錯了分支
# 解決方案:使用 cherry-pick
git checkout correct-branch
git cherry-pick abc1234 # 錯誤提交的 hash
# 從原分支刪除錯誤提交
git checkout wrong-branch
git reset --hard HEAD~1問題 2:想修改最後一次提交信息
git commit --amend -m "新的提交信息"問題 3:不小心刪除了重要分支
# 查看 reflog 找到分支之前的提交
git reflog
# 基於該提交重新創建分支
git branch recovered-branch abc1234問題 4:合併後發現錯誤
# 如果還沒推送,可以回退
git reset --hard HEAD~1
# 如果已經推送,需要 revert
git revert -m 1 MERGE_COMMIT_HASH總結
掌握 Git 常用命令是每個開發者的必修課。本文涵蓋了:
- 基礎操作:init、add、commit、status
- 遠程倉庫:clone、push、pull、remote
- 分支管理:branch、checkout、merge
- 標籤使用:tag 的創建和管理
- 文件忽略:.gitignore 配置
- 實用技巧:別名、日誌、差異比較
下一步學習建議:
記住:Git 是一個強大的工具,熟能生巧。多在實際項目中練習,你會越來越熟練!