Git工具使用详解
Git 工具使用详解
本章位置:第三阶段 Java 企业项目 + AI 助手
对应课程:Git 工具使用
前置知识:命令行基础、Maven、SpringBoot 项目开发
后续衔接:Redis、若依脚手架、企业项目协作
学习目标:从零掌握 Git 的工作区、暂存区、本地仓库、分支、合并、冲突、远程仓库、撤销恢复、stash、rebase、tag、团队协作,以及 IDEA / Cursor 中的常用 Git 操作。
一、Git 是什么
Git 是:
分布式版本控制系统
它主要解决:
代码版本管理
多人协作
历史追踪
分支开发
错误恢复
二、为什么开发必须学 Git
假设你开发一个 SpringBoot 项目。
第一天:
登录功能完成
第二天:
权限功能完成
第三天你改坏了:
登录也不能用了
如果没有 Git:
只能手工找旧代码
有 Git:
可以回到昨天的版本
三、Git 不是“代码网盘”
很多初学者以为:
Git = GitHub
这是错误的。
Git:
版本控制工具
GitHub / Gitee:
远程代码托管平台
四、Git 和 GitHub 的关系
Git
本地版本管理
GitHub
远程代码托管
你完全可以:
只使用 Git
不使用 GitHub
五、Git 最核心的三个区域
必须记住:
工作区
Working Tree
暂存区
Staging Area / Index
本地仓库
Repository
六、工作区
工作区就是:
你当前项目目录中的文件
例如:
src
pom.xml
application.yml
你编辑文件:
就是修改工作区
七、暂存区
暂存区可以理解:
准备提交的文件清单
执行:
git add .
就是把修改:
加入暂存区
八、本地仓库
执行:
git commit
会把暂存区内容:
保存为一个版本
这个版本存在:
本地 Git 仓库
九、最核心流程
修改代码
↓
Working Tree
↓
git add
↓
Staging Area
↓
git commit
↓
Local Repository
十、远程仓库再多一层
Working Tree
↓
git add
↓
Staging Area
↓
git commit
↓
Local Repository
↓
git push
↓
Remote Repository
十一、安装 Git 后先检查
Windows PowerShell:
git --version
如果输出:
git version ...
说明:
安装成功
十二、配置用户名
第一次使用:
git config --global user.name "YourName"
十三、配置邮箱
git config --global user.email "you@example.com"
十四、为什么要配置用户名和邮箱
每次 Commit:
都要记录作者
十五、查看配置
git config --global --list
十六、global 是什么意思
当前 Windows 用户全局配置
对:
多个项目生效
十七、项目级配置
进入项目后:
git config user.name "ProjectName"
不加:
--global
表示:
只对当前仓库生效
十八、初始化 Git 仓库
进入项目目录:
git init
执行后:
生成 .git
十九、.git 是什么
.git:
Git 仓库真正的数据目录
包含:
提交历史
分支
配置
对象
引用
二十、不要随便删除 .git
删除:
.git
意味着:
当前项目 Git 历史全部消失
源码:
可能还在
但版本历史:
没了
二十一、查看状态
最常用:
git status
二十二、git status 能看到什么
例如:
未跟踪文件
已修改文件
已暂存文件
当前分支
二十三、Untracked
表示:
Git 还没开始跟踪这个文件
例如新建:
UserController.java
Git:
知道文件存在
但还没纳入版本控制
二十四、Modified
表示:
文件以前已经跟踪
现在被修改
二十五、Staged
表示:
已经 git add
准备 commit
二十六、添加单个文件
git add src/main/java/UserController.java
二十七、添加所有修改
git add .
二十八、git add . 到底干什么
它不是:
提交代码
只是:
把当前修改放入暂存区
二十九、提交
git commit -m "feat: add user login"
三十、Commit 是什么
Commit:
一个版本快照
每次 Commit 有:
Commit ID
作者
时间
提交信息
父提交
三十一、查看提交历史
git log
三十二、简洁日志
git log --oneline
三十三、图形日志
git log --oneline --graph --decorate --all
非常推荐。
三十四、Commit ID
例如:
a1b2c3d
Git 内部真正是:
更长的哈希
平时:
前几位足够唯一
即可使用。
三十五、提交信息为什么重要
错误:
update
修改
改一下
123
以后看历史:
完全不知道改了什么
三十六、推荐提交信息
例如:
feat: add login api
fix: resolve token expiration bug
refactor: extract user service
docs: update README
test: add user service tests
三十七、常见 Commit 类型
feat
新增功能
fix
修复 Bug
docs
文档
style
格式
refactor
重构
test
测试
chore
构建/工具/杂项
三十八、一次 Commit 应该多大
推荐:
一个相对完整的小功能
不要:
一天所有东西一次提交
也不要:
每改一行就提交
三十九、好的 Commit
例如:
feat: add role permission assignment
里面包含:
Controller
Service
Mapper
DTO
必要测试
围绕:
一个功能
四十、.gitignore
作用:
告诉 Git 哪些文件不要跟踪
四十一、Java 项目常见忽略
target/
.idea/
*.iml
*.log
四十二、Vue 项目常见忽略
node_modules/
dist/
四十三、环境文件
如果:
.env
包含:
Token
密码
Secret
应该:
忽略
四十四、但配置模板可以提交
例如:
application-example.yml
.env.example
里面:
只写示例值
四十五、Git 已经跟踪的文件,后来写进 .gitignore 有用吗
不会自动停止跟踪。
例如:
application.yml
已经 commit 过。
后来:
application.yml
Git 仍可能:
继续跟踪
四十六、停止跟踪但保留本地文件
git rm --cached application.yml
然后:
git commit
四十七、为什么不能直接 git rm
git rm file
会:
删除工作区文件
+
暂存删除
四十八、git rm --cached
只:
从 Git 索引中移除
本地文件:
保留
四十九、查看修改
git diff
默认比较:
工作区
vs
暂存区
五十、查看已暂存修改
git diff --staged
也可:
git diff --cached
五十一、为什么 commit 前应该 diff
防止:
误提交密码
误提交 debug 代码
误删文件
五十二、推荐提交前流程
git status
git diff
git diff --staged
git commit -m "..."
五十三、分支是什么
Branch:
一条独立开发线
五十四、为什么需要分支
例如:
main
当前稳定版本
你要开发:
Redis 缓存
不应该直接:
在 main 上边写边改
可以:
feature/redis-cache
五十五、分支图
A---B---C main
\
D---E feature
五十六、查看分支
git branch
五十七、创建分支
git branch feature/login
五十八、切换分支
现代 Git 推荐:
git switch feature/login
五十九、创建并切换
git switch -c feature/login
六十、旧写法 checkout
旧教程常见:
git checkout -b feature/login
仍然能用。
但现代 Git 把很多职责拆成:
git switch
切分支
git restore
恢复文件
语义更清楚。
六十一、切回 main
git switch main
六十二、删除分支
安全删除:
git branch -d feature/login
六十三、强制删除
git branch -D feature/login
危险:
可能删除未合并提交
六十四、分支只是指针
Git 分支本质:
指向某个 Commit 的引用
不是:
完整复制一份项目
所以:
创建分支非常快
六十五、HEAD
HEAD:
当前你所在的位置
通常:
指向当前分支
六十六、查看 HEAD
git log --oneline --decorate
会看到:
HEAD -> main
六十七、合并分支
例如:
feature/login
开发完成。
先:
git switch main
再:
git merge feature/login
六十八、Fast-forward
如果 main 没有新提交:
A---B main
\
C---D feature
merge 后:
A---B---C---D main
这叫:
Fast-forward
六十九、真正 Merge Commit
如果两边都继续开发:
C---D feature
/
A---B
\
E---F main
merge 后:
C---D
/ \
A---B M
\ /
E---F
M:
Merge Commit
七十、合并冲突
如果两个分支:
修改同一个文件同一位置
Git 无法判断:
应该保留哪一个
就产生:
Conflict
七十一、冲突标记
文件可能出现:
<<<<<<< HEAD
当前分支代码
=======
另一个分支代码
>>>>>>> feature/login
七十二、冲突怎么解决
不是:
随便删一个
而是:
理解两边业务
决定最终正确代码
删掉冲突标记
保留正确结果
七十三、解决冲突后
git add 冲突文件
再:
git commit
七十四、查看冲突文件
git status
会提示:
both modified
七十五、取消当前 merge
如果发现:
合错了
还没有完成 Merge Commit:
git merge --abort
恢复:
merge 前状态
七十六、团队冲突减少方法
小步提交
经常同步 main
一个文件避免多人长期大改
功能模块边界清晰
七十七、远程仓库
查看:
git remote -v
七十八、添加远程
git remote add origin <remote-url>
七十九、origin 是什么
只是:
远程仓库别名
不是特殊关键字。
习惯上:
第一个远程仓库叫 origin
八十、查看远程详细信息
git remote show origin
八十一、clone
已有远程项目:
git clone <remote-url>
Git 会:
下载源码
+
下载版本历史
+
配置 origin
八十二、第一次 push
例如:
git push -u origin main
八十三、-u 是什么
建立:
upstream tracking
以后:
git push
即可。
八十四、push 是什么
本地 Commit
↓
推送到远程仓库
注意:
必须先 commit
未提交工作区修改:
push 不会自动上传
八十五、fetch 是什么
git fetch
表示:
把远程最新提交下载到本地
但:
不会自动合并到当前分支
八十六、pull 是什么
通常可以理解:
fetch
+
merge/rebase
八十七、为什么初学要区分 fetch 和 pull
fetch:
更安全地“先看看远程有什么”
pull:
直接把远程变化整合到当前分支
八十八、查看远程分支
git branch -r
八十九、查看全部分支
git branch -a
九十、创建本地分支跟踪远程
git switch -c feature/login --track origin/feature/login
某些情况下:
git switch feature/login
Git 也能自动猜测远程同名分支。
九十一、远程分支
例如:
origin/main
它是:
远程跟踪分支
表示:
本地记录的 origin/main 状态
九十二、origin/main 不一定实时最新
只有执行:
git fetch
之后:
才更新
九十三、团队开发开始一天建议
进入项目:
git switch main
git pull
然后:
git switch feature/xxx
必要时同步:
main 最新代码
九十四、不要在 main 上长期写功能
推荐:
main
稳定
feature/xxx
功能
fix/xxx
Bug 修复
九十五、常见分支命名
feature/login
feature/redis-cache
fix/token-expired
refactor/user-service
release/1.0.0
九十六、企业常见开发流
main
稳定生产
develop
日常集成
feature/*
功能开发
release/*
发布准备
hotfix/*
线上紧急修复
九十七、是不是所有项目都要 Git Flow
不是。
小团队可以:
main
+
feature/*
就够。
九十八、分支越多不代表越专业
正确目标:
适合团队协作
而不是:
制造流程复杂度
九十九、stash 是什么
场景:
你正在开发 Redis
代码还没写完。
突然:
线上有 Bug
需要马上切分支。
但当前工作区:
有未提交修改
一百、git stash
git stash
把当前未完成修改:
暂时藏起来
工作区:
恢复干净
一百零一、查看 stash
git stash list
一百零二、恢复最近 stash
git stash pop
恢复并:
从 stash 列表删除
一百零三、apply
git stash apply
恢复:
但保留 stash 记录
一百零四、带说明 stash
git stash push -m "wip: redis cache"
一百零五、stash 某些未跟踪文件
默认行为要根据 Git 版本和参数理解。
如果需要连未跟踪文件也保存:
git stash -u
一百零六、stash 不是长期存档
不要:
stash 放几个月
真正重要的阶段结果:
应该 Commit
一百零七、WIP Commit
有时比 stash 更稳:
git add .
git commit -m "wip: unfinished redis cache"
后续:
再整理历史
一百零八、restore
恢复工作区文件:
git restore file
表示:
丢弃当前未暂存修改
危险。
一百零九、恢复所有未暂存修改
git restore .
这会:
直接丢掉工作区改动
一百一十、取消暂存
git restore --staged file
把文件从:
暂存区
退回:
工作区修改
文件内容:
不丢
一百一十一、这是非常常用的
误执行:
git add .
发现:
application.yml 不该提交
可以:
git restore --staged application.yml
一百一十二、reset 是什么
reset 用于:
移动当前分支指针
并根据模式:
影响暂存区和工作区
一百一十三、三种主要 reset
--soft
--mixed
--hard
一百一十四、git reset --soft
例如:
git reset --soft HEAD~1
效果:
撤销最近 Commit
代码仍在
修改仍在暂存区
一百一十五、适合场景
刚 Commit:
提交信息写错
或者:
漏了一个文件
一百一十六、git reset --mixed
默认模式:
git reset HEAD~1
效果:
撤销 Commit
代码保留
暂存区取消
修改回到:
工作区
一百一十七、git reset --hard
git reset --hard HEAD~1
效果:
Commit 回退
暂存区回退
工作区也回退
修改:
可能直接丢失
一百一十八、hard 为什么危险
因为它:
真的改工作区文件
所以不要:
看到“撤销”就复制 hard
一百一十九、reset 最重要原则
如果 Commit:
还没有 push
reset 相对容易使用。
如果 Commit:
已经推到公共远程分支
不要随便 reset + force push。
一百二十、revert 是什么
git revert <commit-id>
不是删除旧 Commit。
而是:
创建一个新的 Commit
把旧 Commit 的修改:
反向撤销
一百二十一、为什么公共分支更推荐 revert
历史:
不被改写
团队成员:
更安全
一百二十二、reset vs revert
reset
移动历史指针
可能改写历史
revert
新增一个反向提交
保留历史
一百二十三、记忆
本地未共享历史
可以考虑 reset
公共已 push 历史
优先 revert
一百二十四、reflog
Git 的救命工具之一:
git reflog
它记录:
HEAD 近期移动记录
一百二十五、什么时候用 reflog
例如你:
git reset --hard HEAD~3
结果发现:
回多了
可以:
git reflog
找到:
原来的 Commit
一百二十六、恢复误 reset
例如 reflog 找到:
abc1234
可以:
git reset --hard abc1234
前提:
对象还没被 Git 清理
一百二十七、reflog 为什么重要
很多“提交看似丢了”的情况:
其实 Commit 还在
只是:
没有分支指向它
一百二十八、cherry-pick
git cherry-pick <commit-id>
作用:
把某一个 Commit
应用到当前分支
一百二十九、适合场景
例如:
feature 分支有一个 Bug 修复 Commit
你只想把:
这个 Commit
拿到:
release 分支
可以:
cherry-pick
一百三十、不要用 cherry-pick 替代正常 merge
如果整个 feature:
都应该合入
就:
merge / rebase
cherry-pick 适合:
挑某个提交
一百三十一、rebase 是什么
Rebase:
变基
用于:
把一组提交
重新放到另一个基点之后
一百三十二、例子
原来:
A---B---C main
\
D---E feature
main 又有:
C
feature 基于 B。
执行:
git rebase main
结果类似:
A---B---C---D'---E'
一百三十三、为什么 D/E 变成 D’/E’
因为 rebase:
重新创建提交
Commit ID:
会改变
一百三十四、rebase 优点
历史:
更线性
看起来:
更整洁
一百三十五、rebase 风险
它会:
改写提交历史
所以:
不要随便 rebase 已经被多人使用的公共分支
一百三十六、黄金规则
不要 rebase 已经公开共享的提交
一百三十七、自己的 feature 分支
如果只有你自己用:
rebase main
通常比较安全。
一百三十八、rebase 冲突
处理:
解决冲突
然后:
git add .
git rebase --continue
一百三十九、跳过当前 Commit
git rebase --skip
谨慎使用。
一百四十、取消 rebase
git rebase --abort
一百四十一、merge vs rebase
Merge:
保留真实分叉历史
Rebase:
重写为更线性历史
一百四十二、哪个更好
没有绝对。
团队需要:
统一规则
一百四十三、初学建议
先熟练:
branch
merge
conflict
再学:
rebase
一百四十四、交互式 rebase
git rebase -i HEAD~3
可以:
合并 Commit
改提交信息
删除 Commit
调整顺序
一百四十五、squash
把多个小 Commit:
合并为一个
例如:
fix typo
fix typo again
fix test
最终整理成:
feat: add user management
一百四十六、不要在公共分支随便 interactive rebase
因为:
历史会改
一百四十七、修改最近 Commit 信息
git commit --amend
一百四十八、漏提交一个文件
先:
git add missing-file
再:
git commit --amend
一百四十九、amend 也会改变 Commit ID
所以:
已 push 的公共 Commit
不要随便 amend。
一百五十、Tag 是什么
Tag:
给某个 Commit 打标签
常用于:
版本发布
一百五十一、查看 Tag
git tag
一百五十二、创建 Tag
git tag v1.0.0
一百五十三、推荐 Annotated Tag
git tag -a v1.0.0 -m "release 1.0.0"
一百五十四、推送 Tag
git push origin v1.0.0
一百五十五、推送所有 Tag
git push origin --tags
一百五十六、Tag 和 Branch 区别
Branch:
会随着新 Commit 移动
Tag:
通常固定指向某个版本
一百五十七、版本发布
例如:
v1.0.0
v1.1.0
v2.0.0
和 Maven:
版本号
可以保持一致。
一百五十八、查看某个 Commit
git show <commit-id>
一百五十九、查看某个文件历史
git log -- path/to/file
一百六十、查看每一行是谁改的
git blame path/to/file
一百六十一、blame 不是“甩锅工具”
主要用于:
追溯上下文
看看:
为什么当时这么写
一百六十二、删除文件
git rm file
一百六十三、移动/重命名
git mv old.java new.java
Git 最终主要根据:
内容相似度
判断重命名。
一百六十四、远程删除分支
git push origin --delete feature/login
一百六十五、远程已删,本地还显示 origin/xxx
执行:
git fetch --prune
清理:
失效远程跟踪引用
一百六十六、prune
也可以:
git remote prune origin
一百六十七、强制 push
git push --force
危险。
一百六十八、什么时候才可能需要 force
例如:
自己 feature 分支
做了:
rebase
远程历史和本地不同。
一百六十九、更安全
git push --force-with-lease
比:
--force
更安全。
一百七十、为什么 force-with-lease 更安全
它会检查:
远程分支是否还是你预期的状态
减少:
覆盖别人新提交
一百七十一、不要对 main 强推
除非:
团队非常明确知道在做什么
通常:
禁止
一百七十二、Pull Request / Merge Request
GitHub:
Pull Request
GitLab / Gitee 常见:
Merge Request / Pull Request
用途:
代码评审
一百七十三、团队推荐流程
main
↓
创建 feature 分支
↓
开发
↓
commit
↓
push feature
↓
PR
↓
Code Review
↓
CI
↓
Merge
一百七十四、为什么不直接 push main
因为:
缺少评审
容易把 Bug 直接推入稳定分支
一百七十五、Code Review 看什么
业务正确性
异常处理
安全问题
SQL
事务
命名
重复代码
测试
一百七十六、AI 生成代码也必须 Review
Cursor / AI 生成:
不能直接 commit
先检查:
是否真能运行
是否引入旧 API
是否破坏权限
是否泄露 Secret
一百七十七、Git 在 AI 开发中的价值
AI 修改前:
git status
确认:
工作区干净
一百七十八、先 Commit 再让 AI 大改
例如:
git add .
git commit -m "chore: checkpoint before ai refactor"
然后让 AI:
重构
如果改坏:
容易恢复
一百七十九、这是 Cursor 开发非常推荐的习惯
AI 一次可能:
改很多文件
Git 就是你的:
安全网
一百八十、AI 改完第一步
git diff
看:
AI 到底改了什么
一百八十一、不要只看“项目能启动”
AI 可能:
顺便删权限校验
硬编码密码
改 API
必须:
看 diff
一百八十二、GitHub/Gitee HTTPS
远程地址可能:
HTTPS
认证通常:
密码已逐渐被 Token / Credential 方式替代
一百八十三、SSH
也可以:
SSH Key
访问远程仓库。
一百八十四、生成 SSH Key
常见:
ssh-keygen -t ed25519 -C "you@example.com"
一百八十五、公钥
通常:
~/.ssh/id_ed25519.pub
把:
公钥
添加到:
GitHub/Gitee
一百八十六、私钥
id_ed25519
绝对不要:
上传
发给别人
提交 Git
一百八十七、SSH 测试
平台不同命令不同。
GitHub 常见:
ssh -T git@github.com
一百八十八、Windows Credential Manager
HTTPS 认证可能:
由 Git Credential Manager
缓存凭据。
一百八十九、凭据错误
如果:
一直用旧账号
可以检查:
Windows 凭据管理器
一百九十、Git LFS
大文件:
模型
视频
大型二进制
普通 Git:
不适合频繁存大文件
Git LFS:
Large File Storage
可处理大文件版本。
一百九十一、但不要把数据库备份随便放 Git
例如:
10GB SQL
不适合。
一百九十二、敏感文件泄露
如果你把:
数据库密码
API Key
Secret
Commit 了。
即使后来:
删除文件
历史 Commit:
仍然可能包含
一百九十三、第一件事
立即:
更换泄露的 Secret
不是只:
删 Git 历史
一百九十四、为什么
一旦推到远程:
应该视为已经泄露
一百九十五、清历史属于后续操作
可以用:
git filter-repo
等专门工具。
但核心:
先轮换密钥
一百九十六、Git Hooks
Git 可以:
在 commit/push 等事件自动执行脚本
例如:
pre-commit
pre-push
一百九十七、pre-commit
可以:
代码格式检查
Secret 扫描
Lint
一百九十八、pre-push
可以:
运行测试
一百九十九、学习阶段先了解
企业团队可能通过:
Husky
CI
做自动检查。
二百、Git 与 CI/CD
git push
↓
CI
↓
mvn test
↓
npm build
↓
Docker build
↓
deploy
Git 通常是:
整个自动化流程入口
二百零一、Git 子模块 Submodule
用于:
一个仓库引用另一个 Git 仓库
命令:
git submodule
但:
管理复杂
初学:
知道即可
二百零二、Monorepo
多个项目:
放一个仓库
例如:
backend
frontend
docs
二百零三、Multi Repo
不同服务:
不同 Git 仓库
例如:
user-service
order-service
gateway
二百零四、企业如何选择
根据:
团队规模
发布边界
权限
依赖关系
决定。
二百零五、IDEA 中 Git
IDEA 2024.3 可以直接:
VCS / Git
操作。
二百零六、IDEA 开启 Git
如果项目还没启用:
VCS
→ Enable Version Control Integration
→ Git
二百零七、IDEA Commit
可以:
左侧 Commit 工具窗口
选择文件:
填写 Commit Message
然后:
Commit
二百零八、IDEA Push
菜单:
Git
→ Push
常见快捷键:
Ctrl + Shift + K
Windows/IDEA Keymap 可能有差异。
二百零九、IDEA Update Project
常见:
Ctrl + T
对应:
同步远程更新
具体行为取决于:
Update Method
二百一十、IDEA Branch
右下角:
当前分支名
点击即可:
New Branch
Checkout
Merge
Compare
二百一十一、IDEA 解决冲突
冲突时:
Merge
会出现三栏:
Yours
Result
Theirs
二百一十二、冲突界面不要盲点 Accept Yours
要理解:
当前分支
对方分支
最终结果
二百一十三、IDEA Local Changes
可以查看:
哪些文件改了
并逐个查看:
Diff
二百一十四、IDEA Rollback
相当危险。
可能:
丢掉未提交修改
使用前:
确认真的不要这些改动
二百一十五、Cursor 中 Git
Cursor 基于 VS Code 体系,
左侧:
Source Control
可以:
Stage
Commit
Push
Pull
Branch
二百一十六、Cursor + AI 最重要习惯
AI 修改前:
Commit 一个 checkpoint
AI 修改后:
逐文件看 Diff
二百一十七、不要让 AI 直接执行危险 Git 操作
尤其:
reset --hard
clean -fd
push --force
rebase
如果你还没理解:
不要让 AI 自动执行
二百一十八、git clean
删除:
未跟踪文件
预览:
git clean -n
二百一十九、真正删除
git clean -fd
危险。
二百二十、为什么先 -n
让 Git:
先告诉你会删什么
二百二十一、git clean 不一定能 reflog 恢复
因为未跟踪文件:
从未 Commit
Git 可能根本:
没有对象
所以:
比 reset 更危险
二百二十二、误删未跟踪文件
如果:
从没 add/commit/stash
Git:
通常帮不了你
需要:
IDEA Local History
系统备份
二百二十三、IDEA Local History
即使没 Git Commit,
IDEA 有时可以:
Local History
找回近期修改。
右键:
Local History
→ Show History
二百二十四、但不能依赖 Local History
真正重要代码:
及时 Commit
二百二十五、常见错误 1:git add 后以为已经上传
没有。
还需要:
commit
再:
push
二百二十六、常见错误 2:commit 后 GitHub 没变化
因为只:
本地 Commit
还需要:
git push
二百二十七、常见错误 3:push rejected
例如:
remote contains work that you do not have
说明:
远程有你本地没有的提交
二百二十八、正确思路
先:
git fetch
看看:
远程变化
再:
merge / rebase
之后:
push
二百二十九、不要看到 rejected 就 force push
这可能:
覆盖别人代码
二百三十、常见错误 4:切分支失败
提示:
Your local changes would be overwritten
说明:
当前有未提交修改
选择:
Commit
Stash
或放弃修改
二百三十一、常见错误 5:merge conflict
不是 Git 坏了。
这是:
Git 不知道应该选哪边
需要:
人工解决
二百三十二、常见错误 6:detached HEAD
你可能:
git checkout <commit-id>
然后处在:
detached HEAD
二百三十三、detached HEAD 是什么
HEAD:
直接指向 Commit
而不是:
某个 Branch
二百三十四、在 detached HEAD 上写代码
Commit 后:
可能没有正常分支长期指向
容易迷失。
二百三十五、如果想保留
创建分支:
git switch -c rescue-work
二百三十六、常见错误 7:误 commit 到 main
如果还没 push:
可以创建新分支保留 Commit
例如:
git branch feature/login
然后把 main:
reset 回去
具体操作前:
先看 log
二百三十七、常见错误 8:commit 信息写错
未 push:
git commit --amend
二百三十八、常见错误 9:漏文件
git add missing-file
git commit --amend
二百三十九、常见错误 10:误 add 敏感配置
还没 commit:
git restore --staged application.yml
然后:
加入 .gitignore
二百四十、常见错误 11:误 commit Secret
如果已 push:
先立刻轮换 Secret
然后:
再处理 Git 历史
二百四十一、常见错误 12:误 reset --hard
第一时间:
git reflog
看看:
原 Commit
二百四十二、常见错误 13:误删未跟踪文件
Git:
可能无法恢复
尝试:
IDEA Local History
二百四十三、常见错误 14:rebase 后 push 被拒绝
因为:
Commit ID 改了
自己的私有 feature 分支:
可以考虑
git push --force-with-lease
公共分支:
不要随便强推
二百四十四、常见错误 15:本地分支太多
已合并分支:
git branch -d xxx
远程失效引用:
git fetch --prune
二百四十五、常见错误 16:改了 .gitignore 仍然跟踪
因为文件:
之前已经被 Git 跟踪
用:
git rm --cached file
二百四十六、常见错误 17:两个分支都有同名不同功能
说明:
分支生命周期过长
应该:
更频繁集成
二百四十七、常见错误 18:一次 Commit 100 个不相关文件
Code Review:
非常痛苦
应:
按功能拆 Commit
二百四十八、常见错误 19:只依赖 IDE 按钮不会命令
IDE 图形界面:
只是 Git 命令的包装
真正排错:
必须会基本命令
二百四十九、必须掌握命令 1
git status
二百五十、必须掌握命令 2
git add .
二百五十一、必须掌握命令 3
git commit -m "..."
二百五十二、必须掌握命令 4
git log --oneline --graph --all
二百五十三、必须掌握命令 5
git switch -c feature/xxx
二百五十四、必须掌握命令 6
git merge branch
二百五十五、必须掌握命令 7
git fetch
二百五十六、必须掌握命令 8
git pull
二百五十七、必须掌握命令 9
git push
二百五十八、必须掌握命令 10
git stash
git stash pop
二百五十九、必须掌握命令 11
git restore
二百六十、必须掌握命令 12
git reset
二百六十一、必须掌握命令 13
git revert
二百六十二、必须掌握命令 14
git reflog
二百六十三、必须掌握命令 15
git rebase
至少:
理解原理
二百六十四、必须掌握命令 16
git cherry-pick
二百六十五、必须掌握命令 17
git tag
二百六十六、日常开发标准流程
早上:
git switch main
git pull
创建功能分支:
git switch -c feature/user-role
开发。
检查:
git status
git diff
提交:
git add .
git commit -m "feat: add user role assignment"
推送:
git push -u origin feature/user-role
然后:
创建 PR
二百六十七、继续开发同一个分支
git add .
git commit -m "fix: validate role assignment"
git push
二百六十八、main 更新了怎么办
先:
git fetch origin
选择:
merge origin/main
或者:
rebase origin/main
具体:
按团队规则
二百六十九、合并完成
PR:
Merge
然后本地:
git switch main
git pull
git branch -d feature/user-role
二百七十、个人毕业设计推荐流程
即使一个人:
也建议 Git
二百七十一、毕设分支可以简单
main
feature/login
feature/user
feature/ai
feature/workflow
二百七十二、每做完一个核心模块就 Commit
例如:
feat: complete login module
feat: complete user management
feat: integrate activiti approval
feat: add workflow diagram
二百七十三、AI 大改前打 checkpoint
git add .
git commit -m "chore: checkpoint before ai ui refactor"
二百七十四、为什么特别适合 Cursor
Cursor 可能一次:
改几十处
如果:
效果不好
可以快速:
比较/恢复
二百七十五、Git 不能替代备份
Git 非常强,
但仍建议重要项目:
远程 push
因为如果电脑硬盘坏:
只有本地 Git 也没用
二百七十六、所以真正安全
本地 Git
+
远程仓库
二百七十七、私有仓库
毕设、商业项目:
可以创建 Private Repository
避免:
源码公开
二百七十八、README
建议项目根目录:
README.md
包含:
项目介绍
技术栈
环境要求
启动方式
数据库初始化
默认账号
二百七十九、不要在 README 写真实生产密码
可以写:
请配置环境变量
二百八十、Git 项目应该提交什么
提交:
源码
pom.xml
package.json
数据库结构脚本
必要配置模板
README
二百八十一、不应该提交什么
target
node_modules
dist
IDE 临时文件
日志
Secret
私钥
二百八十二、数据库 SQL 是否提交
推荐提交:
schema.sql
migration scripts
用于:
团队同步数据库结构
二百八十三、不要只发一份最新 db.sql
企业项目更好:
版本化 migration
例如:
V1__init.sql
V2__add_role.sql
后面可以了解:
Flyway
Liquibase
二百八十四、Git 与 Maven
Git 保存:
pom.xml
不保存:
本地 .m2 repository
二百八十五、Git 与 npm
Git 保存:
package.json
package-lock.json
不保存:
node_modules
二百八十六、Git 与 Docker
Git 保存:
Dockerfile
docker-compose.yml
但:
镜像本身不放 Git
二百八十七、Git 与 Redis
后面 Redis 项目:
配置代码
提交 Git。
Redis 实际数据:
不提交 Git
二百八十八、练习 1:初始化仓库
创建空目录:
git-practice
执行:
git init
二百八十九、练习 2:第一次提交
创建:
README.md
执行:
git add README.md
git commit -m "docs: add readme"
二百九十、练习 3:观察三区
修改 README。
执行:
git status
然后:
git add README.md
再次:
git status
理解:
Working Tree → Staging Area
二百九十一、练习 4:查看 diff
git diff
和:
git diff --staged
二百九十二、练习 5:创建分支
git switch -c feature/login
创建:
login.txt
提交。
二百九十三、练习 6:merge
切回:
git switch main
合并:
git merge feature/login
二百九十四、练习 7:制造冲突
main:
修改 README 第一行
feature:
也修改第一行
分别 Commit。
然后 merge。
自己解决:
Conflict
二百九十五、练习 8:stash
修改:
两个文件
不 Commit。
执行:
git stash push -m "test stash"
观察工作区。
再:
git stash pop
二百九十六、练习 9:restore
修改一个文件。
先:
git diff
再:
git restore file
观察:
修改被丢弃
二百九十七、练习 10:取消暂存
git add file
再:
git restore --staged file
二百九十八、练习 11:reset --soft
提交一个 Commit。
执行:
git reset --soft HEAD~1
观察:
Commit 消失
修改仍 staged
二百九十九、练习 12:reset mixed
再提交。
执行:
git reset HEAD~1
观察:
修改回 Working Tree
三百、练习 13:revert
提交一个错误版本。
执行:
git revert <commit-id>
观察:
新增一个反向 Commit
三百零一、练习 14:reflog
记录当前 log。
执行一次:
reset
再:
git reflog
找原 Commit。
三百零二、练习 15:cherry-pick
在 feature:
做一个 fix Commit
切 main。
执行:
git cherry-pick <commit-id>
三百零三、练习 16:rebase
创建:
feature/demo
main 和 feature:
分别提交
feature 上:
git rebase main
观察:
历史变线性
三百零四、练习 17:remote
创建:
GitHub / Gitee 私有仓库
添加:
git remote add origin ...
三百零五、练习 18:push
git push -u origin main
三百零六、练习 19:clone
另建目录:
git clone ...
观察:
代码 + 历史
三百零七、练习 20:tag
git tag -a v1.0.0 -m "first release"
git push origin v1.0.0
三百零八、面试题 1:Git 三个区域
答:
Working Tree 是当前实际文件。
Staging Area 保存下一次准备提交的修改。
Repository 保存已经 Commit 的历史版本。
常见流程是:
工作区 → git add → 暂存区 → git commit → 本地仓库。
三百零九、面试题 2:git add 做什么
答:
git add 不是真正提交代码。
它把工作区中的修改加入暂存区,
决定哪些内容会进入下一次 Commit。
三百一十、面试题 3:fetch 和 pull 区别
答:
git fetch 只把远程最新提交和引用下载到本地,
不会自动改变当前分支。
git pull 通常相当于 fetch 后
再把远程变化合并或 rebase 到当前分支。
三百一十一、面试题 4:merge 和 rebase 区别
答:
merge 通常保留原来的分支分叉历史,
必要时生成 Merge Commit。
rebase 会把当前分支提交重新应用到新的基点,
形成更线性的历史,
但会改变提交 ID。
因此不要随便 rebase 已共享的公共历史。
三百一十二、面试题 5:reset 和 revert 区别
答:
reset 通过移动分支指针回退历史,
可能改变工作区和暂存区,
也可能改写提交历史。
revert 不删除旧提交,
而是创建一个新的反向 Commit 撤销旧修改。
公共分支通常优先使用 revert。
三百一十三、面试题 6:stash 是什么
答:
stash 用于临时保存当前未完成的工作区修改,
让工作区恢复干净,
方便临时切换分支处理其他事情。
之后可以通过 stash pop/apply 恢复。
三百一十四、面试题 7:reflog 有什么用
答:
reflog 记录 HEAD 和分支引用近期移动历史。
误 reset、误 rebase 等操作后,
很多看似丢失的 Commit
仍然可以通过 reflog 找到并恢复。
三百一十五、面试题 8:为什么 git reset --hard 危险
答:
因为它不仅移动 Commit 指针,
还会同步重置暂存区和工作区。
没有保存的本地修改可能直接丢失。
三百一十六、面试题 9:为什么公共分支不建议 force push
答:
强制 Push 会重写远程分支历史,
可能把其他成员已经 Push 的提交覆盖掉。
如果个人分支 rebase 后确实需要强推,
也更推荐 force-with-lease。
三百一十七、面试题 10:.gitignore 为什么有时不生效
答:
.gitignore 主要影响尚未被 Git 跟踪的文件。
如果文件之前已经 Commit 并被 Git 跟踪,
后来再加入 .gitignore,
Git 仍会继续跟踪。
可以使用 git rm --cached
停止跟踪并保留本地文件。
三百一十八、面试题 11:branch 本质是什么
答:
Git 分支本质是一个轻量级引用,
指向某个 Commit。
新建分支并不会复制整个项目,
所以创建和切换分支都非常快。
三百一十九、面试题 12:HEAD 是什么
答:
HEAD 表示当前工作位置。
正常情况下它指向当前分支,
而当前分支再指向一个具体 Commit。
detached HEAD 时,
HEAD 会直接指向某个 Commit。
三百二十、面试题 13:Commit 和 Push 区别
答:
Commit 只是在本地 Git 仓库创建一个版本。
Push 才会把本地 Commit
同步到远程仓库。
因此 Commit 后 GitHub 没变化,
通常只是还没有 Push。
三百二十一、面试题 14:Cherry-pick 是什么
答:
Cherry-pick 可以把另一个分支中的某一个指定 Commit
复制应用到当前分支。
适合只需要某个独立 Bug Fix 的场景,
不适合替代完整分支合并。
三百二十二、面试题 15:为什么 AI 开发更需要 Git
答:
AI 工具可能一次修改大量文件。
在 AI 大改之前创建 Git Checkpoint,
改完后通过 git diff 检查,
可以快速知道 AI 修改范围并在出错时恢复。
因此 Git 是 AI 编程非常重要的安全网。
三百二十三、Git 知识树
Git
│
├─ Basic
│ ├─ init
│ ├─ status
│ ├─ add
│ ├─ commit
│ ├─ log
│ └─ diff
│
├─ Branch
│ ├─ branch
│ ├─ switch
│ ├─ merge
│ ├─ conflict
│ └─ HEAD
│
├─ Remote
│ ├─ clone
│ ├─ remote
│ ├─ fetch
│ ├─ pull
│ └─ push
│
├─ Recovery
│ ├─ restore
│ ├─ reset
│ ├─ revert
│ ├─ reflog
│ └─ stash
│
├─ Advanced
│ ├─ rebase
│ ├─ cherry-pick
│ ├─ tag
│ └─ clean
│
├─ Team
│ ├─ PR
│ ├─ Code Review
│ ├─ Feature Branch
│ └─ CI/CD
│
└─ Tools
├─ IDEA
├─ Cursor
├─ GitHub
└─ Gitee
三百二十四、最重要的日常命令表
git status
git add .
git commit -m "message"
git log --oneline --graph --all
git switch -c feature/xxx
git switch main
git merge feature/xxx
git fetch
git pull
git push
git stash
git stash pop
git restore file
git restore --staged file
git reset --soft HEAD~1
git revert <commit>
git reflog
git cherry-pick <commit>
git rebase main
git tag -a v1.0.0 -m "release"
三百二十五、最重要的安全原则
1. reset --hard 前先确认
2. clean -fd 前先 clean -n
3. force push 前先确认分支
4. 公共分支优先 revert
5. AI 大改前先 Commit
6. Commit 前看 git diff
7. Secret 不要提交
8. 已泄露 Secret 先轮换
9. 重要代码要 Push 远程
10. 不要删除 .git
三百二十六、本章总结
Git 最重要的不是:
背几十条命令
而是理解:
状态如何流转
核心三区:
Working Tree
↓
Staging Area
↓
Repository
核心远程:
Local Repository
↓
Push
↓
Remote Repository
核心分支:
Branch
Merge
Conflict
核心恢复:
Restore
Reset
Revert
Reflog
Stash
核心高级:
Rebase
Cherry-pick
Tag
核心团队协作:
Feature Branch
↓
Push
↓
Pull Request
↓
Code Review
↓
Merge
对你使用 Cursor / AI 开发而言,最重要的习惯:
AI 修改前
先 Commit
AI 修改后
先 git diff
确认无误
再 Commit
到这里,第三阶段中的:
Git 工具使用
已经完成。
按照课程表,下一篇进入:
Redis 详解
会继续学习:
Redis 是什么
String / Hash / List / Set / ZSet
Key 设计
TTL
缓存
缓存穿透
缓存击穿
缓存雪崩
双写一致性
分布式锁
SpringBoot RedisTemplate
StringRedisTemplate
序列化
登录 Token
验证码
排行榜
高并发缓存