跳轉到內容

Git 常用命令 Git 基本操作 快速上手

Git Commands Reference

Git 是目前最流行的分佈式版本控制系統,由 Linux 之父 Linus Torvalds 創建。無論你是初學者還是有經驗的開發者,掌握 Git 常用命令都是必不可少的技能。本文將系統性地介紹 Git 的核心命令和操作技巧。

創建目錄

在開始使用 Git 之前,我們需要先創建項目目錄:

sh
mkdir "目錄名稱"
cd "目錄名稱"

常用目錄操作命令:

bash
# 創建多級目錄
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 - 初始化倉庫

bash
# 在當前目錄初始化 Git 倉庫
git init

# 初始化並指定分支名稱(推薦)
git init -b main

# 初始化裸倉庫(用於服務器端)
git init --bare

注意事項:

  • 執行後會生成 .git 隱藏目錄,包含所有版本控制信息
  • 只需執行一次,重複執行不會覆蓋已有數據
  • 建议在項目根目錄執行

2. git status - 查看狀態

bash
# 查看簡要狀態
git status -s

# 查看詳細狀態
git status

# 查看忽略的文件
git status --ignored

輸出解讀:

  • Changes not staged for commit: 已修改但未添加到暫存區
  • Changes to be committed: 已添加到暫存區,準備提交
  • Untracked files: 未被 Git 追蹤的新文件

3. git add - 添加文件到暫存區

bash
# 添加單個文件
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 - 提交變更

bash
# 基本提交
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: 修復 bug
  • docs: 文檔變更
  • style: 代碼格式(不影響功能)
  • refactor: 重構
  • test: 測試相關
  • chore: 構建過程或輔助工具的變動

示例:

bash
git commit -m "feat(auth): 添加 OAuth2 登錄支持"
git commit -m "fix(api): 修復用戶數據查詢錯誤"
git commit -m "docs(readme): 更新安裝說明"

5. git clone - 克隆倉庫

bash
# 基本克隆
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 - 推送至遠程

bash
# 推送到默認遠程和分支
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 - 拉取遠程變更

bash
# 基本拉取(等於 fetch + merge)
git pull

# 拉取特定分支
git pull origin main

# 使用 rebase 代替 merge(保持線性歷史)
git pull --rebase

# 僅獲取不合併
git fetch

# 查看所有遠程分支
git fetch --all

pull vs fetch + merge:

bash
# 這兩種方式等效
git pull origin main

# 等價於
git fetch origin main
git merge origin/main

推薦使用 rebase:

bash
# 配置全局使用 rebase
git config --global pull.rebase true

# 或在拉取時指定
git pull --rebase origin main

8. git reset - 重置狀態

bash
# 軟重置:保留工作區和暫存區,只移動 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 - 刪除文件

bash
# 刪除文件並從版本庫中移除
git rm filename.txt

# 僅從版本庫移除,保留工作區文件
git rm --cached filename.txt

# 遞歸刪除目錄
git rm -r folder/

# 強制刪除(即使有修改)
git rm -f filename.txt

與普通刪除的區別:

bash
# 普通刪除(Git 會檢測到文件缺失)
rm filename.txt
git status  # 顯示 deleted: filename.txt

# Git 刪除(同時從工作區和版本庫移除)
git rm filename.txt
git status  # 顯示 Changes to be committed: deleted: filename.txt

添加遠程倉庫

遠程倉庫是代碼的集中存儲地,方便團隊協作和備份。

基本操作

bash
# 添加遠程倉庫
git remote add origin https://github.com/username/repository.git

# 提交到遠程倉庫(首次推送需設置上游分支)
git push -u origin master

# 或使用現代默認分支名
git push -u origin main

查看已配置的遠程倉庫

bash
# 查看遠程倉庫名稱
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)

管理遠程倉庫

bash
# 移除遠程倉庫(只移除本地記錄,不影響遠程)
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

多遠程倉庫工作流

bash
# 常見於開源項目貢獻
# 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 main

Git 分支操作

分支是 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

分支操作詳解

查看分支

bash
# 查看本地分支
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

創建和切換分支

bash
# 方法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: 文檔更新

合併分支

bash
# 切換到目標分支
git checkout main

# 合併 feature 分支
git merge feature/login

# 使用 squash 合併(將多次提交壓縮為一次)
git merge --squash feature/login
git commit -m "feat: 添加登錄功能"

# 中止合併(如果有衝突)
git merge --abort

# 繼續合併(解決衝突後)
git merge --continue

合併策略:

  1. Fast-forward(快進合併)

    • 當目標分支沒有新提交時
    • 只是簡單地移動指針
  2. Three-way merge(三方合併)

    • 當兩個分支都有新提交時
    • 創建一個新的合併提交
  3. Rebase(變基)

    bash
    # 將當前分支的提交「移動」到目標分支頂部
    git checkout feature/login
    git rebase main
    
    # 優點:保持線性歷史
    # 缺點:改寫歷史,不適用於共享分支

處理合併衝突

bash
# 當合併出現衝突時
git status
# 顯示:both modified: filename.txt

# 1. 打開文件,手動解決衝突
# 衝突標記:
# <<<<<<< HEAD
# 當前分支的內容
# =======
# 要合併分支的內容
# >>>>>>> feature/login

# 2. 編輯文件,保留需要的內容

# 3. 標記衝突已解決
git add filename.txt

# 4. 完成合併
git commit

刪除分支

bash
# 刪除本地分支(只能刪除已合併的)
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 工作流

bash
# 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/payment

GitHub Flow(更簡單)

bash
# 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 文件

bash
# 創建 .gitignore 文件
touch .gitignore

# 或使用 git 命令
git touch .gitignore  # 注意:這不是標準 Git 命令

.gitignore 語法規則

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 項目

gitignore
# 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
*.swo

Python 項目

gitignore
# 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.local

Java 項目

gitignore
# 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 不生效的解決方法

bash
# 問題:添加了規則但文件仍被追蹤

# 原因:文件之前已被 Git 追蹤

# 解決方案:
# 1. 從 Git 緩存中移除
git rm -r --cached .

# 2. 重新添加所有文件
git add .

# 3. 提交變更
git commit -m "chore: update .gitignore"

Git 標籤

標籤用於標記重要的歷史節點,通常用於發布版本。

標籤類型

  1. 輕量標籤(Lightweight):類似於不變的分支
  2. 附註標籤(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 標籤名刪除遠程標籤(簡化版)

標籤操作詳解

創建標籤

bash
# 創建輕量標籤(當前提交)
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"

查看標籤

bash
# 查看所有標籤
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

推送標籤

bash
# 推送單個標籤
git push origin v1.0

# 推送所有標籤
git push origin --tags

# ⚠️ 注意:git push 不會自動推送標籤,必須顯式指定

刪除標籤

bash
# 刪除本地標籤
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 {}

檢出標籤

bash
# 查看標籤對應的代碼(分離 HEAD 狀態)
git checkout v1.0

# 基於標籤創建新分支
git checkout -b hotfix-v1.0 v1.0

# 回到主分支
git checkout main

標籤最佳實踐

  1. 使用語義化版本號

    bash
    git 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"
  2. 始終使用附註標籤

    bash
    # ✅ 推薦
    git tag -a v1.0 -m "Release notes here"
    
    # ❌ 不推薦
    git tag v1.0
  3. 在穩定的提交上打標籤

    bash
    # 確保所有測試通過
    # 確保代碼已審查
    # 然後再打標籤
    git tag -a v2.0.0 -m "Production release"
  4. 標籤不可變

    • 標籤一旦創建就不應修改
    • 如果需要修正,刪除舊標籤並創建新標籤(需通知團隊)

實用技巧和快捷命令

Git 別名配置

bash
# 配置常用別名
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      # 漂亮的日誌輸出

查看歷史

bash
# 查看提交歷史
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

比較差異

bash
# 查看工作區和暫存區的差異
git diff

# 查看暫存區和最新提交的差異
git diff --staged

# 比較兩個分支
git diff main..develop

# 比較兩個提交
git diff abc1234 def5678

# 查看統計信息
git diff --stat

暫存工作進度

bash
# 暫存當前工作
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:提交錯了分支

bash
# 解決方案:使用 cherry-pick
git checkout correct-branch
git cherry-pick abc1234  # 錯誤提交的 hash

# 從原分支刪除錯誤提交
git checkout wrong-branch
git reset --hard HEAD~1

問題 2:想修改最後一次提交信息

bash
git commit --amend -m "新的提交信息"

問題 3:不小心刪除了重要分支

bash
# 查看 reflog 找到分支之前的提交
git reflog

# 基於該提交重新創建分支
git branch recovered-branch abc1234

問題 4:合併後發現錯誤

bash
# 如果還沒推送,可以回退
git reset --hard HEAD~1

# 如果已經推送,需要 revert
git revert -m 1 MERGE_COMMIT_HASH

總結

掌握 Git 常用命令是每個開發者的必修課。本文涵蓋了:

  1. 基礎操作:init、add、commit、status
  2. 遠程倉庫:clone、push、pull、remote
  3. 分支管理:branch、checkout、merge
  4. 標籤使用:tag 的創建和管理
  5. 文件忽略:.gitignore 配置
  6. 實用技巧:別名、日誌、差異比較

下一步學習建議:

記住:Git 是一個強大的工具,熟能生巧。多在實際項目中練習,你會越來越熟練!

最後更新於: