git
一、git概述
git是一个版本控制工具,可以在开发中帮助开发者管理代码的变更、回溯版本历史、实现多人协作等。
1.1 集中式与分布式
| 特性 | 集中式(如 SVN、CVS) | 分布式(如 Git、Mercurial) |
|---|---|---|
| 代码存储位置 | 所有历史版本仅存于中央服务器 | 每个开发者本地都有完整仓库副本(含全部历史、分支、标签) |
| 工作依赖网络 | 必须联网才能提交、查看历史、创建分支等 | 可完全离线工作:提交、分支、合并、回滚均在本地完成 |
| 数据安全性 | 中央服务器宕机或磁盘损坏 → 可能永久丢失全部历史 | 即使主服务器损毁,任意一个开发者的本地仓库都可恢复整个项目历史 |
| 协作方式 | 所有操作围绕中央服务器进行 | 开发者之间可直接交换变更(如 git pull 别人仓库),不强制依赖单一中心 |
1.2 git用途
- 记录历史:保存每次代码修改的完整记录(谁、何时、改了什么)。
- 版本回退:一键恢复到任意之前的版本,不怕改错。
- 分支开发:在独立分支上安全地开发新功能或修复 Bug,不影响主代码。
- 多人协作:通过远程仓库(如 GitHub)高效共享和合并代码。
- 本地完整备份:每个开发者都拥有全部历史,离线也能提交、回溯。
一句话总结:Git 让代码变更可追踪、可回滚、可协作、更安全。
1.3 仓库结构与状态

- 仓库结构:
- 工作区:位置在你的项目根目录,你直接能看到和编辑的文件
- 暂存区(Index) :是一个中间区域,通过git add将工作区的修改"挑选"出来,放入暂存区。下次提交会提交暂存区的内容。
- 本地仓库:开发人员自己电脑上的Git仓库。
- 远程仓库:远程服务器上的 Git 仓库。
- 四种状态:
- 未跟踪 (Untracked):新文件,Git 未管理
- 已修改 (Modified):已修改但未暂存
- 已暂存 (Staged):已添加到暂存区,准备提交
- 未修改 (Unmodified):已提交,与最新版本一致
| 状态 | 所在区域 | 说明 |
|---|---|---|
| 未跟踪(Untracked) | 工作区 | 新建文件,从未被 git add |
| 已修改(Modified) | 工作区 | 跟踪过的文件被修改了,但未暂存 |
| 已暂存(Staged) | 暂存区 | 已 git add,准备提交 |
| 已提交(Committed) | 本地仓库区 | 已 git commit,安全保存到历史中 |

二、Git下载安装与配置
2.1下载安装
官网链接:Git - Install 自行下载安装
在任意目录右键(点击显示更多选项),看到以下内容就代表安装成功:
- Git GUI Here:打开 Git 图形界面。
- Git Bash Here:打开 Git 命令行。
2.2配置
基础用户配置(重要:这会记录在每次提交中)
bash
git config --global user.name "你的姓名" git config --global user.email "你的邮箱@example.com"
查看所有配置
bash
git config --list
三、基本操作(按最基本工作流程)
目标 :完成一次完整的代码修改 → 提交 → 推送流程
前提 :已安装 Git 并配置好 user.name 和 user.email

1. 获取代码仓库
情况一:已有远程项目(如 GitHub 上的仓库)
bash
git clone https://github.com/用户名/项目名.git
cd 项目名
这是最常见的开始方式,会自动创建本地仓库并关联远程。
情况二:新建本地项目
在选好的本地文件夹输入这个命令,可以在那里建立一个本地git仓库,
初始化当前目录为仓库,初始化后会自动将当前仓库设置为master
bash
# 初始化 Git 仓库
git init
可以配合mkdir和cd使用
bash
# 创建项目目录
mkdir 项目文件夹名
cd 项目文件夹名
加到暂存区:git add
把新建文件添加到暂存区
bash
# 添加特定文件
git add 文件名
# 添加所有变化(包括新文件和修改)
git add .
提交:git commit -m "本次提交的描述信息"
使用git commit命令为其添加修改的描述信息,这样就从暂存区提交到了本地仓库
bash
# 基础提交
git commit -m "feat: 添加用户登录功能"
# 修改上一次提交(未推送时)
git commit --amend
链接远程仓库:git remote add origin 你的仓库链接
关联你的仓库,一般origin是默认名字,一看就知道是远程仓库
git commit 会为我们生成40位的哈希值,用于作为id,并把刚刚用git add添加到提交缓存区里的文件提交到本地仓库中,便于我们回滚,至此,这个文件就已经添加到本地仓库中了,同时本地仓库也迭代了一个版本。
推送到远程仓库:git push origin master
推送你master分支上的内容过去,第一次要输入git push -u origin master
加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令
就是说当你第一次用了-u参数后,本地和远程会创建同名分支(如master),本地的master和远程origin的master分支关联起来。以后直接git push即可,此时git push就相当于git push origin master了
拉取远程仓库:git pull
git pull命令的作用是从远程仓库获取最新版本并合并到本地仓库。
bash
git pull 远程仓库简称 分支名称
注:不要在未提交的修改上直接pull!!!会把你工作区的东西覆盖掉
拉取远程分支:git fetch
bash
git fetch 远程仓库简称
git pull和git fetch的区别
基本定义区别
- git fetch:从远程仓库下载最新数据,但不改变本地工作状态
- git pull:从远程仓库下载并合并最新数据到当前分支
更准确地说:
git pull = git fetch + git merge(默认行为)
scss
远程仓库 (GitHub/服务器)
↓ fetch (只下载)
本地远程跟踪分支 (origin/main)
↓ merge/rebase (整合)
本地当前分支 (main)
Pull 实际上是两个命令的组合:
bash
# git pull = git fetch + git merge
git fetch origin main
git merge origin/main
git fetch可以安全地查看远程仓库的更新
bash
# 想看看别人提交了什么,但不影响当前工作区
git fetch origin
# 查看具体的更新内容
git log origin/main --oneline -5
git show origin/main --stat
# 决定是否合并
git merge origin/main
四、其他常用命令(关于仓库与版本)
1、仓库基本信息查询
| 命令 | 具体作用 | 示例 | 输出说明 |
|---|---|---|---|
git remote -v |
查看远程仓库名称与 URL(fetch/push 地址) | git remote -v |
origin https://github.com/user/repo.git (fetch) origin https://github.com/user/repo.git (push) |
git remote show origin |
查看远程仓库详细信息(分支、HEAD、跟踪状态) | git remote show origin |
显示远程有哪些分支、本地哪些分支已跟踪等 |
git branch -r |
仅列出远程分支(如 origin/main) |
git branch -r |
origin/dev origin/main |
git branch -a |
列出所有本地 + 远程分支 | git branch -a |
* main remotes/origin/main |
- 提示:若远程分支未显示,先执行
git fetch --all
2、提交历史查看(Log)
| 命令 | 作用 | 示例 | 说明 |
|---|---|---|---|
git log |
完整提交历史(含 author, date, commit ID, message) | git log |
按时间倒序显示,按 q 退出 |
git log --oneline |
单行简洁格式(7位 commit ID + message) | git log --oneline -5 |
显示最近 5 条: a1b2c3d fix: 登录按钮样式 |
git log --graph --all --oneline |
图形化显示所有分支合并历史 | git log --graph --all --oneline |
可见分支分叉与合并线 |
git log --author="张三" |
查看某人提交记录 | git log --author="zhangsan" --oneline |
支持邮箱或姓名 |
git log --since="2025-01-01" |
查看某日期之后的提交 | git log --since="1 week ago" |
支持自然语言 |
git log -p -2 |
显示最近 2 次提交的完整代码差异 | git log -p -2 |
-p = patch,显示 diff 内容 |
3、版本穿梭与回退(Reset / Checkout / Revert)
3.1 git checkout(只读切换,不改变历史)
bash
# 临时切换到某次提交(进入 "Detached HEAD" 状态)
git checkout a1b2c3d
# 切换到远程分支的最新状态(只读)
git checkout origin/main
⚠️ 此时不能直接提交!如需基于此创建新分支:
git checkout -b new-feature a1b2c3d
3.2 git reset(修改提交历史,慎用!)
| 命令 | 作用 | 是否丢弃工作区? | 典型场景 |
|---|---|---|---|
git reset --soft HEAD~1 |
回退 1 次提交,保留暂存区和工作区 | ❌ 否 | 撤销提交但保留代码,重新编辑提交信息 |
git reset --mixed HEAD~1 |
回退 1 次提交,清空暂存区,保留工作区(默认) | ❌ 否 | 修改提交内容后重新 add |
git reset --hard HEAD~1 |
彻底删除最近 1 次提交及所有修改 | ✅ 是 | 误提交敏感信息,需彻底清除 |
💡 HEAD~1 = 上一次提交,HEAD~2 = 上上次,HEAD@{2} = reflog 中第 2 条
3.3 git revert(安全回退,新增反向提交)
bash
# 创建一个新提交,撤销指定 commit 的变更(不改历史)
git revert a1b2c3d
推荐用于已推送的公共分支,避免重写历史
四、标签管理(Tag)------ 用于版本发布
| 命令 | 作用 | 示例 |
|---|---|---|
git tag |
列出所有标签(按字母排序) | git tag → v1.0.0 v1.1.0 |
git tag -l "v1.*" |
模糊匹配标签 | git tag -l "v2.*" |
git tag v1.2.0 |
创建轻量标签(仅指向 commit) | git tag v1.2.0 |
git tag -a v1.2.0 -m "正式发布 v1.2" |
创建带注解标签(含作者、日期、消息) | ✅ 推荐方式 |
git show v1.2.0 |
查看标签详情(含对应 commit 和 diff) | git show v1.2.0 |
git push origin v1.2.0 |
推送单个标签 | git push origin v1.2.0 |
git push origin --tags |
推送所有本地标签 | git push origin --tags |
git tag -d v1.2.0 |
删除本地标签 | git tag -d v1.2.0 |
git push origin :refs/tags/v1.2.0 |
删除远程标签 | ⚠️ 注意冒号语法 |
五、引用日志(Reflog)------ "后悔药"
bash
# 查看 HEAD 移动历史(包括 reset、checkout、merge 等操作)
git reflog
输出示例:
text
a1b2c3d HEAD@{0}: reset: moving to HEAD~1
b2c3d4e HEAD@{1}: commit: feat: add user login
c3d4e5f HEAD@{2}: checkout: moving from dev to main
💡 救命场景 : 误执行 git reset --hard 后,用 git reflog 找到之前的 commit ID,再:
bash
git reset --hard b2c3d4e # 恢复到丢失的提交
六、差异比较(Diff)
| 命令 | 比较范围 | 说明 |
|---|---|---|
git diff |
工作区 vs 暂存区 | 查看未暂存的修改 |
git diff --staged |
暂存区 vs 最近提交(HEAD) | 查看即将提交的内容 |
git diff HEAD |
工作区 vs HEAD | 所有本地修改(无论是否暂存) |
git diff main..dev |
分支 main 与 dev 的差异 |
等价于 git diff main dev |
git diff a1b2c3d..b2c3d4e |
两个 commit 之间的差异 | 可省略 .. |
git diff --name-only |
仅显示文件名(不显示内容) | 适合快速扫描改动范围 |
实战示例:
bash
# 查看本次修改了哪些文件
git diff --name-only
# 确认即将提交的内容是否正确
git diff --staged
七、其他高价值命令
| 命令 | 作用 | 示例 |
|---|---|---|
git shortlog -sn |
统计贡献者提交次数 | git shortlog -sn → 15 张三 8 李四 |
git describe |
生成人类可读的版本号(基于最近标签) | git describe → v1.2.0-3-ga1b2c3d (表示 v1.2.0 后第 3 次提交) |
git archive --format=zip -o v1.2.0.zip v1.2.0 |
打包指定版本为 zip(不含 .git) | 用于发布源码包 |
git ls-files |
列出 Git 跟踪的所有文件 | git ls-files '*.js' → 所有 JS 文件 |
总结:关键命令速查表(最常用)
| 场景 | 命令 |
|---|---|
| 查看远程地址 | git remote -v |
| 查看简洁提交历史 | git log --oneline -10 |
| 安全回退一次提交(保留代码) | git reset --soft HEAD~1 |
| 彻底找回"消失"的提交 | git reflog → git reset --hard <ID> |
| 创建带注释的版本标签 | git tag -a v2.0.0 -m "Release" |
| 推送所有标签 | git push origin --tags |
| 查看即将提交的内容 | git diff --staged |
五、分支管理操作
查看所有分支
bash
git branch -av
创建新分支
bash
git branch 分支名
切换分支
bash
git checkout 分支名
删除已合并分支
bash
git branch -d 分支名
强制删除分支
bash
git branch -D 分支名
重命名分支
bash
git branch -m 新分支名
合并分支
当我们新建分支并做完工作之后,要把分支提交至master,就切换到master仓,并执行git merge:
bash
git merge 分支名
六、团队开发建议与规范
一、分支策略模型
推荐模型:简化 Git Flow(适合大多数团队)
text
main(或 master) ← 稳定生产环境
│
├── develop ← 集成测试环境
│
├── feature/* ← 功能开发(如 feature/user-login)
├── release/v1.2.0 ← 发布准备(冻结新功能,只修 Bug)
└── hotfix/* ← 紧急线上修复(直接从 main 拉出)
规范要求:
main/develop分支受保护(禁止直接 push)- 所有功能必须通过 Pull Request / Merge Request 合并
- 分支命名统一前缀(见下表)
| 分支类型 | 命名规范 | 生命周期 |
|---|---|---|
| 功能分支 | feature/描述(如 feature/payment) |
开发完成即删 |
| 修复分支 | fix/问题简述(如 fix/login-bug) |
合并后删除 |
| 发布分支 | release/vX.Y.Z |
发布后合并到 main 和 develop |
| 热修分支 | hotfix/紧急问题 |
修复后立即合并到 main 和 develop |
二、提交规范(Commit Message)
常用 type:
feat: 新功能fix: 修复 Bugdocs: 文档更新style: 格式调整(不影响逻辑)refactor: 重构test: 测试相关chore: 构建/依赖更新
示例:
bash
git commit -m "feat(auth): add SMS login support"
git commit -m "fix(order): resolve timeout on payment page"
三、代码审查Pull Request 标准流程
1、创建功能分支
bash
git checkout -b 分支名 #分支名最好写:类型/描述
2、开发并提交
bash
git add .
git commit -m "feat: 实现用户登录基础功能"
git push origin 分支名 #分支名最好写:类型/描述
3、创建 Pull Request ,在 GitHub 页面创建 PR并填写清晰的标题和描述,关联相关 Issue,让团队进行审查合并。
4、合并与清理
bash
# 合并后删除远程分支
git push origin --delete 分支名 #分支名最好写:类型/描述
# 清理本地分支
git branch -d 分支名 #分支名最好写:类型/描述
# 更新本地 main 分支
git checkout main
git pull origin main
日常开发工作流程
bash
# 开始干活
git checkout main
git pull origin main
git branch 分支名 #分支名最好写:<类型>/<简短描述>
git checkout 分支名 #分支名最好写:<类型>/<简短描述>
# 干活...
git add .
git commit -m "feat: 完成某个模块"
# 同步远程更新
git fetch origin
git rebase origin/main # 或 git merge origin/main
# 干完活推送
git push origin 分支名 #分支名最好写:<类型>/<简短描述>
注:不要在未提交的修改上直接pull!!!