Git 常用命令速查
本文按实际开发流程整理常见 Git 命令。示例中的 <branch>、<commit>、<file> 等内容需要替换为真实的分支名、提交哈希或文件路径。
执行修改历史或删除文件的命令前,建议先运行 git status,必要时通过 git stash -u 临时保存当前修改。
Git 工作流程
flowchart LR
A[工作区] -->|git add| B[暂存区]
B -->|git commit| C[本地仓库]
C -->|git push| D[远程仓库]
D -->|git fetch / git pull| C
B -->|git restore --staged| A
C -->|git restore / git reset| A
| 区域 | 说明 | 常用命令 |
|---|---|---|
| 工作区 | 当前正在编辑的文件 | git diff、git restore |
| 暂存区 | 下一次提交准备包含的内容 | git add、git diff --staged |
| 本地仓库 | 已提交的版本历史 | git commit、git log |
| 远程仓库 | GitHub、GitLab 等远程副本 | git fetch、git pull、git push |
初始化与克隆仓库
初始化本地仓库
在当前目录初始化 Git 仓库
git init
初始化并指定默认分支为 main
git init -b main
克隆远程仓库
git clone https://github.com/<owner>/<repo>.git
git clone git@github.com:<owner>/<repo>.git
克隆到指定目录
git clone <repository-url> <directory>
只克隆最近一次提交,适合只需要最新代码的场景
git clone --depth 1 <repository-url>
配置 Git
设置全局用户名
git config --global user.name "Your Name"
设置全局邮箱
git config --global user.email "you@example.com"
将新仓库的默认分支设置为 main
git config --global init.defaultBranch main
查看所有配置及其来源
git config --list --show-origin
查看当前仓库生效的用户名和邮箱
git config user.name
git config user.email
去掉 --global 后,配置只对当前仓库生效。仓库级配置会覆盖全局配置。
查看仓库状态
查看工作区和暂存区状态
git status
使用精简格式显示状态和当前分支
git status -sb
暂存文件
暂存指定文件
git add <file>
暂存指定目录
git add <directory>
暂存当前目录下所有新增、修改和删除
git add .
交互式选择要暂存的代码块
git add -p
从暂存区移除文件,但保留工作区修改
git restore --staged <file>
删除文件,并将删除操作加入暂存区
git rm <file>
停止跟踪文件,但保留本地文件
git rm --cached <file>
移动或重命名文件
git mv <old-path> <new-path>
创建提交
打开编辑器填写提交说明
git commit
直接填写提交说明
git commit -m "docs: update Git command guide"
暂存所有已跟踪文件的修改并提交
# 不包含尚未被 Git 跟踪的新文件
git commit -am "fix: update tracked files"
修改最近一次提交,并重新编辑提交说明
git commit --amend
将新暂存的内容补入最近一次提交,保留原提交说明
git commit --amend --no-edit
git commit --amend 会创建新的提交哈希。已经推送并被他人使用的提交,不建议随意修改。
操作分支
查看分支
查看本地分支
git branch
查看本地和远程分支
git branch -a
查看分支及其上游跟踪关系
git branch -vv
显示当前分支名称
git branch --show-current
创建和切换分支
从当前提交创建新分支,但不切换
git branch <branch>
从指定提交、分支或标签创建新分支
git branch <branch> <start-point>
切换到已有分支
git switch <branch>
创建新分支并立即切换
git switch -c <new-branch>
从指定起点创建新分支并立即切换
git switch -c <new-branch> <start-point>
切换回上一个分支
git switch -
重命名和删除分支
重命名当前分支
git branch -m <new-name>
重命名指定分支
git branch -m <old-name> <new-name>
删除已经合并的本地分支
git branch -d <branch>
强制删除本地分支,不检查是否已经合并
git branch -D <branch>
删除远程分支
git push <remote> --delete <branch>
管理远程仓库
查看远程仓库名称和地址
git remote -v
添加远程仓库
git remote add origin <repository-url>
为 Fork 项目添加上游仓库
git remote add upstream <upstream-url>
修改远程仓库地址
git remote set-url origin <new-url>
重命名远程仓库
git remote rename <old-name> <new-name>
删除远程仓库配置
git remote remove <remote>
查看远程仓库详细信息
git remote show origin
获取、拉取与推送
获取远程仓库的新提交和引用,但不修改当前分支
git fetch origin
获取所有远程仓库,并清理已经删除的远程分支引用
git fetch --all --prune
拉取当前分支对应的远程分支并合并
git pull
只允许快进合并,避免自动产生合并提交
git pull --ff-only
拉取后使用 rebase 整理本地提交
git pull --rebase
第一次推送分支,并建立上游跟踪关系
git push -u origin <branch>
推送当前分支
git push
推送所有本地标签
git push origin --tags
普通协作中不要直接使用 git push --force。确需改写远程历史时,优先使用 git push --force-with-lease,它会在远程分支出现意外更新时拒绝覆盖。
合并分支
将指定分支合并到当前分支
git merge <branch>
即使可以快进,也创建一个合并提交
git merge --no-ff <branch>
发生冲突后,查看冲突文件
git status
解决冲突并暂存文件后,继续完成合并
git add <resolved-file>
git commit
放弃当前合并,恢复到合并前状态
git merge --abort
变基分支
将当前分支的提交重新应用到目标分支之后
git rebase <base-branch>
交互式整理最近 3 个提交
git rebase -i HEAD~3
解决冲突并暂存后继续变基
git add <resolved-file>
git rebase --continue
跳过当前无法应用的提交
git rebase --skip
放弃变基并恢复原状态
git rebase --abort
Rebase 会重写提交历史。不要对已经公开并被其他人基于其开发的共享分支执行 rebase。
挑选提交
将另一个分支中的指定提交应用到当前分支
git cherry-pick <commit>
解决冲突后继续 cherry-pick
git add <resolved-file>
git cherry-pick --continue
放弃本次 cherry-pick
git cherry-pick --abort
撤销工作区和暂存区修改
丢弃指定文件尚未暂存的修改
git restore <file>
将文件恢复到指定提交中的版本
git restore --source=<commit> <file>
取消暂存,但保留工作区修改
git restore --staged <file>
同时将暂存区和工作区恢复到 HEAD
# 会丢弃所有未提交修改
git restore --staged --worktree :/
撤销提交
创建反向提交
创建一个新提交,撤销最近一次提交的改动
git revert HEAD
创建一个新提交,撤销指定提交的改动
git revert <commit>
git revert 不会删除原提交,适合已经推送到共享仓库的历史。
移动当前分支指针
撤销最近一次提交,保留修改并保持暂存状态
git reset --soft HEAD~1
撤销最近一次提交,保留工作区修改但取消暂存
git reset HEAD~1
将当前分支、暂存区和工作区全部恢复到指定提交
git reset --hard <commit>
危险操作:`reset --hard` 与 `clean`
使用 reflog 恢复误操作
查看 HEAD 和分支指针在本地的移动记录
git reflog
从误操作前的提交创建恢复分支,安全性更高
git switch -c recovery/<name> <commit>
确认提交无误后,也可以直接将当前分支恢复过去
git reset --hard <commit>
reflog 是本地记录,不会随 push 上传,也不能直接恢复其他电脑上的操作记录。
临时储藏修改
储藏已跟踪文件的修改
git stash push -m "WIP: description"
同时储藏未跟踪文件
git stash push -u -m "WIP: description"
查看储藏列表
git stash list
查看最近一次储藏的详细差异
git stash show -p
应用最近一次储藏,并从列表中删除
git stash pop
应用指定储藏,但保留在列表中
git stash apply stash@{0}
删除指定储藏
git stash drop stash@{0}
清空全部储藏
git stash clear
查看提交历史
查看完整提交历史
git log
使用单行、分支图和引用装饰显示全部历史
git log --oneline --graph --decorate --all
查看最近 10 条提交
git log -10 --oneline
查看指定作者的提交
git log --author="<name>"
查看指定时间之后的提交
git log --since="2026-01-01"
查看文件历史,并跟踪重命名
git log --follow -- <file>
查看指定提交的内容和差异
git show <commit>
查看某行代码最后由哪个提交修改
git blame -L <start>,<end> <file>
使用二分查找定位问题
git bisect 通过不断测试历史中点,帮助定位首次引入问题的提交。
开始二分查找
git bisect start
将当前提交标记为有问题
git bisect bad
将一个已知正常的历史提交标记为正常
git bisect good <good-commit>
Git 会自动切换到中间提交。测试后继续标记:
当前提交正常
git bisect good
当前提交有问题
git bisect bad
当前提交无法测试,跳过
git bisect skip
查看当前二分查找过程
git bisect log
使用 gitk 可视化当前范围,需要本机安装 gitk
git bisect visualize
结束二分查找并返回开始前的分支
git bisect reset
使用测试脚本自动执行二分查找
# 脚本退出码为 0 表示正常,1~127(除 125)表示有问题,125 表示跳过
git bisect run <test-command>
管理标签
查看所有标签
git tag
创建附注标签
git tag -a v1.0.0 -m "Release v1.0.0"
为指定提交创建标签
git tag -a v1.0.0 <commit> -m "Release v1.0.0"
查看标签信息
git show v1.0.0
推送指定标签
git push origin v1.0.0
删除本地标签
git tag -d v1.0.0
删除远程标签
git push origin --delete v1.0.0
同步 Fork 的上游仓库
首次配置
# origin 指向自己的 Fork,upstream 指向原仓库
git remote add upstream <upstream-url>
git remote -v
日常同步
git fetch upstream --prune
git switch main
git merge --ff-only upstream/main
git push origin main
如果本地 main 上存在自己的提交,无法快进合并,可以在确认提交尚未共享后使用:
git fetch upstream --prune
git switch main
git rebase upstream/main
git push --force-with-lease origin main
第二种方式会改写自己 Fork 中 main 分支的历史。多人共同使用该分支时,应优先选择合并而不是 rebase。
移除被 .gitignore 忽略的文件
1.移除当前目录下所有文件的 Git 追踪状态(不删除本地文件)
git rm -r --cached .
2.重新将所有文件添加到暂存区(此时 Git 会严格按照当前的 .gitignore 规则进行过滤)
git add .
3.提交新的干净状态
git commit -m "chore: 重新应用 .gitignore 规则并清理缓存"
喜欢的话,留下你的评论吧~