From 62cf11175173f7a6a63cb93f77da5d1a9f2b12e1 Mon Sep 17 00:00:00 2001 From: HP Date: Wed, 25 Jun 2025 22:16:26 +0800 Subject: [PATCH] =?UTF-8?q?git=E7=AC=94=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- git-example.md | 321 +++++++++++++++++++++++++++++++++++++++++++++++++ git-guide.md | 240 ++++++++++++++++++++++++++++++++++++ 2 files changed, 561 insertions(+) create mode 100644 git-example.md create mode 100644 git-guide.md diff --git a/git-example.md b/git-example.md new file mode 100644 index 0000000..b62fa59 --- /dev/null +++ b/git-example.md @@ -0,0 +1,321 @@ +# Git 实际案例:开发一个简单的待办事项应用 + +## 场景描述 +假设您正在开发一个待办事项Web应用,需要添加新功能、修复bug,并与团队协作。 + +## 案例步骤演示 + +### 1. 项目初始化 +```bash +# 创建项目目录 +mkdir todo-app +cd todo-app + +# 初始化Git仓库 +git init + +# 创建初始文件 +echo "# 待办事项应用" > README.md +echo "console.log('Hello Todo App!');" > app.js +echo "body { font-family: Arial; }" > style.css + +# 查看状态 +git status +# 输出: +# On branch main +# Untracked files: +# README.md +# app.js +# style.css + +# 添加所有文件到暂存区 +git add . + +# 提交初始版本 +git commit -m "初始化项目:添加基础文件" +``` + +### 2. 开发新功能 - 添加待办事项 +```bash +# 创建功能分支 +git checkout -b feature/add-todo + +# 修改app.js添加功能 +cat > app.js << 'EOF' +// 待办事项数组 +let todos = []; + +// 添加待办事项 +function addTodo(text) { + const todo = { + id: Date.now(), + text: text, + completed: false + }; + todos.push(todo); + console.log('添加待办事项:', text); +} + +// 显示所有待办事项 +function showTodos() { + console.log('当前待办事项:'); + todos.forEach(todo => { + console.log(`${todo.id}: ${todo.text} [${todo.completed ? '完成' : '未完成'}]`); + }); +} + +// 测试 +addTodo('学习Git'); +addTodo('完成项目'); +showTodos(); +EOF + +# 查看变更 +git diff +# 显示详细的文件变更差异 + +# 添加并提交变更 +git add app.js +git commit -m "功能:添加待办事项的增加和显示功能" +``` + +### 3. 继续开发 - 添加完成功能 +```bash +# 继续在同一分支开发 +cat >> app.js << 'EOF' + +// 标记待办事项为完成 +function completeTodo(id) { + const todo = todos.find(t => t.id === id); + if (todo) { + todo.completed = true; + console.log('已完成:', todo.text); + } +} + +// 删除待办事项 +function deleteTodo(id) { + const index = todos.findIndex(t => t.id === id); + if (index > -1) { + const deleted = todos.splice(index, 1)[0]; + console.log('已删除:', deleted.text); + } +} +EOF + +# 提交新功能 +git add app.js +git commit -m "功能:添加完成和删除待办事项功能" + +# 查看提交历史 +git log --oneline +# 输出类似: +# a1b2c3d 功能:添加完成和删除待办事项功能 +# e4f5g6h 功能:添加待办事项的增加和显示功能 +# i7j8k9l 初始化项目:添加基础文件 +``` + +### 4. 发现并修复bug +```bash +# 在开发过程中发现一个bug,创建修复分支 +git checkout main +git checkout -b bugfix/empty-todo-validation + +# 修复:不允许添加空的待办事项 +sed -i '4i\\n// 验证输入不为空\nif (!text || text.trim() === "") {\n console.log("错误:待办事项不能为空");\n return;\n}' app.js + +# 查看修改 +git diff + +# 提交修复 +git add app.js +git commit -m "修复:防止添加空的待办事项" +``` + +### 5. 合并功能分支 +```bash +# 切换到主分支 +git checkout main + +# 合并功能分支 +git merge feature/add-todo +# 输出: +# Updating i7j8k9l..a1b2c3d +# Fast-forward +# app.js | 30 ++++++++++++++++++++++++++++++ +# 1 file changed, 30 insertions(+) + +# 合并bug修复分支 +git merge bugfix/empty-todo-validation + +# 如果有冲突,需要手动解决 +# 查看状态 +git status + +# 手动编辑冲突文件后 +git add app.js +git commit -m "合并:解决合并冲突" +``` + +### 6. 处理合并冲突示例 +```bash +# 假设出现冲突,文件内容会显示: +# <<<<<<< HEAD +# function addTodo(text) { +# const todo = { +# ======= +# function addTodo(text) { +# // 验证输入不为空 +# if (!text || text.trim() === "") { +# console.log("错误:待办事项不能为空"); +# return; +# } +# const todo = { +# >>>>>>> bugfix/empty-todo-validation + +# 手动解决冲突,保留所需的代码 +# 删除冲突标记,保留完整功能 + +# 解决后添加文件 +git add app.js +git commit -m "解决合并冲突:保留输入验证功能" +``` + +### 7. 与远程仓库同步 +```bash +# 添加远程仓库(假设已在GitHub创建) +git remote add origin https://github.com/username/todo-app.git + +# 推送主分支 +git push -u origin main + +# 推送所有分支 +git push origin --all + +# 查看远程仓库 +git remote -v +``` + +### 8. 团队协作场景 +```bash +# 拉取其他开发者的更新 +git fetch origin + +# 查看远程分支 +git branch -r + +# 拉取并合并远程变更 +git pull origin main + +# 如果有冲突,解决后继续 +git add . +git commit -m "合并远程变更" +``` + +### 9. 版本标记 +```bash +# 创建版本标签 +git tag -a v1.0 -m "第一个稳定版本" + +# 查看标签 +git tag + +# 推送标签到远程 +git push origin v1.0 +``` + +### 10. 紧急修复场景 +```bash +# 在生产环境发现紧急bug +git checkout main +git checkout -b hotfix/urgent-fix + +# 快速修复 +echo "// 紧急修复:修复显示问题" >> app.js + +# 提交修复 +git add app.js +git commit -m "紧急修复:解决生产环境显示问题" + +# 合并到主分支 +git checkout main +git merge hotfix/urgent-fix + +# 立即部署 +git push origin main + +# 也合并到开发分支(如果存在) +git checkout develop +git merge hotfix/urgent-fix +``` + +### 11. 历史记录管理 +```bash +# 查看详细历史 +git log --graph --pretty=format:'%h -%d %s (%cr) <%an>' --abbrev-commit + +# 查看文件变更历史 +git log -p app.js + +# 查看特定时间的提交 +git log --since="2 weeks ago" + +# 查找特定内容的提交 +git log --grep="修复" + +# 查看某个文件的责任人 +git blame app.js +``` + +### 12. 撤销操作示例 +```bash +# 撤销工作区变更 +git checkout -- app.js + +# 撤销暂存的变更 +git reset HEAD app.js + +# 撤销最后一次提交(保留变更) +git reset --soft HEAD~1 + +# 修改最后一次提交信息 +git commit --amend -m "新的提交信息" + +# 创建反向提交来撤销某个提交 +git revert a1b2c3d +``` + +### 13. 清理和维护 +```bash +# 删除已合并的分支 +git branch -d feature/add-todo +git branch -d bugfix/empty-todo-validation + +# 清理远程跟踪分支 +git remote prune origin + +# 查看分支合并状态 +git branch --merged +git branch --no-merged +``` + +## 完整的工作流程总结 + +1. **开始新功能**: `git checkout -b feature/功能名` +2. **开发和提交**: `git add` → `git commit` +3. **切换到主分支**: `git checkout main` +4. **合并功能**: `git merge feature/功能名` +5. **推送更新**: `git push origin main` +6. **清理分支**: `git branch -d feature/功能名` + +## 实际项目文件结构 +``` +todo-app/ +├── .git/ # Git仓库数据 +├── README.md # 项目说明 +├── app.js # 主要逻辑 +├── style.css # 样式文件 +└── index.html # HTML文件(后续添加) +``` + +这个案例展示了Git在实际开发中的完整使用流程,包括功能开发、bug修复、团队协作和版本管理。 \ No newline at end of file diff --git a/git-guide.md b/git-guide.md new file mode 100644 index 0000000..96f3f93 --- /dev/null +++ b/git-guide.md @@ -0,0 +1,240 @@ +# Git 使用指南 + +## 基础概念 + +Git 是一个分布式版本控制系统,用于跟踪代码变更历史。 + +### 核心概念 +- **仓库 (Repository)**: 存储项目所有文件和历史记录的地方 +- **工作区 (Working Directory)**: 当前正在编辑的文件 +- **暂存区 (Staging Area)**: 准备提交的文件暂存地 +- **提交 (Commit)**: 保存项目快照的操作 + +## 基础配置 + +```bash +# 配置用户信息 +git config --global user.name "你的名字" +git config --global user.email "你的邮箱" + +# 查看配置 +git config --list +``` + +## 常用命令 + +### 初始化和克隆 +```bash +# 初始化新仓库 +git init + +# 克隆远程仓库 +git clone <仓库地址> +``` + +### 文件操作 +```bash +# 查看状态 +git status + +# 添加文件到暂存区 +git add <文件名> # 添加单个文件 +git add . # 添加所有文件 +git add -A # 添加所有变更(包括删除) + +# 提交变更 +git commit -m "提交信息" + +# 查看变更差异 +git diff # 工作区与暂存区的差异 +git diff --staged # 暂存区与最后提交的差异 +``` + +### 历史查看 +```bash +# 查看提交历史 +git log +git log --oneline # 简洁格式 +git log --graph # 图形化显示 + +# 查看文件变更历史 +git log -p <文件名> +``` + +### 分支操作 +```bash +# 查看分支 +git branch # 本地分支 +git branch -r # 远程分支 +git branch -a # 所有分支 + +# 创建分支 +git branch <分支名> + +# 切换分支 +git checkout <分支名> +git switch <分支名> # Git 2.23+ 新命令 + +# 创建并切换分支 +git checkout -b <分支名> +git switch -c <分支名> + +# 删除分支 +git branch -d <分支名> # 安全删除 +git branch -D <分支名> # 强制删除 +``` + +### 合并操作 +```bash +# 合并分支 +git merge <分支名> + +# 变基操作 +git rebase <分支名> +``` + +### 远程仓库 +```bash +# 查看远程仓库 +git remote -v + +# 添加远程仓库 +git remote add origin <仓库地址> + +# 推送到远程 +git push origin <分支名> +git push -u origin <分支名> # 首次推送并设置上游 + +# 拉取远程变更 +git pull origin <分支名> +git fetch origin # 只获取不合并 +``` + +### 撤销操作 +```bash +# 撤销工作区变更 +git checkout -- <文件名> +git restore <文件名> # Git 2.23+ 新命令 + +# 撤销暂存区变更 +git reset HEAD <文件名> +git restore --staged <文件名> + +# 撤销提交 +git reset --soft HEAD~1 # 保留变更在暂存区 +git reset --mixed HEAD~1 # 保留变更在工作区 +git reset --hard HEAD~1 # 完全撤销变更 + +# 创建反向提交 +git revert <提交ID> +``` + +## 进阶技巧 + +### 标签管理 +```bash +# 创建标签 +git tag <标签名> +git tag -a <标签名> -m "标签说明" + +# 查看标签 +git tag + +# 推送标签 +git push origin <标签名> +git push origin --tags +``` + +### 暂存变更 +```bash +# 暂存当前变更 +git stash + +# 查看暂存列表 +git stash list + +# 应用暂存变更 +git stash apply # 应用最新暂存 +git stash pop # 应用并删除最新暂存 +git stash apply stash@{n} # 应用指定暂存 + +# 删除暂存 +git stash drop +git stash clear # 清空所有暂存 +``` + +### 重写历史 +```bash +# 交互式变基 +git rebase -i HEAD~n # 修改最近n个提交 + +# 修改最后一次提交 +git commit --amend + +# 压缩提交 +git rebase -i HEAD~n # 使用squash命令 +``` + +## 工作流程建议 + +### 基本工作流 +1. `git status` - 检查当前状态 +2. `git add` - 添加变更到暂存区 +3. `git commit` - 提交变更 +4. `git push` - 推送到远程仓库 + +### 功能开发流程 +1. `git checkout -b feature/新功能` - 创建功能分支 +2. 开发和提交变更 +3. `git checkout main` - 切换到主分支 +4. `git merge feature/新功能` - 合并功能分支 +5. `git branch -d feature/新功能` - 删除功能分支 + +## 最佳实践 + +1. **频繁提交**: 小步快跑,经常提交变更 +2. **清晰的提交信息**: 使用描述性的提交信息 +3. **使用分支**: 为每个功能或修复创建分支 +4. **保持主分支稳定**: 不要直接在主分支上开发 +5. **定期同步**: 经常拉取远程变更 +6. **审查变更**: 提交前检查变更内容 + +## 常见问题解决 + +### 合并冲突 +```bash +# 查看冲突文件 +git status + +# 手动解决冲突后 +git add <冲突文件> +git commit +``` + +### 忘记切换分支 +```bash +# 将变更移到新分支 +git stash +git checkout -b <新分支> +git stash pop +``` + +### 误删文件 +```bash +# 恢复已删除的文件 +git checkout HEAD -- <文件名> +``` + +## 有用的别名配置 + +```bash +git config --global alias.st status +git config --global alias.co checkout +git config --global alias.br branch +git config --global alias.ci commit +git config --global alias.unstage 'reset HEAD --' +git config --global alias.last 'log -1 HEAD' +git config --global alias.visual '!gitk' +``` + +这样就可以使用 `git st` 代替 `git status` 等。 \ No newline at end of file