Git的渐进式教学
Git通用教程
零、最快的上手仅需要四步
#0.先拉取云端代码
git clone http://localhost:3000/所属组织/项目名.git
#1.将当前目录下的所有修改添加到暂存区
git add .
#2.将暂存区中的修改提交到本地仓库,并填写本次提交说明
git commit -m "提交信息"
#3.
# 第一次提交使用以下命令绑定云端的main分支(咱们的工作分支):
git push -u origin main # -u: 设置上游分支,绑定本地分支与远程分支的追踪关系
# origin: 远程仓库的默认别名(执行 git clone 时自动把origin和远程仓库连接绑定好了已经,可用git remote -v查看)
# 之后的提交使用以下命令提交就可以了(因为已经绑定过了):
git push
一、Git基础配置
# 首次使用Git需要配置用户信息
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
# 本地项目初始化为Git仓库,自行创建需要,云端拉取项目代码时,一般就不需要初始化了
git init
二、Git的四个工作区域
Git有4个工作区域,理解它们是掌握Git的关键:
工作区(编辑的文件)
| git add .
|-> 暂存区(待提交)
| git commit -m "提交信息"
|-> 本地仓库(提交历史)
| git push origin 分支名
|-> 远程仓库(云端备份)
| 区域 | 说明 | 位置 |
|---|---|---|
| 工作区 | 你编辑的文件目录 | 你的文件夹 |
| 暂存区 | 即将被提交的修改 | .git/index |
| 本地仓库 | 已提交的历史记录 | .git/objects |
| 远程仓库 | 云端备份 | GitHub/GitLab |
三、基本工作流程
完整流程示例
# 1. 编辑文件
echo "hello" > test.txt
# 2. 查看状态(未跟踪)
git status
# Untracked files: test.txt
# 会显示以下几种情况之一:
# 1. 工作区状态
Changes not staged for commit:
modified: file1.txt # 已修改但未暂存
# 2. 暂存区状态
Changes to be committed:
new file: file2.txt # 已暂存,等待提交
# 3. 未跟踪状态
Untracked files:
file3.txt # 工作区新文件,未被Git追踪
# 3. 暂存文件
git add test.txt # 暂存指定文件
git add . # 暂存所有修改
# 4. 提交到本地仓库
git commit -m "添加test.txt"
# 5. 推送到远程main仓库
git push origin main
git push # 已绑定分支时可直接使用
# 查看提交历史 --一行一条记录的简洁格式
git log --oneline
四、分支操作与HEAD指针
4.1 HEAD指针概念
HEAD是Git中的指针,指向当前所在位置。
正常状态:
HEAD → 当前分支的最新提交
例如在main分支:
HEAD → main的最新提交
- HEAD = 在仓库n多版本中你当前的位置(当前指针)
- 分支名 = 该分支最新提交的标签
4.2 分支操作
# 查看所有分支
git branch
# 创建新分支
git branch 分支名
# 切换分支(移动HEAD指针)
git checkout 分支名
# HEAD → 新分支 → 该分支的最新提交
# 创建并切换分支(推荐)
git checkout -b 分支名
# 相当于:git branch 分支名 + git checkout 分支名
# 合并分支
git checkout main # 切换到目标分支
git merge 分支名 # 合并指定分支到当前分支
# 删除分支
git branch -d 分支名
4.3 HEAD指针的应用
# HEAD相对引用
HEAD^ # 上一个提交
HEAD^^ # 上上个提交
HEAD~3 # 第3个祖先提交
# 实际应用
# git checkout HEAD^: 把 HEAD 移动到上一个提交 ,同时尝试让 暂存区和工作区都与上一个提交一致 。
git checkout HEAD^
五、撤销和回退操作
5.1 撤销修改
# 撤销工作区修改(丢弃未暂存的修改)
git restore 文件名
git restore . # 撤销所有修改
# 取消暂存(文件回到工作区,保留修改)
git restore --staged 文件名
git restore --staged . # 取消所有暂存
5.2 回退提交
# 回退到上一个版本,硬重置到上一个提交(工作区、暂存区、本地仓库全部重置,未提交修改将丢失)
git reset --hard HEAD^
# git reset --mixed HEAD^: 混合重置到上一个提交(默认模式,重置暂存区,工作区保留修改)
git reset --mixed HEAD^
# 回退提交,但保留修改在暂存区,软重置到上一个提交(仅移动HEAD指针,暂存区和工作区不变)
git reset --soft HEAD^
# 回退到指定版本
git reset --hard 版本号 # 先用 git log --oneline 查看
5.3 查看差异
# 工作区 vs 暂存区(未暂存的修改)
git diff
# 暂存区 vs 本地仓库(准备提交的修改)
git diff --staged
# 工作区 vs 本地仓库(所有修改)
git diff HEAD
六、拉取和合并
6.1 拉取更新
# 拉取并合并到工作区
git pull origin 分支名
git pull # 已绑定分支时
# 只拉取到本地仓库(不合并)
git fetch origin
git fetch --all # 所有远程分支
6.2 fetch vs pull
| 命令 | 作用 | 影响 |
|---|---|---|
git fetch |
只下载,不合并 | 只更新本地仓库 |
git pull |
下载并合并 | 更新工作区+暂存区+本地仓库 |
git pull origin main可以分解为:
远程仓库
│ git fetch origin # 1. 获取远程分支(不合并),是一个本地分支,指向远程分支的最新提交
↓
本地保存的 origin/main
│ git log HEAD..origin/main # 2. 在这时可以选择查看差异,比较本地分支和远程分支,查看有哪些远程提交
│ git merge origin/main # 3. 确认无误后,合并远程分支到本地分支
↓
更新当前本地分支(工作区和暂存区更新为合并后的结果) # 如果本地和远程各自有新提交,可能产生合并提交:
C ───────┐
/ \
A ── B M
\ /
D ───────┘
七、解决冲突
当多人修改同一文件时产生冲突:
- 拉取代码时提示冲突
- 打开冲突文件,找到标记:
<<<<<<< HEAD 你的修改 ======= 别人的修改 >>>>>>> 分支名 - 手动修改,保留需要的内容
- 标记冲突已解决:
git add 文件名 git commit -m "解决冲突" git push
八、实用技巧
# 暂存当前工作
git stash # 临时保存修改
# 这里可以插入git pull origin main命令,拉取最新代码,不符合心意,再执行git stash pop命令,恢复暂存的工作
git stash pop # 恢复暂存的工作
# 查看远程仓库地址
git remote -v
# 交互式暂存(选择部分修改)
git add -p
# 从暂存区中移除文件追踪(保留本地文件),常用于将已追踪的文件加入.gitignore后取消暂存区已存在的追踪
git rm --cached 文件名
# 清除未跟踪的文件
git clean -n # 预览
git clean -fd # 执行
九、三种主要工作流程
流程一:简单使用——拉取、修改、提交
适合个人开发,或者已经确定直接在当前分支工作的情况。
# 1. 切换到主分支
git checkout main
# 2. 从云端拉取最新代码,并合并到当前分支
git pull origin main
# 3. 修改代码并测试
--
# 4. 查看修改状态
git status
# 5. 查看准备提交的具体内容
git diff
# 6. 将修改放入暂存区
git add .
# 7. 再次检查暂存区内容
git diff --staged
# 8. 提交到本地仓库
git commit -m "说明本次修改"
# 9. 推送到云端
git push origin main
流程方向:
云端远程仓库 ──pull──> 本地main分支和工作区
工作区 ──add──> 暂存区 ──commit──> 本地仓库 ──push──> 云端远程仓库
流程二:使用stash和pop,预览后决定是否保留
适合当前有未提交修改,但需要先拉取云端代码的情况。git stash先保存当前修改,git stash pop再恢复修改。
# 1. 查看当前修改
git status
git diff
# 2. 临时保存当前修改,让工作区变干净
git stash push -m "暂存当前修改"
# 3. 拉取云端最新代码
git pull origin main
# 4. 恢复之前暂存的修改
# pop会恢复修改,并在恢复成功后删除对应的stash记录
git stash pop
# 5. 检查合并后的代码并进行测试
git status
git diff
# 6A. 如果满意,正常提交
git add .
git commit -m "说明本次修改"
git push origin main
# 6B. 如果不满意,撤销刚恢复到工作区的修改
# 注意:这会丢弃当前工作区中未提交的修改,请确认没有其他需要保留的内容
git restore .
更安全的预览方式是使用 apply,因为它不会删除stash记录:
git stash
git pull origin main
git stash apply
# 预览并测试,不满意时清理工作区
git restore .
# 确认满意后,再删除已经用过的stash记录
git stash list
git stash drop stash@{0}
如果 stash pop 或 stash apply 产生冲突,应先解决冲突;不需要这些修改时,可以使用 git restore . 放弃未提交的修改。
流程三:从云端主分支创建本地分支,审查后合并
适合团队协作。主分支只保持稳定代码,开发和审查在新分支中进行。
# 1. 切换到本地主分支
git checkout main
# 2. 拉取云端主分支最新代码
git pull origin main
# 3. 从最新的main创建并切换到本地开发分支
git checkout -b feature-xxx
# 4. 在feature-xxx分支中开发和测试
--
# 5. 查看修改并提交到本地仓库
git status
git add .
git diff --staged
git commit -m "添加功能xxx"
# 6. 将开发分支推送到云端
git push -u origin feature-xxx
# 7. 在代码托管平台发起合并请求,进行代码审查
# 审查通过后,也可以在本地执行以下合并操作:
# 8. 回到本地主分支,并再次同步云端main
git checkout main
git pull origin main
# 9. 将开发分支合并到本地main
git merge feature-xxx
# 10. 推送合并后的main到云端
git push origin main
# 11. 合并完成后删除本地开发分支(可选)
git branch -d feature-xxx
流程方向:
云端main ──pull──> 本地main
本地main ──checkout -b──> 本地feature-xxx
本地feature-xxx ──push──> 云端feature-xxx
云端feature-xxx ──审查/合并──> 云端main
本地feature-xxx ──merge──> 本地main ──push──> 云端main
三种流程的选择:
| 流程 | 适用场景 | 核心特点 |
|---|---|---|
| 流程一 | 简单个人开发 | 直接在当前分支完成拉取、提交和推送 |
| 流程二 | 有未提交修改,需要先同步代码 | 用stash临时保存,恢复后检查,不满意可以撤销 |
| 流程三 | 团队协作和代码审查 | 新建开发分支,审查通过后合并到main |
十、注意事项
- 提交前先
git pull获取最新代码,减少冲突 - 提交信息要简洁明了,说明做了什么
- 不要提交敏感信息(密码、密钥等)
- 定期推送代码到远程,避免代码丢失
- 使用
git status随时查看当前状态
Git核心概念详解
Git的四个工作区域
Git 有 4个工作区域,理解它们是掌握Git的关键:
区域概览图
正向流程(提交代码):
================================================================================
工作区 ──git add──> 暂存区 ──git commit──> 本地仓库 ──git push──> 远程仓库
(Working) (Stage) (Local) (Remote)
反向流程(撤销/拉取):
================================================================================
远程仓库 ──git pull──> 工作区(拉取并合并)
│
├──git fetch──> 本地仓库(只拉取不合并)
└──git merge──> 工作区 + 暂存区
本地仓库 ──git reset --hard──> 工作区(完全重置)
│
├──git reset --soft──> 暂存区(保留修改在暂存区)
└──git restore──> 工作区(恢复文件)
暂存区 ──git restore --staged──> 工作区(取消暂存)
四个区域详解
| 区域 | 说明 | 状态 | 可见性 | 位置 |
|---|---|---|---|---|
| 工作区 | 你编辑的文件目录 | 已修改 | 可见 | 你的文件夹 |
| 暂存区 | 即将被提交的修改 | 已暂存 | 不可见 | .git/index |
| 本地仓库 | 已提交的历史记录 | 已提交 | 不可见 | .git/objects |
| 远程仓库 | 云端备份 | 已推送 | 可见 | GitHub/GitLab |
各区域含义
-
工作区(Working Directory)
- 你看到的实际文件目录
- 你编辑代码的地方
- 未被Git追踪的文件在这里
- 状态:已修改
-
暂存区(Staging Area)
- 即将被提交的修改
- 使用
git add后文件进入这里 - 也叫"索引"(Index)
- 状态:已暂存
-
本地仓库(Local Repository)
- 已提交的历史记录
- 使用
git commit后保存到这里 - 包含所有提交历史
- 状态:已提交
-
远程仓库(Remote Repository)
- 云端备份
- GitHub、GitLab等服务器上的仓库
- 使用
git push上传 - 状态:已推送
区域间操作命令(精确流向)
正向操作(提交代码):
| 起点 | 终点 | 命令 | 说明 |
|---|---|---|---|
| 工作区 | 暂存区 | git add 文件名 |
暂存指定文件 |
| 工作区 | 暂存区 | git add . |
暂存所有修改 |
| 暂存区 | 本地仓库 | git commit -m "信息" |
提交到本地 |
| 本地仓库 | 远程仓库 | git push origin 分支 |
推送到远程 |
反向操作(撤销/拉取):
| 起点 | 终点 | 命令 | 说明 |
|---|---|---|---|
| 远程仓库 | 工作区 | git pull |
拉取并合并到工作区 |
| 远程仓库 | 本地仓库 | git fetch |
只拉取到本地仓库(不合并) |
| 本地仓库 | 工作区 | git restore 文件名 |
从本地仓库恢复文件 |
| 本地仓库 | 工作区 | git reset --hard HEAD^ |
完全重置到上一版本 |
| 本地仓库 | 暂存区 | git reset --soft HEAD^ |
回退提交,修改保留在暂存区 |
| 暂存区 | 工作区 | git restore --staged 文件名 |
取消暂存 |
查看差异命令
# 工作区 vs 暂存区(查看未暂存的修改)
git diff
# 暂存区 vs 本地仓库(查看已暂存,准备提交的修改)
git diff --staged
# 工作区 vs 本地仓库(查看所有修改)
git diff HEAD
文件状态变化图
未跟踪 ──git add──> 已暂存 ──git commit──> 已提交 ──git push──> 已推送
│ │ │ │
└── 编辑文件 ──> 已修改 ──git add──> 已暂存 ───────────────────┘
实际操作流程
# 1. 编辑文件(工作区)
echo "hello" > test.txt
# 2. 查看状态(未跟踪)
git status
# Untracked files: test.txt
# 3. 暂存文件(进入暂存区)
git add test.txt
# 4. 再次查看状态(已暂存)
git status
# Changes to be committed: new file: test.txt
git status
# 会显示:
# 1. 工作区状态
Changes not staged for commit:
modified: file1.txt # 已修改但未暂存
# 2. 暂存区状态
Changes to be committed:
new file: file2.txt # 已暂存,等待提交
# 3. 未跟踪状态
Untracked files:
file3.txt # 工作区新文件,未被Git追踪
# 5. 提交到本地仓库
git commit -m "添加test.txt"
# 6. 推送到远程仓库
git push origin main
核心理解
- 工作区 = 你的文件夹(可见的文件)
- 暂存区 = 准备提交的清单(不可见,存在.git中)
- 本地仓库 = 你的提交历史(存在.git中)
- 远程仓库 = 云端备份(GitHub等)
为什么要暂存区?
- 可以选择性提交,不必一次性提交所有修改
- 可以修改提交内容,在提交前再次检查
关键区别:
git pull= 拉取远程更新直接合并到工作区git fetch= 只拉取到本地仓库,不合并到工作区git restore --staged= 取消暂存,文件回到工作区(保留修改)git restore= 从本地仓库恢复文件,丢弃工作区修改

浙公网安备 33010602011771号