Git 常用命令完整手册
摘要:本文是一份全面的 Git 命令速查手册,旨在帮助开发者快速掌握日常开发、团队协作与版本控制中的核心操作。内容涵盖从基础操作(初始化、提交、状态查看)、分支管理(创建、切换、合并)、远程协作(推送、拉取、克隆)到高级技巧(撤销修改、临时暂存、配置优化)的全流程指南。特别提供了**“救命技巧”**章节,详细讲解如何恢复误删分支、安全强制推送、修改历史提交等危急场景下的解决方案。无论你是 Git 新手还是希望深化理解的进阶用户,这份手册都能作为随时查阅的实用参考。
一、基础操作(日常必备)
| 命令 | 说明 |
|---|---|
git init | 在当前目录初始化一个新的 Git 仓库 |
git clone <url> | 克隆远程仓库到本地 |
git status | 查看当前工作区和暂存区的状态(最常用) |
git add <file> | 将文件添加到暂存区(git add .添加所有变更) |
git commit -m "message" | 提交暂存区内容到本地仓库 |
git commit -am "message" | 跳过add,直接提交所有已跟踪文件的修改(不包含新文件) |
git log | 查看提交历史(--oneline精简显示,--graph图形化) |
git diff | 查看工作区与暂存区的差异 |
git diff --staged | 查看暂存区与上一次提交的差异 |
二、分支管理
| 命令 | 说明 |
|---|---|
git branch | 列出本地分支(-r远程分支,-a所有分支) |
git branch <name> | 创建新分支 |
git checkout <name> | 切换到指定分支 |
git switch <name> | Git 2.23+ 推荐的新切换命令 |
git checkout -b <name> | 创建并切换到新分支 |
git switch -c <name> | 同上(新版写法) |
git merge <branch> | 将指定分支合并到当前分支 |
git rebase <branch> | 将当前分支变基到指定分支(保持线性历史) |
git branch -d <name> | 删除分支(-D强制删除未合并分支) |
git branch -m <old> <new> | 重命名分支 |
三、远程协作
| 命令 | 说明 |
|---|---|
git remote -v | 查看远程仓库地址 |
git remote add origin <url> | 添加远程仓库 |
git push origin <branch> | 推送本地分支到远程 |
git push -u origin <branch> | 首次推送并建立追踪关系 |
git pull | 拉取远程并合并(等同于fetch + merge) |
git fetch | 只拉取远程更新,不自动合并 |
git clone --depth 1 | 浅克隆(只拉取最新提交,节省时间) |
四、撤销与修复(工作区 / 暂存区 / 本地提交)
| 命令 | 说明 |
|---|---|
git reset HEAD <file> | 撤销git add(文件从暂存区移除,工作区不变) |
git reset --soft HEAD~1 | 撤销上一次提交,保留修改在暂存区 |
git reset --mixed HEAD~1 | 撤销提交并取消暂存(默认行为) |
git reset --hard HEAD~1 | 彻底回退到上一个提交,丢弃所有修改(危险) |
git revert HEAD | 用新提交反向撤销上一次提交(安全,适合已推送) |
git checkout -- <file> | 丢弃工作区的修改(不可恢复) |
git restore <file> | Git 2.23+ 替代checkout --的推荐命令 |
git restore --staged <file> | 撤销add(替代reset HEAD) |
五、临时暂存(git stash)—— 详细用法
当您正在工作区修改代码,但需要紧急切换分支、拉取更新或解决冲突时,stash可以临时保存当前进度,让工作区恢复干净。
5.1 基本暂存与恢复
| 命令 | 说明 |
|---|---|
git stash | 暂存当前所有未提交的修改(包括工作区和暂存区),工作区恢复到上一次提交的状态 |
git stash save "描述信息" | 同上,并添加注释,方便在列表中识别 |
git stash list | 查看所有暂存记录,显示stash@{0}、stash@{1}…(最近的在前) |
git stash pop | 恢复最近一次暂存(stash@{0})并删除该条记录 |
git stash pop stash@{1} | 恢复指定暂存并删除该条记录 |
git stash apply | 恢复最近一次暂存,但保留该条记录(不删除) |
git stash apply stash@{1} | 恢复指定暂存,保留记录 |
5.2 查看与删除暂存
| 命令 | 说明 |
|---|---|
git stash show | 查看最近一次暂存中修改的文件摘要 |
git stash show -p stash@{0} | 查看指定暂存的详细差异(补丁格式) |
git stash drop stash@{1} | 删除指定的暂存记录(不恢复) |
git stash clear | 清空所有暂存记录(危险,不可恢复) |
5.3 高级用法:暂存冲突时新建分支
| 命令 | 说明 |
|---|---|
git stash branch <新分支名> | 将暂存的内容新建一个分支,并自动恢复修改(常用于暂存与当前分支有冲突时) |
5.4 典型使用场景
# 场景1:正在开发功能,突然要修紧急 buggitstash save"WIP: login feature"# 保存当前进度gitcheckout maingitpullgitcheckout-bhotfix/bug-123# 修复并提交...gitcheckout feature/logingitstash pop# 恢复之前的修改,继续开发# 场景2:不小心 stash 了太多,想查看某个旧暂存的内容gitstash listgitstash show-pstash@{2}# 场景3:暂存后忘记恢复,后来想丢弃某个旧暂存gitstash drop stash@{1}六、查看与调试(日志、对比、责任追溯)
| 命令 | 说明 |
|---|---|
git log --oneline --graph | 查看提交树(简洁图形化) |
git reflog | 查看所有 HEAD 变更历史(包括被重置、删除的 commit,用于恢复) |
git show <commit> | 查看某次提交的详细信息 |
git blame <file> | 查看文件每一行是谁修改的 |
git diff <commit1> <commit2> | 比较两次提交的差异 |
七、配置与初始化(从零搭建 + 个性化设置)
7.1 仓库初始化
| 命令 | 说明 |
|---|---|
git init | 在当前目录初始化空仓库 |
git init <项目名> | 创建指定文件夹并初始化仓库 |
git init --bare | 创建裸仓库(用于远程中心服务器,没有工作区) |
git clone <url> | 克隆远程仓库(含完整历史) |
git clone --depth 1 <url> | 浅克隆(只拉最近一次提交,节省时间和空间) |
git clone --branch <分支名> <url> | 克隆后直接切换到指定分支 |
7.2 配置三级作用域(优先级:local > global > system)
| 级别 | 命令参数 | 存储位置 | 作用范围 |
|---|---|---|---|
| 仓库级(最高) | --local(默认) | .git/config | 仅当前项目 |
| 用户级(推荐) | --global | ~/.gitconfig | 当前操作系统用户 |
| 系统级(最低) | --system | /etc/gitconfig | 整台机器所有用户 |
7.3 新电脑必配项
gitconfig--globaluser.name"你的姓名"gitconfig--globaluser.email"你的邮箱@example.com"gitconfig--globalcore.editor"vim"# 或 "code --wait" 使用 VSCodegitconfig--globalinit.defaultBranch main# 默认分支名改为 main7.4 跨平台换行符处理(防乱码)
# Windows 用户(拉取转 CRLF,提交转 LF)gitconfig--globalcore.autocrlftrue# Mac/Linux 用户(拉取转 LF,提交转 LF)gitconfig--globalcore.autocrlf input7.5 常用进阶配置
| 配置命令 | 作用 |
|---|---|
git config --global color.ui auto | 开启彩色输出(更易读) |
git config --global core.quotepath false | 正确显示中文文件名 |
git config --global push.default simple | 只推送当前分支(Git 2.0+ 默认) |
git config --global merge.tool vimdiff | 设置合并冲突的可视化对比工具 |
git config --global credential.helper cache | 缓存密码 15 分钟(安全) |
git config --global credential.helper store | 永久记住密码(明文存储,慎用) |
git config --global http.proxy http://127.0.0.1:7890 | 设置 HTTP 代理(需翻墙时) |
git config --global --unset http.proxy | 取消代理 |
7.6 SSH 密钥配置(免密连接 GitHub/GitLab)
# 生成密钥(推荐 ed25519)ssh-keygen-ted25519-C"你的邮箱@example.com"# 查看公钥并复制到 GitHub/GitLab → Settings → SSH Keyscat~/.ssh/id_ed25519.pub# 测试连接ssh-Tgit@github.com# 看到成功信息即可7.7 忽略文件(.gitignore)
| 操作 | 说明 |
|---|---|
项目根目录创建.gitignore | 忽略特定文件(如node_modules/、*.log) |
git config --global core.excludesfile ~/.gitignore_global | 设置全局忽略文件(如.DS_Store) |
git check-ignore -v <文件> | 查看该文件被哪条忽略规则匹配 |
7.8 查看所有配置
| 命令 | 说明 |
|---|---|
git config --list | 查看当前仓库生效的所有配置(合并三级) |
git config --list --global | 查看用户级配置 |
git config --show-origin <key> | 查看某个配置项来自哪个文件 |
八、救命技巧(真正的急救措施)—— 详细说明
本章只列出那些在危机关头(误删、误操作、历史混乱)能救命的高级操作,每个都附带场景和详细示例。
8.1 恢复误删的分支或丢失的提交 ——git reflog
场景:你不小心用git branch -D删除了一个还没合并的分支,或者执行了git reset --hard丢掉了某些提交。
原理:Git 会在本地记录所有 HEAD 的变动历史(包括切换、重置、合并等),通过reflog可以找到被删除的 commit 哈希值,然后重新创建分支。
操作:
# 1. 查看所有 HEAD 变动记录gitreflog# 输出类似:# abc1234 HEAD@{0}: reset: moving to HEAD~2# def5678 HEAD@{1}: commit: 重要的功能# ...# 2. 找到你想要恢复的那个 commit 的哈希(比如 def5678)# 3. 基于该哈希创建新分支(或直接 checkout)gitcheckout-brecovered-branch def5678# 现在你的分支就回来了,所有提交都完好无损。注意:
reflog只存在于本地,且有时效性(默认 90 天),若已执行git gc或仓库被清理,可能无法恢复。
8.2 安全地强制推送 ——git push --force-with-lease
场景:你修改了历史(如rebase、amend、reset),需要强制推送到远程,但又担心覆盖了同事刚刚推送的新提交。
区别:
git push -f(或--force)会直接覆盖远程分支,不管远程有没有新提交,危险。git push --force-with-lease会检查远程分支是否和你本地记录的远程引用一致(即你上次 fetch/pull 之后,远程有没有被别人更新)。如果有新提交,则推送失败,提醒你先 pull 合并。
操作:
gitpush --force-with-lease origin my-branch如果远程有新的提交,会报错并提示,此时你应该先git fetch然后合并或变基,再重新推送。这个命令是强制推送的安全替代品。
8.3 修改历史提交(合并、重排序、修改消息)——git rebase -i
场景:你提交了多个 commit,但想将它们合并成一个(squash),或者调整顺序,或者修改某个旧 commit 的消息。
操作:
# 对最近的 3 个提交进行交互式变基gitrebase-iHEAD~3编辑器会打开一个文件,列出最近 3 个 commit,每行前面有命令(pick)。你可以修改命令:
pick→ 保持该提交reword→ 修改提交消息edit→ 修改提交内容squash→ 合并到前一个提交drop→ 删除该提交
示例:将最近 3 个 commit 合并为 1 个:
pick a1b2c3 第一次提交 squash d4e5f6 第二次提交 squash g7h8i9 第三次提交保存后,Git 会合并并让你编辑最终提交消息。
警告:不要对已经推送到远程的分支执行此操作,除非你准备强制推送,且团队中只有你一人使用该分支。
8.4 只拿某一次提交 ——git cherry-pick
场景:你只需要从另一个分支中提取某个特定的 commit,而不是整个分支合并。
操作:
gitcherry-pick<commit-hash>Git 会将该提交的更改应用到当前分支,生成一个新的 commit(哈希值不同,但内容相同)。如果发生冲突,解决后执行git cherry-pick --continue。
示例:修复了一个通用 bug 的 commit 在dev分支,但main分支也需要这个修复,就可以用cherry-pick单独拿过来。
8.5 修改最近一次提交 ——git commit --amend
场景:你刚提交完,发现漏了一个文件,或者提交消息写错了,想在不新增 commit 的情况下修正。
操作:
- 修改消息:
git commit --amend -m "新的消息" - 补充文件:先
git add漏掉的文件,然后git commit --amend --no-edit(不改消息只补充内容)
注意:如果已经 push,修改后需要
git push --force-with-lease(参考 8.2)。
8.6 停止追踪某个文件但保留在本地 ——git rm --cached
场景:你误把本地配置文件(如.env)提交了,现在想在远程删除它,但本地还要保留。
操作:
gitrm--cached.envecho".env">>.gitignore# 加入忽略列表gitadd.gitignoregitcommit-m"停止追踪 .env"gitpush这样远程仓库中该文件被删除,但本地文件依然存在,且以后不再被追踪。
8.7 合并冲突后,放弃所有修改回到干净状态
场景:合并或变基时产生大量冲突,你想放弃这次操作,回到操作前的干净状态。
# 如果在 merge 中gitmerge--abort# 如果在 rebase 中gitrebase--abort# 如果在 cherry-pick 中gitcherry-pick--abort以上救命技巧都是日常开发中保护代码安全、修复误操作的利器,熟记它们能让你在紧急情况下从容应对。如果需要更深入的解释(比如交互式变基的具体使用案例),可以随时问我。
附录:常用工作流示例(供参考)
# 开始新功能gitcheckout-bfeature/new-login# 修改代码...gitadd.gitcommit-m"add login feature"gitpush-uorigin feature/new-login# 同步主分支最新代码gitcheckout maingitpullgitcheckout feature/new-logingitrebase main# 或 git merge main# 合并到主分支gitcheckout maingitmerge feature/new-logingitpushgitbranch-dfeature/new-login发布日期:2026-08-01