Git

# 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缓存上传仓库。

  1. 规则写法示例
# 忽略整个target编译目录(Maven/Gradle)
target/
# 忽略IDE配置文件夹
.idea/
.vscode/
# 忽略日志文件
*.log
# 忽略所有.class字节码文件
*.class
# 忽略本地配置,但保留模板配置
application.properties
!application.properties.template
# 忽略系统生成文件
.DS_Store
Thumbs.db
  1. 注意:已经被Git追踪的文件,写入.gitignore不会自动忽略,需要先取消追踪:
git rm --cached 文件名

Git 三大区域核心模型(重中之重)

三层结构

  1. 工作目录(Working Directory) 本地电脑真实文件夹,正在编辑、修改代码的地方,肉眼可见所有文件。
  2. 暂存区(Stage / Index) 临时中转站,执行 git add 后,修改的文件会存入暂存区,等待统一提交。
  3. 本地仓库(Local Repository) .git 隐藏文件夹,执行 git commit 会把暂存区内容永久生成版本快照保存至此。
  4. 远程仓库(Remote Repository):Gitee/GitHub/GitLab 云端仓库,git push 推送至此。

image-20260804193744149

image-20260820084719295

流转顺序

工作目录修改代码` → `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

image-20260820085322901

中文乱码解决方案

场景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

image-20260820084615385

拉取远程代码 & 解决推送被拒绝

你之前反复推送失败就是远程存在本地没有的提交,规范流程:

# 拉取远程最新代码并合并
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

补充实用小命令

  1. 对比文件改动
# 对比工作区和暂存区差异
git diff
# 对比暂存区和本地仓库差异
git diff --cached
  1. 储藏临时改动(切分支前不想提交代码时使用)
git stash       # 储藏当前所有修改
git stash pop   # 恢复储藏的代码
  1. 放弃所有本地改动,完全同步远程
git fetch origin
git reset --hard origin/master

image-20260820084409844

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

✅ 优点

  1. 不会修改任何已有提交,安全稳定;
  2. 分叉历史清晰,日后追溯代码来源十分方便;
  3. 冲突只集中处理一次。

❌ 缺点

  1. 长期多人协作后,提交树杂乱分叉繁多;
  2. 大量合并提交污染主干日志。

rebase

✅ 优点

  1. 提交历史干净线性,整洁美观;
  2. 不会产生多余的合并提交。

❌ 缺点

  1. 改写提交哈希,如果分支已经推送到远程公共仓库,强制推送会造成团队代码错乱;
  2. 一连串提交依次变基时,每遇到一次冲突就要停下来解决,流程繁琐。

使用场景(行业规范)

什么时候用 merge

  1. master / main 主分支、线上分支:必须只用 merge,绝对禁止 rebase;
  2. 功能分支开发完成,合并进主干,保留完整开发轨迹;
  3. 多人共享分支协同开发。

什么时候用 rebase

  1. 只在自己本地私有分支使用,分支还没有 push 到远程;
  2. 拉取主干最新代码,变基整理本地提交,避免主干出现大量分叉;
  3. 整合、压缩本地零散 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 分支,用来同步主分支最新代码,整理提交历史

避坑总结

  1. 不要在子文件夹内部执行 git init / git提交,一个项目只允许根目录存在一个 .git,否则会出现两套仓库互相隔离(你之前springboot文件夹看不到就是这个问题)。
  2. .gitignore 写完后,如果文件已经被追踪,必须执行 git rm --cached 才能生效。
  3. 多人协作禁止随便使用 git push -f 强制推送,会覆盖别人的提交。
  4. 每次推送远程前,优先 git pull 拉最新代码,避免 rejected (fetch first) 推送拒绝。

需要我把这份笔记整理成纯 Typora MD 无排版版本,方便你直接复制粘贴吗?

上一篇
下一篇