《 Git 详细教程 》

一、Git 基础配置(首次使用必做)

1.1 安装 Git

  • Windows:官网下载安装包,安装时默认选项即可。
  • Macbrew install git
  • Linux(Ubuntu)sudo apt install git

1.2 配置用户名和邮箱(全局)

bash 复制代码
# 设置用户名
git config --global user.name "你的名字"
# 设置邮箱
git config --global user.email "你的邮箱@example.com"
# 查看所有配置
git config --global --list
  • 不加 --global 仅对当前仓库生效。

1.3 配置别名(可选,提高效率)

bash 复制代码
# 例如:git st 代替 git status
git config --global alias.st status
# 例如:git ci 代替 git commit
git config --global alias.ci commit

二、仓库创建与克隆

2.1 初始化本地仓库

bash 复制代码
# 在当前目录创建 .git 文件夹
git init
# 在指定目录初始化
git init my-project

2.2 克隆远程仓库

bash 复制代码
# 克隆整个仓库
git clone https://github.com/xxx/xxx-repo.git
# 克隆指定分支
git clone -b dev https://github.com/xxx/xxx-repo.git
# 浅克隆(只拉取最近1次提交,速度快)
git clone --depth 1 https://github.com/xxx/xxx-repo.git

三、本地日常操作(核心常用)

3.1 查看状态

bash 复制代码
# 查看工作区、暂存区状态
git status
# 简洁模式
git status -s

3.2 添加到暂存区

bash 复制代码
# 添加单个文件
git add README.md
# 添加所有文件
git add .
# 添加指定目录
git add src/
# 交互式添加(选择部分修改)
git add -p

3.3 提交到本地仓库

bash 复制代码
# 提交并写备注(常用)
git commit -m "feat: 新增用户登录功能"
# 提交时修改上一次提交(合并到上一个提交)
git commit --amend -m "fix: 修复登录bug"
# 跳过代码检查钩子(不推荐)
git commit --no-verify -m "临时提交"

3.4 撤销操作

(1)撤销工作区修改(未暂存)

bash 复制代码
# 撤销单个文件
git restore README.md
# 撤销所有文件
git restore .

(2)撤销暂存区(已 add,未 commit)

bash 复制代码
# 撤销单个文件暂存
git restore --staged README.md
# 等价旧命令:git reset HEAD README.md

(3)撤销提交(已 commit,未 push)

bash 复制代码
# 软撤销:保留修改,回到暂存区
git reset --soft HEAD~1
# 硬撤销:彻底删除提交,修改也删除(谨慎)
git reset --hard HEAD~1

3.5 查看提交历史

bash 复制代码
# 完整历史
git log
# 单行简洁显示
git log --oneline
# 图形化显示分支
git log --graph --oneline
# 显示具体修改内容
git log -p
# 查看某个文件的历史
git log README.md

3.6 比较差异

bash 复制代码
# 工作区 vs 暂存区
git diff
# 暂存区 vs 最新提交
git diff --staged
# 工作区 vs 最新提交
git diff HEAD
# 两次提交之间差异
git diff a1b2c3 d4e5f6

3.7 代码回退 / 重置

你只需要记住 3 个核心场景,覆盖 99% 需求:


一、你当前处于哪种情况?

1. 只改了文件,还没 git add

丢弃工作区修改,回到上次提交的干净状态。

bash 复制代码
# 丢弃单个文件
git restore 文件名

# 丢弃所有文件修改(谨慎!)
git restore .

✅ 作用:代码直接回到上一次提交,本地修改全部消失


2. 已经 git add,但还没 git commit

把暂存区的文件撤回来,回到未 add 状态。

bash 复制代码
# 撤销单个文件
git restore --staged 文件名

# 撤销所有文件
git restore --staged .

✅ 作用:文件修改还在,只是从暂存区拿回来。


3. 已经 git commit,但还没 git push(最常用!)

这是真正的版本回退,分三种安全等级:


二、已 commit 未 push:三种回退方式(必看)

① 软回退(最安全,推荐)

保留你的代码,只是撤销提交

bash 复制代码
git reset --soft HEAD~1

✅ 效果:

  • 回到上一个版本
  • 你写的代码全部保留
  • 回到 git add 之后的状态

适合:想重新修改、重新提交


② 混合回退(默认方式)

保留代码,回到未 add 状态

bash 复制代码
git reset HEAD~1
# 等价 git reset --mixed HEAD~1

✅ 效果:

  • 代码保留
  • 回到未 add、未 commit状态

③ 硬回退(危险!会删代码)

彻底回到过去版本,代码直接丢失

bash 复制代码
git reset --hard HEAD~1

⚠️ 警告:

  • 当前所有修改全部消失
  • 再也找不回来(除非用 reflog)

适合:我就是要彻底扔掉这次提交


三、回退到「指定历史版本」(不是只回退 1 次)

  1. 先看历史版本号
bash 复制代码
git log --oneline

会出现:

复制代码
a1b2c3d 这次提交我想回退
d4e5f6g 上一个正常版本
  1. 回退到 d4e5f6g
bash 复制代码
git reset --hard d4e5f6g

四、已经 push 到远程了,怎么回退?

分两种:

① 安全方式(推荐)

bash 复制代码
git revert 要撤销的commitID

✅ 不会破坏别人代码,只是新增一个"撤销提交"

② 强制覆盖(危险!团队慎用)

bash 复制代码
git reset --hard 版本号
git push -f

⚠️ 会覆盖远程仓库,团队项目千万别乱用


五、最常用的 5 条命令(背会就够)

bash 复制代码
# 1. 丢弃工作区修改(未add)
git restore .

# 2. 撤销add(已add未commit)
git restore --staged .

# 3. 撤销上一次commit,保留代码(最常用)
git reset --soft HEAD~1

# 4. 回退到历史版本(保留代码)
git reset 版本号

# 5. 彻底回退版本(删除代码,谨慎)
git reset --hard 版本号

四、分支管理(团队协作核心)

4.1 查看分支

bash 复制代码
# 查看本地分支(当前分支前有 *)
git branch
# 查看远程分支
git branch -r
# 查看所有分支(本地+远程)
git branch -a

4.2 创建与切换分支

bash 复制代码
# 1. 旧方式(checkout)
# 创建分支(不切换)
git branch feature/login
# 创建并切换
git checkout -b feature/login

# 2. 新方式(switch,Git 2.23+ 推荐)
# 切换分支
git switch main
# 创建并切换
git switch -c feature/login

4.3 合并分支

bash 复制代码
# 1. 先切换到主分支(如 main)
git switch main
# 2. 合并目标分支(如 feature/login)
git merge feature/login
  • 合并冲突解决

    1. 冲突文件会标记:
    markdown 复制代码
    <<<<<<< HEAD
    主分支代码
    =======
    功能分支代码
    >>>>>>> feature/login
    1. 手动编辑文件,删除标记,保留正确代码
    2. git add 冲突文件git commit -m "合并分支,解决冲突"

4.4 变基分支(Rebase,保持提交线性)

bash 复制代码
# 1. 切换到功能分支
git switch feature/login
# 2. 变基到 main 分支(将功能分支提交"移植"到 main 最新提交后)
git rebase main
# 冲突解决后继续
git rebase --continue
# 放弃变基
git rebase --abort

# 3. 回到 main 合并(快进合并,无新提交)
git switch main
git merge feature/login

4.5 删除分支

bash 复制代码
# 删除本地已合并分支
git branch -d feature/login
# 强制删除本地未合并分支
git branch -D feature/login
# 删除远程分支
git push origin --delete feature/login

五、远程仓库协作

5.1 管理远程仓库

bash 复制代码
# 查看远程仓库(默认 origin)
git remote
# 查看详细信息(含拉取/推送地址)
git remote -v
# 添加远程仓库(本地关联远程)
git remote add origin https://github.com/xxx/xxx-repo.git
# 修改远程仓库地址
git remote set-url origin https://new-url.git
# 删除远程关联
git remote remove origin

5.2 拉取远程更新

bash 复制代码
# 拉取并合并远程当前分支(常用)
git pull
# 拉取指定分支
git pull origin main
# 仅拉取不合并(安全,手动合并)
git fetch origin
# 拉取所有远程分支
git fetch --all

5.3 推送本地到远程

bash 复制代码
# 首次推送本地分支到远程(关联)
git push -u origin main
# 后续推送
git push
# 推送指定分支
git push origin feature/login
# 强制推送(谨慎!覆盖远程代码)
git push --force origin main

六、标签管理(版本发布)

bash 复制代码
# 查看所有标签
git tag
# 创建轻量标签(仅标记提交)
git tag v1.0.0
# 创建附注标签(含说明、作者、日期)
git tag -a v1.0.0 -m "正式发布v1.0.0"
# 推送单个标签到远程
git push origin v1.0.0
# 推送所有标签
git push --tags
# 删除本地标签
git tag -d v1.0.0
# 删除远程标签
git push origin --delete v1.0.0

七、高级操作

7.1 cherry-pick(挑选指定提交到当前分支)

bash 复制代码
# 挑选提交 a1b2c3 到当前分支
git cherry-pick a1b2c3
# 冲突解决后继续
git cherry-pick --continue
# 放弃
git cherry-pick --abort

7.2 stash(暂存临时修改,切换分支不丢失)

bash 复制代码
# 暂存所有修改
git stash
# 暂存并加备注
git stash save "临时保存登录功能修改"
# 查看暂存列表
git stash list
# 恢复最新暂存(删除暂存记录)
git stash pop
# 恢复指定暂存(保留暂存记录)
git stash apply stash@{0}
# 删除指定暂存
git stash drop stash@{0}
# 清空所有暂存
git stash clear

7.3 reflog(查看所有操作记录,找回"丢失"提交)

bash 复制代码
# 查看所有提交、切换分支、reset 等记录
git reflog
# 找回误删提交(找到 commit id 后)
git reset --hard a1b2c3

7.4 bisect(二分查找定位bug引入的提交)

bash 复制代码
# 开始查找
git bisect start
# 当前版本有bug
git bisect bad
# 已知正常提交(如 v1.0.0)
git bisect good v1.0.0
# Git 会自动切换中间提交,测试后标记 good/bad
# 找到bug提交后,结束
git bisect reset

八、常见问题解决

8.1 提交后发现用户名/邮箱错误

bash 复制代码
# 修改最近一次提交的用户信息
git commit --amend --author="正确名字 <正确邮箱@example.com>"

8.2 合并/变基冲突无法解决

  • 放弃合并:git merge --abort
  • 放弃变基:git rebase --abort

8.3 本地提交落后远程太多,无法 push

bash 复制代码
# 先拉取远程并合并(解决冲突)
git pull origin main
# 再推送
git push
相关推荐
之歆3 小时前
DAY08_CSS浮动与行内块布局实战指南(下)
前端·css
0xDevNull3 小时前
Linux 中 Nginx 代理 Redis 的详细教程
redis·后端
GetcharZp3 小时前
告别 Nginx 手动配置!这款 Go 语言开发的云原生网关,才是容器化时代的真香神器!
后端
yqcoder3 小时前
CSS Position 全解析:5 种定位模式详解
前端·css
RuoyiOffice3 小时前
SpringBoot+Vue3 企业考勤如何处理法定假期?节假日方案、调休补班与工作日判断链路拆解
spring boot·后端·vue·anti-design-vue·ruoyioffice·假期·人力
Rhi6373 小时前
从零搭建项目:React 19 + Vite 8 + Tailwind CSS v4 实战配置
前端
Vane14 小时前
从零开发一个AI插件,经历了什么?
人工智能·后端
竹林8184 小时前
用Viem替代ethers.js:从一次签名失败到完整迁移的实战记录
前端·javascript
之歆4 小时前
DAY08_CSS浮动与行内块布局实战指南(上)
前端·css