git笔记

This commit is contained in:
HP 2025-06-25 22:22:32 +08:00
parent c2027afe8a
commit cf097cef2e
2 changed files with 561 additions and 0 deletions

321
git-example.md Normal file
View File

@ -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修复、团队协作和版本管理。

240
git-guide.md Normal file
View File

@ -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` 等。