Git 基本操作
2026/3/20大约 19 分钟
Git 基本操作
掌握日常开发中最常用的 Git 命令
创建仓库
初始化本地仓库
# 在当前目录创建 Git 仓库
git init
# 在指定目录创建
git init my-project
# 创建裸仓库(无工作目录,用于服务器)
git init --bare my-project.git
# 指定默认分支名
git init --initial-branch=main
git init -b main
初始化后的目录结构:
my-project/
└── .git/
├── HEAD
├── config
├── description
├── hooks/
├── info/
├── objects/
└── refs/
克隆远程仓库
# 克隆仓库
git clone https://github.com/user/repo.git
# 克隆到指定目录
git clone https://github.com/user/repo.git my-folder
# 使用 SSH 克隆
git clone git@github.com:user/repo.git
# 浅克隆(只获取最近的历史)
git clone --depth 1 https://github.com/user/repo.git
# 克隆指定分支
git clone -b develop https://github.com/user/repo.git
# 克隆并初始化子模块
git clone --recurse-submodules https://github.com/user/repo.git
# 静默克隆(减少输出)
git clone -q https://github.com/user/repo.git
查看状态与历史
git status - 查看工作区状态
# 完整状态
git status
# 简洁输出
git status -s
git status --short
# 输出示例:
# M modified-staged.txt # 已暂存的修改
# M modified-unstaged.txt # 未暂存的修改
# MM both-modified.txt # 暂存后又修改
# A new-file.txt # 新添加到暂存区
# ?? untracked-file.txt # 未跟踪的文件
# D deleted-file.txt # 已删除
# 显示分支信息
git status -sb
# 显示忽略的文件
git status --ignored
状态标记说明
git log - 查看提交历史
# 基本用法
git log
# 简洁格式
git log --oneline
# 显示图形
git log --graph
# 常用组合
git log --oneline --graph --decorate
# 显示所有分支
git log --oneline --graph --all
# 限制显示数量
git log -n 5
git log -5
# 显示差异
git log -p
git log --patch
# 显示统计信息
git log --stat
# 显示简略统计
git log --shortstat
# 自定义格式
git log --pretty=format:"%h - %an, %ar : %s"
# 按时间筛选
git log --since="2024-01-01"
git log --until="2024-12-31"
git log --after="2 weeks ago"
git log --before="yesterday"
# 按作者筛选
git log --author="John"
git log --author="john@example.com"
# 按提交信息筛选
git log --grep="fix"
git log --grep="bug" --grep="fix" --all-match
# 按文件筛选
git log -- path/to/file.txt
git log --follow path/to/file.txt # 跟踪重命名
# 按修改内容筛选
git log -S "function_name" # 添加或删除了该字符串
git log -G "regex_pattern" # 正则匹配
# 显示合并提交
git log --merges
# 不显示合并提交
git log --no-merges
# 显示第一个父提交(只看主线)
git log --first-parent
格式化占位符
git diff - 查看差异
# 工作区与暂存区的差异
git diff
# 暂存区与最后一次提交的差异
git diff --cached
git diff --staged
# 工作区与最后一次提交的差异
git diff HEAD
# 两个提交之间的差异
git diff commit1 commit2
git diff HEAD~3 HEAD
# 两个分支之间的差异
git diff main develop
# 只看某个文件的差异
git diff -- path/to/file.txt
# 只显示文件名
git diff --name-only
git diff --name-status
# 显示统计信息
git diff --stat
# 单词级别差异
git diff --word-diff
# 忽略空白变化
git diff -w
git diff --ignore-all-space
# 显示两个分支的共同祖先到目标分支的差异
git diff main...feature # 三个点
# 生成补丁文件
git diff > changes.patch
git show - 查看对象信息
# 查看提交详情
git show
git show HEAD
git show abc1234
# 查看某个提交中的某个文件
git show HEAD:path/to/file.txt
git show abc1234:src/main.js
# 查看标签信息
git show v1.0.0
# 只显示统计
git show --stat
# 只显示文件名
git show --name-only
git blame - 查看文件每行的修改历史
# 查看文件每行的最后修改
git blame file.txt
# 指定行范围
git blame -L 10,20 file.txt
git blame -L 10,+5 file.txt # 从第10行开始5行
# 显示邮箱
git blame -e file.txt
# 忽略空白变化
git blame -w file.txt
# 检测移动的行
git blame -M file.txt
# 检测跨文件移动的行
git blame -C file.txt
# 简短输出
git blame -s file.txt
文件操作
git add - 暂存文件
# 添加单个文件
git add file.txt
# 添加多个文件
git add file1.txt file2.txt
# 添加目录
git add src/
# 添加所有修改和新文件
git add .
git add --all
git add -A
# 只添加已跟踪文件的修改
git add -u
git add --update
# 交互式添加
git add -i
git add --interactive
# 分块添加(逐块选择)
git add -p
git add --patch
# 添加被忽略的文件(强制)
git add -f ignored-file.txt
git add --force ignored-file.txt
# 只添加文件内容变化,不添加新文件
git add --no-all .
# 模拟添加(不实际执行)
git add -n file.txt
git add --dry-run file.txt
分块添加详解
git add -p 会逐块显示修改,并询问操作:
git rm - 删除文件
# 删除文件(同时从工作区和暂存区删除)
git rm file.txt
# 只从暂存区删除(保留工作区文件)
git rm --cached file.txt
# 删除目录
git rm -r directory/
# 强制删除(即使有修改)
git rm -f file.txt
# 模拟删除
git rm -n file.txt
git rm --dry-run file.txt
# 删除所有 .log 文件
git rm \*.log
git rm "*.log"
git mv - 移动/重命名文件
# 重命名文件
git mv old-name.txt new-name.txt
# 移动文件
git mv file.txt directory/
# 移动并重命名
git mv old-dir/old-name.txt new-dir/new-name.txt
# 强制覆盖
git mv -f source.txt destination.txt
注意:
git mv等价于mv+git rm+git add
git restore - 恢复文件(Git 2.23+)
# 撤销工作区的修改
git restore file.txt
git restore .
# 取消暂存(相当于 git reset HEAD)
git restore --staged file.txt
git restore -S file.txt
# 同时撤销暂存和工作区修改
git restore --staged --worktree file.txt
git restore -SW file.txt
# 从特定提交恢复
git restore --source=HEAD~1 file.txt
git restore -s abc1234 file.txt
# 交互式恢复
git restore -p file.txt
提交操作
git commit - 创建提交
# 基本提交
git commit
# 带消息提交
git commit -m "Commit message"
# 多行消息
git commit -m "Title" -m "Description"
# 添加并提交(只对已跟踪文件)
git commit -a -m "Message"
git commit -am "Message"
# 修改最后一次提交
git commit --amend
git commit --amend -m "New message"
git commit --amend --no-edit # 不修改消息
# 空提交(不含文件变化)
git commit --allow-empty -m "Empty commit"
# 指定作者
git commit --author="Name <email@example.com>" -m "Message"
# 指定日期
git commit --date="2024-01-01 12:00:00" -m "Message"
# 签名提交
git commit -S -m "Signed commit"
# 详细模式(显示差异)
git commit -v
提交信息规范
撤销操作
git reset - 重置
# 取消暂存(保留修改)
git reset HEAD file.txt
git reset file.txt
# 软重置:移动 HEAD,保留暂存区和工作区
git reset --soft HEAD~1
# 混合重置(默认):移动 HEAD,重置暂存区,保留工作区
git reset --mixed HEAD~1
git reset HEAD~1
# 硬重置:移动 HEAD,重置暂存区和工作区
git reset --hard HEAD~1
# 重置到特定提交
git reset abc1234
git reset --hard abc1234
# 保留指定文件
git reset HEAD~1 -- file.txt
重置模式对比
git revert - 撤销提交
# 撤销最近一次提交
git revert HEAD
# 撤销指定提交
git revert abc1234
# 撤销多个提交
git revert HEAD~3..HEAD # 撤销最近3个提交
git revert abc1234 def5678
# 不自动提交(只修改工作区)
git revert -n abc1234
git revert --no-commit abc1234
# 撤销合并提交(指定保留的父提交)
git revert -m 1 merge-commit-hash
# 编辑撤销提交的消息
git revert -e abc1234
reset vs revert
git checkout - 检出(旧语法)
# 撤销工作区修改(旧语法,推荐用 git restore)
git checkout -- file.txt
git checkout -- .
# 从特定提交检出文件
git checkout abc1234 -- file.txt
# 创建并切换分支(旧语法,推荐用 git switch -c)
git checkout -b new-branch
储藏操作
git stash - 临时保存修改
# 储藏当前修改
git stash
git stash push
# 带消息储藏
git stash push -m "Work in progress"
git stash save "Work in progress" # 旧语法
# 包含未跟踪文件
git stash -u
git stash --include-untracked
# 包含忽略的文件
git stash -a
git stash --all
# 只储藏暂存区的内容
git stash --staged
# 保留暂存状态
git stash --keep-index
# 交互式储藏
git stash -p
git stash --patch
# 储藏指定文件
git stash push path/to/file.txt
git stash push -m "Message" -- file1.txt file2.txt
管理储藏
# 查看储藏列表
git stash list
# 查看储藏内容
git stash show
git stash show -p # 详细差异
git stash show stash@{0} # 指定储藏
# 应用储藏(保留储藏)
git stash apply
git stash apply stash@{1} # 应用指定储藏
# 应用储藏(删除储藏)
git stash pop
git stash pop stash@{1}
# 删除储藏
git stash drop
git stash drop stash@{1}
# 清空所有储藏
git stash clear
# 从储藏创建分支
git stash branch new-branch
git stash branch new-branch stash@{1}
储藏使用场景
标签操作
创建标签
# 创建轻量标签
git tag v1.0.0
# 创建附注标签(推荐)
git tag -a v1.0.0 -m "Release version 1.0.0"
# 给历史提交打标签
git tag -a v0.9.0 abc1234 -m "Previous release"
# 创建签名标签
git tag -s v1.0.0 -m "Signed release"
# 替换已有标签
git tag -f v1.0.0
管理标签
# 列出标签
git tag
git tag -l
git tag --list
# 按模式筛选
git tag -l "v1.*"
git tag -l "*-rc*"
# 查看标签信息
git show v1.0.0
# 删除本地标签
git tag -d v1.0.0
# 删除远程标签
git push origin :refs/tags/v1.0.0
git push origin --delete v1.0.0
# 推送标签到远程
git push origin v1.0.0
git push origin --tags # 推送所有标签
git push --follow-tags # 推送代码时一起推送标签
# 检出标签
git checkout v1.0.0 # 进入分离 HEAD 状态
git checkout -b release-1.0 v1.0.0 # 基于标签创建分支
git switch -c release-1.0 v1.0.0 # 新语法
轻量标签 vs 附注标签
清理操作
git clean - 清理未跟踪文件
# 查看将被删除的文件(预览)
git clean -n
git clean --dry-run
# 删除未跟踪文件
git clean -f
# 删除未跟踪文件和目录
git clean -fd
# 删除忽略的文件
git clean -fX
# 删除所有未跟踪文件(包括忽略的)
git clean -fx
# 交互式清理
git clean -i
# 指定目录
git clean -fd path/to/dir/
git gc - 垃圾回收
# 运行垃圾回收
git gc
# 积极回收(更彻底)
git gc --aggressive
# 自动垃圾回收(检查是否需要)
git gc --auto
# 修剪不可达对象
git prune
# 查看对象统计
git count-objects -v
忽略文件
.gitignore 文件
# 忽略所有 .log 文件
*.log
# 忽略所有 node_modules 目录
node_modules/
# 忽略根目录下的 build
/build
# 忽略 doc 目录下的所有 .pdf 文件
doc/**/*.pdf
# 但跟踪 doc/important.pdf
!doc/important.pdf
# 忽略所有 .env 文件
.env
.env.*
# 忽略特定目录中的所有文件
logs/*
# 但保留目录本身
!logs/.gitkeep
# 忽略以 ~ 结尾的文件
*~
# 忽略 # 开头的文件
\#*
.gitignore 模式规则
其他忽略方式
# 全局忽略(对所有仓库生效)
git config --global core.excludesFile ~/.gitignore_global
# 仓库私有忽略(不共享给他人)
# 编辑 .git/info/exclude
# 临时忽略已跟踪文件的修改
git update-index --assume-unchanged file.txt
# 取消临时忽略
git update-index --no-assume-unchanged file.txt
# 查看被临时忽略的文件
git ls-files -v | grep '^h'
# 更强的忽略(即使 pull 也不更新)
git update-index --skip-worktree file.txt
# 取消
git update-index --no-skip-worktree file.txt
搜索
git grep - 搜索文件内容
# 搜索当前目录
git grep "pattern"
# 搜索特定文件类型
git grep "pattern" -- "*.js"
# 显示行号
git grep -n "pattern"
# 只显示文件名
git grep -l "pattern"
# 显示匹配数量
git grep -c "pattern"
# 忽略大小写
git grep -i "pattern"
# 使用正则表达式
git grep -E "pattern.*here"
# 显示上下文
git grep -A 3 "pattern" # 后3行
git grep -B 3 "pattern" # 前3行
git grep -C 3 "pattern" # 前后各3行
# 在指定提交中搜索
git grep "pattern" HEAD~5
# 在所有分支中搜索
git grep "pattern" $(git rev-list --all)
# 搜索函数定义
git grep -p "functionName"
git log -S/-G - 搜索提交历史
# 搜索添加或删除了特定字符串的提交
git log -S "function_name"
# 搜索匹配正则表达式的修改
git log -G "function\s+name"
# 显示详细差异
git log -S "pattern" -p
# 限制文件范围
git log -S "pattern" -- "*.py"
实用技巧
快速操作
# 查看特定文件的提交历史
git log --follow -p file.txt
# 查看两个分支的差异文件列表
git diff main..feature --name-only
# 快速查看某次提交修改了哪些文件
git show --name-only abc1234
# 统计代码行数变化
git diff --stat HEAD~10..HEAD
# 查找最后修改某行代码的提交
git log -p -S "code snippet" -- file.txt
# 查看文件在不同分支的版本
git show main:path/to/file.txt
git show feature:path/to/file.txt
# 恢复删除的文件
git checkout HEAD~1 -- path/to/deleted-file.txt
别名推荐
# 添加到 ~/.gitconfig
[alias]
# 日常操作
s = status -sb
a = add
aa = add --all
c = commit
cm = commit -m
co = checkout
sw = switch
br = branch
# 日志
l = log --oneline -20
lg = log --oneline --graph --all
hist = log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short
# 差异
d = diff
dc = diff --cached
ds = diff --stat
# 撤销
undo = reset HEAD~1 --mixed
unstage = reset HEAD --
# 储藏
ss = stash push
sp = stash pop
sl = stash list