# Git
基础身份配置(首次使用 Git )
提交 commit 时 Git 会绑定用户名与邮箱标识作者,未配置会提交失败。
# 全局配置(本机所有Git仓库生效,推荐)
git config --global user.name "GaoChengquan"
git config --global user.email "529390053@qq.com"
# 仅当前仓库生效(单独项目使用不同身份时用,去掉 --global)
git config user.name "别名"
git config user.email "备用邮箱@qq.com"
# 查看当前配置
git config --global --list
.gitignore 忽略文件配置
作用:指定不需要被Git追踪、纳入版本管理的文件/文件夹,避免编译产物、配置、IDE缓存上传仓库。
- 规则写法示例
# 忽略整个target编译目录(Maven/Gradle)
target/
# 忽略IDE配置文件夹
.idea/
.vscode/
# 忽略日志文件
*.log
# 忽略所有.class字节码文件
*.class
# 忽略本地配置,但保留模板配置
application.properties
!application.properties.template
# 忽略系统生成文件
.DS_Store
Thumbs.db
- 注意:已经被Git追踪的文件,写入
.gitignore不会自动忽略,需要先取消追踪:
git rm --cached 文件名
Git 三大区域核心模型(重中之重)
三层结构
- 工作目录(Working Directory) 本地电脑真实文件夹,正在编辑、修改代码的地方,肉眼可见所有文件。
- 暂存区(Stage / Index) 临时中转站,执行
git add后,修改的文件会存入暂存区,等待统一提交。 - 本地仓库(Local Repository)
.git隐藏文件夹,执行git commit会把暂存区内容永久生成版本快照保存至此。 - 远程仓库(Remote Repository):Gitee/GitHub/GitLab 云端仓库,
git push推送至此。


流转顺序
工作目录修改代码` → `git add 加入暂存区` → `git commit 提交本地仓库生成版本` → `git push 推送远程仓库
标准完整开发流程
1. 新建本地仓库
# 方式1:本地空白文件夹初始化Git
git init
# 方式2:克隆远程已有仓库到本地(自动绑定远程地址,无需init)
git clone https://gitee.com/xxx/xxx.git
2. 新增/修改文件,加入暂存区
# 添加单个文件
git add Hello.java
# 添加多个指定文件
git add Hello.java Hi.java Test.html
# 添加当前目录下所有被修改、新增的文件(常用)
git add .
# 只添加修改过的文件,不处理新增文件
git add -u
3. 提交至本地仓库
git commit -m "提交备注:描述本次改了什么功能"
# 简写:add+commit合并(仅已追踪的文件生效,新增文件无效)
git commit -am "备注"
# 修改上一条commit的提交备注
git commit --amend -m "修正后的备注"
4. 绑定远程仓库 & 推送到云端
# 绑定远程仓库地址 origin 是远程仓库默认别名
git remote add origin https://gitee.com/dxk123456/dxk.git
# 首次推送 -u 绑定上游分支,后续直接git push即可
git push -u origin master
# 非首次推送
git push origin master
配套查看状态(高频命令)
# 查看当前所有文件状态(红色未暂存、绿色已暂存)
git status
# 简洁版状态查看
git status -s
# 查看提交日志
git log
# 简洁分行日志
git log --oneline
撤销操作大全(工作区、暂存区回滚)
1. 撤销
# 恢复单个文件 工作区为add的文件丢失
git checkout 文件名.java
# 恢复当前目录所有文件改动
git checkout .
2. 已经 git add 加入暂存区,想要撤回暂存
# 撤销单个文件暂存
git reset HEAD 文件名
# 撤销所有文件暂存
git reset HEAD .
# 撤销前一个文件暂存
git reset HEAD^
撤回暂存后,文件回到工作区,此时再用 git checkout . 就能彻底删掉改动。
3. 已经 commit 提交本地仓库,想要回退版本
# 查看版本号
git log --oneline
# 软回退:版本后退,改动保留在工作区
git reset 版本号
# 硬回退:彻底删掉后面所有提交,慎用!
git reset --hard 版本号
# 软回退,只撤销提交本地代码不变
git reset --soft 版本号
# 软回退,撤销提交 清除暂存区 本地代码不变
git reset --mixed 版本号
#撤销前面的某个提交,再最后生成新的提交
git revert 版本号
| 参数 | 提交 (commit) | 暂存区 (index) | 工作区 (本地文件) | 常用场景 |
|---|---|---|---|---|
--soft |
✅撤销 commit | 🟢保留不变 | 🟢保留不变 | 只想撤销 commit,代码还在暂存区,可以重新 commit |
--mixed(默认不加参数就是这个) |
✅撤销 commit | ✅清空暂存区 | 🟢保留不变 | 撤销 commit,代码退回工作区,需要重新 add |
--hard |
✅撤销 commit | ✅清空暂存区 | ✅直接删除文件改动 | 危险!彻底丢掉改动,代码完全回到旧版本 |
4. 已经提交到远程
不会删除旧提交,新增一条反向提交抵消错误代码,完整保留全部提交历史,其他人拉取不会冲突。
操作步骤
查看提交日志,找到需要撤回的版本哈希
git log --oneline
示例输出:
35f0a82 将springboot完整模块提交到仓库 (错误提交,需要撤销)
9524be9 Day13
撤销最近 1 次推送的提交
# 撤销最新一次提交,弹出编辑框填写撤回备注
git revert HEAD
# 不想编辑备注直接执行
git revert HEAD --no-edit
如果要撤回指定某一条旧提交:
git revert 35f0a82
正常推送到远程即可(普通 push,不需要强制)
git push origin master
5. 删除文件两种方式
# 删除文件并加入暂存
git rm Test.java
git commit -m "删除文件"
# 仅本地删掉,Git不追踪删除
rm Test.java
cherry-pick

中文乱码解决方案
场景1:gitk、终端查看中文文件名/注释乱码
# 全局设置Git编码为UTF-8
git config --global gui.encoding utf-8
git config --global core.quotepath false
场景2:代码文件内中文乱码
IDE(IDEA/Eclipse)全局编码统一设置为 UTF-8,文件编码和Git编码一致即可。
场景3:Windows换行符LF/CRLF警告
# 自动适配系统换行,消除警告
git config --global core.autocrlf true
分支基础
# 查看本地分支
git branch
# 创建分支
git branch dev
# 切换分支
git checkout dev
# 创建并直接切换分支
git checkout -b dev
# 合并分支:在master分支合并dev分支代码
git checkout master
git merge dev
# 删除本地分支
git branch -d dev

拉取远程代码 & 解决推送被拒绝
你之前反复推送失败就是远程存在本地没有的提交,规范流程:
# 拉取远程最新代码并合并
git pull origin master
# 等价拆分写法:拉取远程版本 + 手动合并
git fetch origin master
git merge origin/master
标准推送顺序: git pull → git add . → git commit → git push
远程仓库管理
# 查看绑定的远程仓库地址
git remote -v
# 更换远程仓库地址
git remote set-url origin 新仓库地址
# 删除远程绑定
git remote remove origin
补充实用小命令
- 对比文件改动
# 对比工作区和暂存区差异
git diff
# 对比暂存区和本地仓库差异
git diff --cached
- 储藏临时改动(切分支前不想提交代码时使用)
git stash # 储藏当前所有修改
git stash pop # 恢复储藏的代码
- 放弃所有本地改动,完全同步远程
git fetch origin
git reset --hard origin/master

Git merge(合并) vs Git rebase(变基)
核心定义
1. merge 合并
将两个完整分支的提交节点融合,新增一条「合并提交」,完整保留两条分支原本的提交历史,历史分叉结构完全保留。
2. rebase 变基
把当前分支所有提交剪切下来,移动到目标分支最新节点后方重新依次粘贴,提交历史变成一条直线,消除分叉。
图示演变
假设初始状态:
A -- B -- C (master)
\
D -- E (dev)
① git merge master(在 dev 分支执行合并)
A -- B -- C ------ F (merge合并提交)
\ /
D -- E
- 新增提交
F,专门用来合并两边代码 - 历史存在分叉,可以清晰看出哪些提交来自哪个分支
② git rebase master(在 dev 分支变基)
A -- B -- C -- D' -- E' (dev)
- 把 D、E 重新嫁接在 C 之后,提交编号变为 D’、E’(哈希值改变)
- 整条历史线性无分叉,看起来像是顺着主线开发
详细区别对比
| 特性 | merge 合并 | rebase 变基 |
|---|---|---|
| 提交历史 | 保留分叉,历史完整可追溯 | 抹平分叉,历史变成一条直线 |
| 是否新增提交 | 冲突解决后生成单独合并commit | 不会新增合并提交 |
| commit哈希 | 所有原有commit哈希不变 | 被移动的commit哈希会全部改变 |
| 安全程度 | 安全,不会改写已有提交 | 改写历史,公共分支严禁使用 |
| 冲突处理 | 冲突只产生在合并节点 | 遇到一次冲突就要解决一次,分段处理 |
| 适用场景 | 多人协作主分支、上线分支 | 个人本地分支整理提交、美化历史 |
各自优缺点
merge
✅ 优点
- 不会修改任何已有提交,安全稳定;
- 分叉历史清晰,日后追溯代码来源十分方便;
- 冲突只集中处理一次。
❌ 缺点
- 长期多人协作后,提交树杂乱分叉繁多;
- 大量合并提交污染主干日志。
rebase
✅ 优点
- 提交历史干净线性,整洁美观;
- 不会产生多余的合并提交。
❌ 缺点
- 改写提交哈希,如果分支已经推送到远程公共仓库,强制推送会造成团队代码错乱;
- 一连串提交依次变基时,每遇到一次冲突就要停下来解决,流程繁琐。
使用场景(行业规范)
什么时候用 merge
- master / main 主分支、线上分支:必须只用
merge,绝对禁止 rebase; - 功能分支开发完成,合并进主干,保留完整开发轨迹;
- 多人共享分支协同开发。
什么时候用 rebase
- 只在自己本地私有分支使用,分支还没有 push 到远程;
- 拉取主干最新代码,变基整理本地提交,避免主干出现大量分叉;
- 整合、压缩本地零散 commit(
rebase -i交互式变基)。
配套常用命令示例
merge 用法
# 切换到目标分支
git checkout master
# 把dev分支合并进来
git merge dev
# 冲突解决后提交即可
git add .
git commit -m "merge dev功能分支"
rebase 用法
# 在dev分支,把master最新代码变基到自己分支前面
git checkout dev
git rebase master
# 中途出现冲突,解决后继续变基
git add .
git rebase --continue
# 中途想放弃变基
git rebase --abort
| 对比项 | git merge | git rebase(变基) |
|---|---|---|
| 原理 | 三方合并,新增一个合并提交,两边历史全部保留 | 把当前分支提交复制一份,重新播放到目标分支顶端,重写历史,无合并提交CSDN博… |
| commit hash | 原有提交 hash 不变,只新增 1 个合并节点 | 旧提交废弃,全部生成全新 hash |
| 提交历史 | 保留分叉,可以看清分支什么时候从哪里分开;历史真实 | 变成一条干净直线,看不到分叉;历史是 “改写后的假象”CSDN博… |
| 冲突处理 | 一次性解决全部冲突,解决完 git add → git commit | 逐个提交依次解决冲突,解决完 git add → git rebase --continue;想放弃:git rebase --abort |
| 安全性 | 安全,不修改旧提交,公共分支随便用 | 危险!重写历史;禁止对已经推送到远程、多人共享的分支执行 rebaseCSDN博… |
| 适用场景 | 公共主分支 master/main/develop,团队正式合并 PR/MR | 仅本地个人未推送的 feature 分支,用来同步主分支最新代码,整理提交历史 |
避坑总结
- 不要在子文件夹内部执行
git init/ git提交,一个项目只允许根目录存在一个.git,否则会出现两套仓库互相隔离(你之前springboot文件夹看不到就是这个问题)。 .gitignore写完后,如果文件已经被追踪,必须执行git rm --cached才能生效。- 多人协作禁止随便使用
git push -f强制推送,会覆盖别人的提交。 - 每次推送远程前,优先
git pull拉最新代码,避免rejected (fetch first)推送拒绝。
需要我把这份笔记整理成纯 Typora MD 无排版版本,方便你直接复制粘贴吗?