# Git使用指南

## 名词解释

- **仓库（Repository）**：Git项目的存储位置，包含所有文件和历史记录
- **分支（Branch）**：独立的开发线，用于隔离不同的开发工作
- **提交（Commit）**：代码的快照，包含修改内容和提交信息
- **远端（Remote）**：远程仓库，通常位于服务器上
- **克隆（Clone）**：从远程仓库复制一个完整的本地仓库
- **推送（Push）**：将本地提交推送到远程仓库
- **拉取（Pull）**：从远程仓库拉取更新到本地
- **合并（Merge）**：将一个分支的更改合并到另一个分支
- **冲突（Conflict）**：当两个分支对同一文件的同一部分进行了不同的修改时产生
- **HEAD**：当前分支的最新提交
- **暂存区（Staging Area）**：临时保存修改的区域，位于工作区和仓库之间
- **工作区（Working Directory）**：本地修改文件的目录
- **索引（Index）**：与暂存区同义，用于暂存要提交的更改
- **提交哈希（Commit Hash）**：每个提交的唯一标识符，由SHA-1算法生成
- **标签（Tag）**：给特定提交添加的标记，通常用于版本发布
- **工作流（Workflow）**：团队使用Git的流程和规范
- **子模块（Submodule）**：在一个仓库中引用另一个仓库
- **Gitignore**：指定Git应忽略的文件和目录
- **Reflog**：Git操作的日志，用于恢复意外丢失的提交

## 常见场景

### 如何看本地当前分支refLog

- 在项目文件夹上右键点击，选择 **TortoiseGit → 显示引用日志**
- 在弹出的对话框中，可以看到本地当前分支的所有操作历史
- 每条记录包含操作类型、提交哈希、操作时间和操作描述

### 如何保证回退的位置在上次push后

1. **在插入前写入空Commit**
   
   - 插入个不带内容的Commit标记本地回退最多能回退到这里
     2  **跨越push的回退需要采用分支回退**
   
   - 为目标版本建立分支
   
   - 将改分支合并到主干
   
   - 提交主干
   
   - 删除本地这个临时分支

### 如何通过日志建立分支的方式来绕开错误的线上版本并最终合并替代

1. **找到错误版本之前的正确提交**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 显示日志**
   - 在日志对话框中，找到错误版本之前的正确提交

2. **基于正确提交创建新分支**
   
   - 在正确的提交上右键点击，选择 **创建分支**
   - 在弹出的对话框中，输入新分支名称
   - 点击 **确定** 按钮

3. **在新分支上继续开发**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 分支/标签 → 切换/检出**
   - 在弹出的对话框中，选择新创建的分支
   - 点击 **确定** 按钮
   - 在新分支上进行开发和修复

4. **合并新分支到主分支**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 分支/标签 → 切换/检出**
   - 在弹出的对话框中，选择主分支
   - 点击 **确定** 按钮
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 合并**
   - 在弹出的对话框中，选择新创建的分支
   - 点击 **确定** 按钮
   - 解决冲突（如果有）
   - 提交合并结果

### 如何快速定位某个内容的签入人和时间

1. **使用内容搜索**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 查找**
   - 在弹出的对话框中，选择 **按内容查找** 标签页
   - 输入要查找的内容
   - 点击 **查找** 按钮
   - 在搜索结果中，选择包含目标内容的文件

2. **查看文件的提交历史**
   
   - 在搜索结果中，右键点击目标文件，选择 **显示日志**
   - 在日志对话框中，可以看到文件的所有提交历史
   - 每条记录包含提交人、提交时间、提交信息和更改内容

3. **查看特定内容的签入信息**
   
   - 在日志对话框中，选择一个提交
   - 在右侧面板中，查看该提交的更改内容
   - 找到包含目标内容的更改
   - 记录该提交的作者和时间

## 远端与本地分支

### 本地分支操作（使用TortoiseGit UI）

1. **创建新分支**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 分支/标签 → 创建分支**
   - 在弹出的对话框中，输入分支名称
   - 选择基于哪个提交创建分支（默认为当前HEAD）
   - 点击 **确定** 按钮

2. **切换分支**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 分支/标签 → 切换/检出**
   - 在弹出的对话框中，从分支列表中选择要切换的分支
   - 点击 **确定** 按钮

3. **创建并切换到新分支**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 分支/标签 → 创建分支**
   - 在弹出的对话框中，输入分支名称
   - 勾选 **切换到新分支** 选项
   - 点击 **确定** 按钮

4. **查看本地分支**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 分支/标签 → 分支**
   - 在弹出的对话框中，可以看到所有本地分支和远程分支
   - 当前分支会以加粗显示

5. **删除本地分支**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 分支/标签 → 分支**
   - 在弹出的对话框中，选择要删除的本地分支
   - 点击 **删除** 按钮
   - 在确认对话框中，点击 **确定** 按钮

6. **强制删除本地分支**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 分支/标签 → 分支**
   - 在弹出的对话框中，选择要强制删除的本地分支
   - 点击 **删除** 按钮
   - 在确认对话框中，勾选 **强制删除** 选项
   - 点击 **确定** 按钮

### 远端分支操作（使用TortoiseGit UI）

1. **添加远程仓库**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 设置**
   - 在左侧导航栏中选择 **Git → 远端**
   - 点击 **添加** 按钮
   - 在弹出的对话框中，输入远端名称和远程仓库URL
   - 点击 **确定** 按钮

2. **查看远程仓库**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 设置**
   - 在左侧导航栏中选择 **Git → 远端**
   - 可以看到所有已添加的远程仓库及其URL

3. **从远程仓库拉取更新**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 拉取**
   - 在弹出的对话框中，选择远程仓库和分支
   - 点击 **确定** 按钮

4. **推送本地分支到远程仓库**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 推送**
   - 在弹出的对话框中，选择本地分支和远程分支
   - 点击 **确定** 按钮

5. **推送本地分支并设置上游分支**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 推送**
   - 在弹出的对话框中，选择本地分支
   - 在远程分支输入框中输入分支名称
   - 勾选 **设置 upstream/tracking 参考** 选项
   - 点击 **确定** 按钮

6. **查看远程分支**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 分支/标签 → 分支**
   - 在弹出的对话框中，选择 **远程分支** 标签页
   - 可以看到所有远程分支

7. **查看所有分支（本地和远程）**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 分支/标签 → 分支**
   - 在弹出的对话框中，可以看到本地分支和远程分支

8. **删除远程分支**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 推送**
   - 在弹出的对话框中，选择远程仓库
   - 在 **本地分支** 下拉菜单中选择 **<无>**
   - 在 **远程分支** 输入框中输入要删除的远程分支名称
   - 点击 **确定** 按钮
   - 在确认对话框中，点击 **确定** 按钮

### 分支合并（使用TortoiseGit UI）

1. **切换到目标分支**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 分支/标签 → 切换/检出**
   - 在弹出的对话框中，选择目标分支
   - 点击 **确定** 按钮

2. **合并源分支到目标分支**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 合并**
   - 在弹出的对话框中，选择要合并的源分支
   - 点击 **确定** 按钮

3. **解决冲突**
   
   - 如果合并过程中出现冲突，TortoiseGit会显示冲突文件列表
   - 双击冲突文件，使用TortoiseGit的冲突解决工具解决冲突
   - 解决完冲突后，保存文件

4. **提交合并结果**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 提交**
   - 在弹出的对话框中，确认提交信息
   - 点击 **确定** 按钮

## 日志分析

### 查看提交历史（使用TortoiseGit UI）

1. **查看完整提交历史**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 显示日志**
   - 在弹出的对话框中，可以看到完整的提交历史

2. **查看简洁提交历史**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 显示日志**
   - 在日志对话框中，点击 **视图** 菜单
   - 选择 **紧凑模式**

3. **查看最近N个提交**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 显示日志**
   - 在日志对话框中，点击 **限制** 按钮
   - 在弹出的对话框中，设置 **限制数量**
   - 点击 **确定** 按钮

4. **查看提交历史和更改内容**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 显示日志**
   - 在日志对话框中，选择一个提交
   - 在右侧面板中，可以看到该提交的更改内容

5. **查看特定文件的提交历史**
   
   - 在文件上右键点击，选择 **TortoiseGit → 显示日志**
   - 在弹出的对话框中，可以看到该文件的提交历史

6. **查看特定作者的提交历史**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 显示日志**
   - 在日志对话框中，点击 **限制** 按钮
   - 在弹出的对话框中，设置 **作者** 过滤条件
   - 点击 **确定** 按钮

7. **查看特定时间段的提交历史**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 显示日志**
   - 在日志对话框中，点击 **限制** 按钮
   - 在弹出的对话框中，设置 **日期范围**
   - 点击 **确定** 按钮

### 查看更改（使用TortoiseGit UI）

1. **查看工作区和暂存区的差异**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 检查修改**
   - 在弹出的对话框中，可以看到工作区的修改

2. **查看暂存区和HEAD的差异**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 检查修改**
   - 在弹出的对话框中，选择 **已暂存的修改** 标签页

3. **查看工作区和HEAD的差异**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 比较差异**
   - 在弹出的对话框中，选择 **与基础版本比较**

4. **查看两个提交之间的差异**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 显示日志**
   - 在日志对话框中，选择两个提交
   - 右键点击，选择 **比较差异**

5. **查看两个分支之间的差异**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 分支/标签 → 分支**
   - 在弹出的对话框中，选择两个分支
   - 右键点击，选择 **比较差异**

## 回退

### 回退到之前的提交（使用TortoiseGit UI）

1. 

2. **硬回退：丢弃工作区和暂存区的更改**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 显示日志**
   - 在日志对话框中，选择要回退到的提交
   - 右键点击，选择 **重置"master"到这个版本**
   - 在弹出的对话框中，选择 **硬重置** 选项
   - 点击 **确定** 按钮

### 回退到远程分支的状态（使用TortoiseGit UI）

1. **强制本地分支与远程分支保持一致**
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 拉取**
   - 在弹出的对话框中，选择远程仓库和分支
   - 勾选 **强制覆盖本地更改** 选项
   - 点击 **确定** 按钮

### 撤销修改（使用TortoiseGit UI）

1. **撤销工作区的修改（未add）**
   
   - 在文件上右键点击，选择 **TortoiseGit → 还原**
   - 在弹出的对话框中，点击 **确定** 按钮

2. **撤销暂存区的修改（已add但未commit）**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 检查修改**
   - 在弹出的对话框中，选择 **已暂存的修改** 标签页
   - 选择要撤销的文件
   - 点击 **还原** 按钮
   - 在确认对话框中，点击 **确定** 按钮

3. **撤销最近的提交，保留更改**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 显示日志**
   - 在日志对话框中，选择最近的提交
   - 右键点击，选择 **重置"master"到这个版本**
   - 在弹出的对话框中，选择 **混合重置** 选项
   - 点击 **确定** 按钮

4. **撤销最近的提交，丢弃更改**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 显示日志**
   - 在日志对话框中，选择最近的提交
   - 右键点击，选择 **重置"master"到这个版本**
   - 在弹出的对话框中，选择 **硬重置** 选项
   - 点击 **确定** 按钮

5. **撤销特定文件的提交**
   
   - 在文件上右键点击，选择 **TortoiseGit → 显示日志**
   - 在日志对话框中，选择要恢复到的提交
   - 右键点击，选择 **还原到此版本**
   - 在弹出的对话框中，点击 **确定** 按钮

## 危险的回退

### 注意事项（使用TortoiseGit UI）

1. **硬回退的风险**：使用TortoiseGit的 **硬重置** 操作会永久丢弃未提交的更改，无法恢复

2. **推送已回退的分支**：如果已经将分支推送到远程仓库，回退后再次推送需要使用 **强制推送** 选项，这会覆盖远程分支的历史

3. **共享分支的回退**：如果分支被多人共享，回退可能会导致其他开发者的工作丢失

4. **标签的影响**：回退操作不会移动标签，标签仍然指向原来的提交

### 安全回退策略（使用TortoiseGit UI）

1. **创建备份分支**：在回退前创建一个备份分支，保存当前状态
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 分支/标签 → 创建分支**
   - 在弹出的对话框中，输入备份分支名称
   - 点击 **确定** 按钮

2. **使用revert**：对于已经推送的提交，使用 **还原** 操作而不是 **重置**，这样可以创建一个新的提交来撤销之前的更改，而不是修改历史
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 显示日志**
   - 在日志对话框中，选择要撤销的提交
   - 右键点击，选择 **还原此提交**
   - 在弹出的对话框中，点击 **确定** 按钮

3. **沟通协作**：如果分支被多人共享，在回退前应与团队成员沟通，确保所有人都了解更改

4. **谨慎使用force推送**：只有在确定不会影响其他开发者的情况下，才使用 **强制推送**
   
   - 在项目文件夹上右键点击，选择 **TortoiseGit → 推送**
   - 在弹出的对话框中，勾选 **强制推送** 选项
   - 点击 **确定** 按钮

5. **定期备份**：定期备份重要的分支和提交，以防止意外丢失

## 最佳实践

1. **定期提交**：将工作分解为小的、有意义的提交
2. **写清晰的提交信息**：提交信息应该简洁明了，描述更改的内容和原因
3. **使用分支**：为不同的功能或修复创建独立的分支
4. **定期拉取**：定期从远程仓库拉取更新，避免冲突
5. **测试后再推送**：在推送前确保代码通过测试
6. **使用.gitignore**：忽略不需要版本控制的文件
7. **定期清理**：删除不需要的分支，保持仓库整洁
8. **学习Git工作流**：了解并遵循团队的Git工作流规范

通过遵循这些最佳实践，可以更有效地使用Git，减少错误和冲突，提高开发效率。