本系列完整合集:
- Git 与 Linux 学习笔记合集:命令速查、实战与面试考点完整合集
原分篇继续公开保留,可按需查阅。
这是《Git 与 Linux 学习笔记》系列的第 01 篇。缘起很简单:我每次要用到不那么高频的 Git 命令(stash、revert、tag……)都得现搜一遍,搜完就忘。这次干脆把散落的资料整理成自己的速查手册,按「我要干什么」来组织,每条命令都配一段可以直接复制运行的演示。
这一篇的核心一句话:Git 的所有日常操作,都是在「工作区、暂存区、本地仓库、远程仓库」这四个区之间搬东西——记住这句话,32 条命令就都不是孤立的。
〇、先建立地图:Git 的四个区
工作区 暂存区 本地仓库 远程仓库 (写代码的地方) → (git add 之后) → (git commit 之后) → (git push 之后) │ │ │ │ git add │ git commit │ git push ←────────────────┴ git restore / reset / pull ─┘后面每条命令,都可以对照这张图想一遍「它把东西从哪儿搬到哪儿」。
一、基础配置
1. 配置用户名和邮箱
gitconfig--globaluser.name"Your Name"gitconfig--globaluser.email"your@email.com"演示:
$gitconfig--globaluser.name"张三"$gitconfig--globaluser.email"zhangsan@example.com"2. 查看配置
gitconfig--list演示:
$gitconfig--listuser.name=张三user.email=zhangsan@example.com二、仓库操作
3. 初始化本地仓库
gitinit演示:
$mkdirmy-project&&cdmy-project $gitinit Initialized empty Git repositoryin/my-project/.git/4. 克隆远程仓库
gitclone<仓库地址>演示:
$gitclone https://github.com/user/repo.git Cloning into'repo'... remote: Enumerating objects:150, done.三、日常提交流程
5. 查看文件状态
gitstatus演示:
$gitstatus On branch main Changes not stagedforcommit: modified: README.md Untracked files: newfile.txt6. 添加文件到暂存区
gitadd<文件名># 添加指定文件gitadd.# 添加所有文件演示:
$gitaddREADME.md newfile.txt $gitstatus Changes to be committed: modified: README.md new file: newfile.txt7. 提交更改
gitcommit-m"提交信息"演示:
$gitcommit-m"修复登录页面bug,更新README"[main a1b2c3d]修复登录页面bug,更新README2files changed,25insertions(+),3deletions(-)8. 一步提交(仅限已跟踪文件)
gitcommit-am"提交信息"演示:
$gitcommit-am"更新配置文件"[main e4f5g6h]更新配置文件1filechanged,10insertions(+),2deletions(-)注意
-am不会把新建的未跟踪文件加进来,新文件还是要先git add。
四、分支管理
9. 查看分支
gitbranch# 本地分支gitbranch-a# 所有分支(含远程)演示:
$gitbranch * main develop feature-login10. 创建分支
gitbranch<分支名>演示:
$gitbranch feature-payment $gitbranch develop feature-login feature-payment * main11. 切换分支
gitswitch<分支名># Git 2.23+ 推荐gitcheckout<分支名># 旧写法演示:
$gitswitch feature-payment Switched to branch'feature-payment'12. 创建并切换分支
gitswitch-c<分支名># Git 2.23+ 推荐gitcheckout-b<分支名># 旧写法演示:
$gitswitch-cfeature-search Switched to a new branch'feature-search'13. 合并分支
gitmerge<要合并的分支名>演示:(当前在main,合并develop)
$gitswitch main $gitmerge develop Updating a1b2c3d..e4f5g6h Fast-forward src/app.js|15+++++++++++++++1filechanged,15insertions(+)14. 删除分支
gitbranch-d<分支名># 安全删除(已合并)gitbranch-D<分支名># 强制删除演示:
$gitbranch-dfeature-login Deleted branch feature-login(was e4f5g6h).五、远程操作
15. 查看远程仓库
gitremote-v演示:
$gitremote-vorigin https://github.com/user/repo.git(fetch)origin https://github.com/user/repo.git(push)16. 添加远程仓库
gitremoteadd<别名><仓库地址>演示:
$gitremoteaddupstream https://github.com/original/repo.git17. 推送代码
gitpush<远程名><分支名>gitpush-uorigin main# 首次推送并设置上游演示:
$gitpush origin feature-payment Enumerating objects:5, done. To https://github.com/user/repo.git *[new branch]feature-payment ->feature-payment18. 拉取代码
gitpull<远程名><分支名>gitpull# 拉取当前分支更新演示:
$gitpull origin main From https://github.com/user/repo * branch main ->FETCH_HEAD Updating a1b2c3d..z9y8x7w19. 获取远程更新(不自动合并)
gitfetch演示:
$gitfetch origin remote: Enumerating objects:10, done. From https://github.com/user/repo a1b2c3d..z9y8x7w main ->origin/main
pull=fetch+merge。想先看一眼远程发生了什么再决定怎么合并,就用fetch。
六、查看历史
20. 查看提交日志
| 命令 | 说明 |
|---|---|
git log | 详细日志 |
git log --oneline | 简洁版(一行一条) |
git log --graph --oneline --all | 图形化分支历史 |
演示:
$gitlog--onelinea1b2c3d(HEAD ->main)修复登录页面bug,更新README e4f5g6h 添加支付功能模块 z9y8x7w 初始化项目21. 查看某次提交详情
gitshow<commit-hash>演示:
$gitshow a1b2c3d commit a1b2c3d... Author: 张三<zhangsan@example.com>Date: Mon Jun102026修复登录页面bug,更新READMEdiff--gita/README.md b/README.md...22. 查看文件变更差异
| 命令 | 比较范围 |
|---|---|
git diff | 工作区 ↔ 暂存区 |
git diff --staged | 暂存区 ↔ 最新提交 |
演示:
$gitdiffdiff--gita/README.md b/README.md -旧内容行 +新内容行七、撤销与回退(重点,面试常问)
这一节是整个手册里最容易出事的地方,每条都先想清楚「它作用在哪个区」再敲回车。
23. 撤销工作区修改
gitrestore<文件名># Git 2.23+ 推荐gitcheckout --<文件名># 旧写法演示:
$gitrestore README.md24. 取消暂存
gitrestore--staged<文件名># Git 2.23+ 推荐gitreset HEAD<文件名># 旧写法演示:
$gitrestore--stagednewfile.txt25. 回退提交(保留修改)
gitreset--softHEAD~1演示:
$gitreset--softHEAD~1 $gitstatus Changes to be committed: modified: README.md26. 回退提交(丢弃修改)
⚠️危险操作:修改将永久丢失,动手前先
git log记下当前 commit hash。
gitreset--hardHEAD~1演示:
$gitreset--hardHEAD~1 HEAD is now at e4f5g6h 添加支付功能模块27. 安全撤销(用新提交抵消旧提交)
gitrevert<commit-hash>演示:
$gitrevert a1b2c3d[main f7g8h9i]Revert"修复登录页面bug,更新README"1filechanged,3insertions(+),25deletions(-)reset 三种模式对比(面试常问):
| 模式 | 本地仓库 | 暂存区 | 工作区 | 适用场景 |
|---|---|---|---|---|
--soft | 回退 | 保留 | 保留 | 重新组织提交 |
--mixed(默认) | 回退 | 清空 | 保留 | 重新 add 再提交 |
--hard | 回退 | 清空 | 清空 | 彻底丢弃(危险) |
revert 与 reset 怎么选:分支已经推送到远程、别人可能拉过 → 用revert(生成新提交,不改历史);本地私有分支还没推 → 用reset(干净,不留「撤销提交」)。
八、储藏与标签
28. 储藏当前修改
gitstashgitstash save"描述"演示:
$gitstash save"临时保存支付功能开发进度"Saved working directory and index state On main: 临时保存支付功能开发进度29. 查看储藏列表
gitstash list演示:
$gitstash list stash@{0}: On main: 临时保存支付功能开发进度30. 恢复储藏
| 命令 | 说明 |
|---|---|
git stash pop | 恢复并删除储藏 |
git stash apply | 恢复但保留储藏 |
演示:
$gitstash pop On branch main Changes not stagedforcommit: modified: payment.js31. 创建标签
gittag<标签名># 轻量标签gittag-a<标签名>-m"说明"# 附注标签(推荐)演示:
$gittag-av1.0.0-m"第一个正式版本发布"$gittag v1.0.032. 推送标签
gitpush origin<标签名>gitpush origin--tags# 推送所有标签演示:
$gitpush origin v1.0.0
git push默认不会推送标签,发版时记得单独推。
九、三个完整组合场景
场景一:日常开发完整流程
# 1. 拉取最新代码gitpull origin main# 2. 创建功能分支gitswitch-cfeature-xxx# 3. 编写代码后,添加修改gitadd.# 4. 提交gitcommit-m"完成xxx功能"# 5. 推送远程gitpush origin feature-xxx# 6. 在 GitHub / GitLab 上创建 Pull Request场景二:紧急修复线上 Bug
# 1. 切回主分支并拉取最新gitswitch maingitpull origin main# 2. 创建修复分支gitswitch-chotfix-urgent# 3. 修复 bug 后提交gitadd.gitcommit-m"紧急修复支付异常"# 4. 切回 main 并合并gitswitch maingitmerge hotfix-urgent# 5. 推送并清理gitpush origin maingitbranch-dhotfix-urgent场景三:解决合并冲突
$gitmerge feature-payment Auto-merging payment.js CONFLICT(content): Merge conflictinpayment.js Automatic merge failed;fix conflicts andthencommit.# 手动编辑 payment.js,处理冲突标记:# <<<<<<< HEAD# 当前分支的内容# =======# 被合并分支的内容# >>>>>>> feature-payment# 解决后标记完成$gitaddpayment.js $gitcommit-m"合并 feature-payment,解决冲突"最需要记住的几句话
- 主调节拍是 add → commit → push,所有命令都是围绕「工作区、暂存区、本地仓库、远程仓库」四区搬东西。
- 撤销分三层:工作区用
git restore,暂存区用git restore --staged,已提交的用revert(公共分支)或reset(私有分支)。 reset --hard会真丢代码,回车前先git log记下 hash,给自己留一条后路。git push不推标签,发版要git push origin <tag>或--tags。- 新写的分支功能别直接怼 main:先
switch -c拉分支,走 Pull Request,出事好回退。
我的复盘
我一开始把git checkout当万能命令用:切分支用它、丢弃修改也用它。直到有一次想「放弃某个文件的改动」,结果顺手把还没提交的整块工作区都洗掉了,才明白一个命令承担太多语义,就容易按错。后来 Git 2.23 出了switch(专管分支)和restore(专管撤销),我把肌肉记忆整体迁了过去,误操作基本绝迹。
另一个教训是reset --hard。现在我的习惯是:任何回退操作前先git log --oneline截个 hash 放在终端里,真删错了还能git reset --hard <hash>找回来。Git 的「删除」大多数时候只是移动了指针,冷静下来都能救回来——但前提是你记得那个 hash。
给读者的建议:不要背命令清单,按第九节的三个场景把完整流程各跑一遍(找个测试仓库),之后按场景回忆命令,比按字母序背牢得多。
提示:
git switch/git restore需要Git 2.23+,更早的版本请继续用git checkout系列。
本系列导航
- 01 Git 常用指令速查:9 大分类 32 条核心命令与实战演示(本篇)
- 02 Linux 命令速查大全:82 条常用指令与面试高频考点