Day 13 - Git 实战练习

今天学完你能做什么

  • 用 Git 管理自己的代码
  • 理解工作区、暂存区、仓库的关系
  • 掌握日常开发 90% 用到的 Git 命令
  • 能处理分支合并和冲突

一、Git 是什么?——代码的"时光机"

没有 Git:    代码改坏了?回不去了 😭
有了 Git:    代码改坏了?回到昨天的版本 ✅
              想看一个月前写了什么?切过去看看 ✅
              多人同时改同一个文件?自动合并 ✅

Git = 版本控制系统。 它把你的每次修改都"拍了一张照片",随时可以翻回去看。


二、Git 的三个区域——行李箱的比喻

┌──────────────┐    git add    ┌──────────────┐    git commit   ┌──────────────┐
│   工作区      │  ──────────→  │   暂存区      │  ────────────→  │   仓库        │
│  (Working)   │               │  (Staging)    │                │  (Repository) │
│              │               │              │                │              │
│  你写代码     │               │  打包行李     │                │  封箱归档     │
│  随便改      │               │  选哪些提交   │                │  永久记录     │
└──────────────┘               └──────────────┘                └──────────────┘

类比:出差收拾行李

  • 工作区 → 你把衣服从衣柜拿出来,摊在床上
  • 暂存区 → 把要带的衣服叠好放进行李箱
  • 仓库 → 拉上拉链,贴上标签"2024年5月出差行李"

三、日常开发 90% 用到的命令

3.1 第一天:开始一个项目

# 初始化 Git 仓库(项目根目录执行,只需一次)
git init

# 配置用户名和邮箱(全局配置,只需一次)
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"

3.2 日常工作流

# 1. 查看当前状态(最常用的命令!)
git status

# 2. 把修改添加到暂存区
git add 文件名          # 添加指定文件
git add .               # 添加所有修改(最常用)

# 3. 提交(拍一张快照)
git commit -m "写清楚你做了什么改动"

# 4. 查看提交历史
git log --oneline       # 简洁版,一行一条
git log                 # 详细版

3.3 一个完整的工作流示例

# 你写了新功能
git status                          # 看看改了哪些文件

git add src/login.ts                # 把 login.ts 加入暂存区
git add src/register.ts             # 把 register.ts 加入暂存区

git commit -m "feat: 添加登录和注册功能"  # 提交

# 又改了一个 bug
git add src/login.ts
git commit -m "fix: 修复登录密码验证错误"

# 加个样式
git add src/style.css
git commit -m "style: 调整登录页样式"

四、提交信息规范——写好 commit message

# ❌ 不好的提交信息
git commit -m "修改"
git commit -m "111"
git commit -m "更新代码"

# ✅ 好的提交信息(约定式提交)
git commit -m "feat: 添加用户搜索功能"
git commit -m "fix: 修复分页总数显示错误"
git commit -m "docs: 更新 API 文档"
git commit -m "refactor: 重构用户模块代码结构"
git commit -m "style: 统一按钮圆角样式"
前缀 含义 例子
feat 新功能 feat: 添加导出PDF功能
fix 修 bug fix: 修复登录超时问题
docs 文档 docs: 更新安装说明
style 样式 style: 调整间距
refactor 重构 refactor: 提取公共方法
test 测试 test: 添加单元测试
chore 杂务 chore: 更新依赖版本

五、分支——平行宇宙

5.1 为什么需要分支?

没有分支:所有人都在主线上改 → 互相踩脚 → 代码一锅粥

有分支:
main ─────●──────●──────────●────→ 稳定版本
            \                  /
feature-a  ──●──●──●────────   → 开发新功能A(不影响别人)
                  \
feature-b       ──●──●──●──   → 开发新功能B(也不影响别人)

5.2 分支常用命令

# 查看分支
git branch                  # 本地分支
git branch -a               # 所有分支(含远程)

# 创建分支
git branch feature-login    # 创建名为 feature-login 的分支

# 切换分支
git checkout feature-login  # 切到 feature-login 分支
git switch feature-login    # 新版 Git 推荐这个

# 创建并切换(一步到位)
git checkout -b feature-payment  # 创建 feature-payment 并切过去
git switch -c feature-payment    # 新版推荐

# 合并分支
git checkout main           # 先切到目标分支
git merge feature-login     # 把 feature-login 合并进来

# 删除分支
git branch -d feature-login # 删除已合并的分支
git branch -D feature-login # 强制删除

六、撤销操作——后悔药

# 改坏了工作区的文件,想回到上次提交的状态
git checkout -- 文件名       # 丢弃工作区修改
git restore 文件名           # 新版推荐

# 已经 git add 了,想取消暂存
git reset HEAD 文件名        # 从暂存区移除,但保留工作区修改
git restore --staged 文件名  # 新版推荐

# 已经 commit 了,想撤销提交(但保留修改)
git reset --soft HEAD~1     # 撤销最近一次 commit,修改回到暂存区

# 已经 commit 了,想完全撤销(连修改都不要了)
git reset --hard HEAD~1     # ⚠️ 危险!修改彻底消失

七、解决冲突——当两个人改了同一个地方

场景:你和同事都改了 login.ts 的同一行

Git 会标记冲突:
<<<<<<< HEAD          (当前分支的版本)
const port = 3000;
=======               (分隔线)
const port = 8080;
>>>>>>> feature-b     (要合并进来的版本)

你需要手动选一个(或改写):
const port = 8080;    ← 改成你想要的

然后:
git add login.ts
git commit -m "merge: 合并 feature-b,解决端口冲突"

八、远程仓库——GitHub / GitLab

# 关联远程仓库
git remote add origin https://github.com/用户名/项目.git

# 推送到远程
git push origin main            # 推送 main 分支
git push origin feature-login   # 推送 feature-login 分支

# 从远程拉取
git pull origin main            # 拉取并合并 main 分支

# 克隆远程仓库
git clone https://github.com/用户名/项目.git

九、实战场景速查

# 场景1:忘记切分支就直接改了
git stash               # 暂存当前修改
git checkout -b new-branch
git stash pop           # 恢复修改

# 场景2:想看看某个文件的历史
git log -- 文件名
git log -p -- 文件名    # 看每一次的具体改动

# 场景3:提交信息写错了
git commit --amend -m "新的提交信息"

# 场景4:漏了文件没提交
git add 漏掉的文件
git commit --amend --no-edit  # 追加到上一次提交

# 场景5:回退到某个历史版本看看
git checkout 提交哈希值  # 临时切过去(头指针分离状态)
git checkout main       # 回到最新

十、.gitignore —— 哪些文件不管

在项目根目录创建 .gitignore 文件:

# 依赖
node_modules/

# 编译输出
dist/
build/

# 环境变量(含密码!)
.env
.env.local

# 系统文件
.DS_Store
Thumbs.db

# IDE 配置
.vscode/
.idea/

# 日志
*.log

今日小结

┌────────────────────────────────────────────┐
│                                            │
│  工作区 → git add → 暂存区 → git commit → 仓库 │
│                                            │
│  常用命令:                                  │
│  git status     看状态(最常用!)            │
│  git add .      全部暂存                     │
│  git commit -m  提交                        │
│  git log        看历史                      │
│  git branch     分支管理                     │
│  git checkout   切换分支                     │
│  git merge      合并                        │
│  git pull/push  拉取/推送                    │
│                                            │
│  口诀:add 暂存 commit 存,branch 分支       │
│         merge 合,push 推上去               │
│                                            │
└────────────────────────────────────────────┘
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐