【零基础学AI】第3讲:Git版本控制基础
本节课你将学到
- 理解什么是版本控制和为什么需要Git
- 掌握Git的安装和基本配置
- 学会Git的核心概念和工作流程
- 掌握常用Git命令进行代码版本管理
- 创建一个完整的AI项目并进行版本控制
开始之前
什么是版本控制?
想象你在写一份重要文档:
- 没有版本控制:文档_最终版.docx、文档_最终版2.docx、文档_真正的最终版.docx…
- 有版本控制:每次修改都有记录,可以随时查看历史,回退到任何版本
版本控制就是管理文件变化的系统,特别适合:
- 代码开发:追踪每一次代码修改
- 团队协作:多人同时开发不冲突
- 备份恢复:永远不会丢失历史版本
- 实验尝试:可以大胆尝试新功能,失败了随时回退
为什么选择Git?
Git是目前最流行的分布式版本控制系统:
- 分布式:每个人都有完整的项目历史
- 高效:速度快,占用空间小
- 强大的分支功能:可以同时开发多个功能
- 业界标准:几乎所有公司都在使用
环境要求
- Windows 10/11、macOS 10.9+、或任何Linux发行版
- 已完成前两讲的环境配置
- 能够使用命令行工具
Git安装和配置
下载和安装Git
Windows用户:
- 访问 https://git-scm.com/download/windows
- 下载Git for Windows安装包
- 运行安装程序,推荐设置:
- ✅ Use Git from the Windows Command Prompt
- ✅ Checkout Windows-style, commit Unix-style line endings
- ✅ Use Windows’ default console window
macOS用户:
# 方法1:使用Homebrew(推荐)
brew install git# 方法2:下载安装包
# 访问 https://git-scm.com/download/mac
Linux用户:
# Ubuntu/Debian
sudo apt update
sudo apt install git# CentOS/RHEL
sudo yum install git
# 或
sudo dnf install git
验证Git安装
# 检查Git版本
git --version
# 应该显示:git version 2.x.x# 查看Git帮助
git --help
Git基础配置
安装完成后需要配置用户信息:
# 设置用户名(必需)
git config --global user.name "你的姓名"# 设置邮箱(必需)
git config --global user.email "your.email@example.com"# 设置默认编辑器(可选)
git config --global core.editor "code" # 使用VS Code
# 或
git config --global core.editor "notepad" # 使用记事本# 设置默认分支名称
git config --global init.defaultBranch main# 查看配置信息
git config --list
配置SSH密钥(可选但推荐)
# 生成SSH密钥对
ssh-keygen -t rsa -b 4096 -C "your.email@example.com"# 按回车使用默认文件位置
# 可以设置密码,也可以直接回车跳过# 查看公钥内容
cat ~/.ssh/id_rsa.pub # Linux/macOS
# 或
type %USERPROFILE%\.ssh\id_rsa.pub # Windows# 将公钥添加到GitHub/GitLab等平台
Git核心概念
工作区、暂存区、版本库
Git有三个重要的区域:
工作区(Working Directory)↓ git add
暂存区(Staging Area)↓ git commit
版本库(Repository)
工作区:你正在编辑的文件
暂存区:准备提交的文件快照
版本库:已提交的历史记录
文件状态
Git中的文件有四种状态:
- Untracked:新文件,Git还不知道
- Modified:文件被修改了,但还没暂存
- Staged:文件已暂存,准备提交
- Committed:文件已提交到版本库
Git基本命令实战
创建Git仓库
# 创建项目目录
mkdir ai_learning_project
cd ai_learning_project# 初始化Git仓库
git init# 查看当前状态
git status
运行后会看到:
Initialized empty Git repository in /path/to/ai_learning_project/.git/
On branch main
No commits yet
nothing to commit (create/copy files and use "git add" to track)
创建项目文件
让我们创建一个AI学习项目的基础结构:
# 创建项目目录结构
mkdir data notebooks src output
创建README.md文件:
# AI学习项目## 项目简介
这是我的AI学习项目,包含数据分析、机器学习等内容。## 目录结构
- `data/`: 存放数据文件
- `notebooks/`: Jupyter笔记本
- `src/`: Python源代码
- `output/`: 输出结果## 环境要求
- Python 3.11+
- Anaconda
- 主要库:numpy, pandas, matplotlib, scikit-learn## 使用方法
1. 激活conda环境:`conda activate ai-learning`
2. 启动Jupyter:`jupyter notebook`
3. 打开对应的笔记本开始学习## 学习进度
- [x] 第1讲:Python环境配置
- [x] 第2讲:Jupyter Notebook使用
- [ ] 第3讲:Git版本控制
- [ ] 待续...## 联系方式
- 邮箱:your.email@example.com
- GitHub:https://github.com/yourusername
创建第一个Python文件:
# src/hello_git.py - Git版本控制演示程序
"""
这是一个演示Git版本控制功能的简单程序
主要展示如何在AI项目中使用Git管理代码
"""import datetime
import osdef get_project_info():"""获取项目基本信息"""project_info = {'项目名称': 'AI学习项目','创建时间': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),'版本控制': 'Git','编程语言': 'Python','主要用途': 'AI学习和实践'}return project_infodef display_git_status():"""显示Git状态信息(模拟)"""print("📁 项目目录结构:")# 遍历项目目录for root, dirs, files in os.walk('.'):level = root.replace('.', '').count(os.sep)indent = ' ' * 2 * levelprint(f"{indent}{os.path.basename(root)}/")# 只显示前几个文件,避免输出过长sub_indent = ' ' * 2 * (level + 1)for file in files[:3]: # 只显示前3个文件print(f"{sub_indent}{file}")if len(files) > 3:print(f"{sub_indent}... 还有{len(files)-3}个文件")def demonstrate_version_control():"""演示版本控制的重要性"""print("🔄 版本控制的好处:")benefits = ["追踪每次代码修改","可以回退到历史版本", "团队协作不会冲突","实验新功能更安全","永久保存开发历史"]for i, benefit in enumerate(benefits, 1):print(f" {i}. {benefit}")def main():"""主函数"""print("=" * 50)print("🎯 Git版本控制演示程序")print("=" * 50)# 显示项目信息print("\n📊 项目信息:")project_info = get_project_info()for key, value in project_info.items():print(f" {key}: {value}")print()# 显示目录结构display_git_status()print()# 演示版本控制的好处demonstrate_version_control()print()print("✨ 通过Git,我们可以安全地管理这个AI项目的所有代码!")print("=" * 50)if __name__ == "__main__":main()
创建.gitignore文件:
# .gitignore - 指定Git忽略的文件# Python相关
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg# Jupyter Notebook
.ipynb_checkpoints# 环境变量
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/# IDE配置
.vscode/
.idea/
*.swp
*.swo
*~# 操作系统
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db# 数据文件(通常不提交大数据文件)
*.csv
*.xlsx
*.json
data/raw/
data/processed/# 模型文件
*.pkl
*.joblib
*.h5
*.pb# 日志文件
*.log# 临时文件
temp/
tmp/
添加文件到Git
# 查看当前状态
git status# 添加单个文件
git add README.md# 添加多个文件
git add src/hello_git.py .gitignore# 添加所有文件(小心使用)
git add .# 查看暂存区状态
git status
看到类似输出:
On branch main
No commits yetChanges to be committed:(use "git rm --cached <file>..." to unstage)new file: .gitignorenew file: README.mdnew file: src/hello_git.py
提交更改
# 提交暂存区的文件
git commit -m "初始提交:创建AI学习项目基础结构"# 查看提交历史
git log# 简洁的历史查看
git log --oneline
提交成功后会看到:
[main (root-commit) abc1234] 初始提交:创建AI学习项目基础结构3 files changed, 120 insertions(+)create mode 100644 .gitignorecreate mode 100644 README.mdcreate mode 100644 src/hello_git.py
Git工作流程实践
修改文件并提交
让我们修改hello_git.py,添加新功能:
# 在hello_git.py文件末尾添加新函数def analyze_commit_history():"""分析提交历史(模拟)"""print("\n📈 提交历史分析:")# 模拟的提交记录commits = [{'hash': 'abc1234', 'message': '初始提交:创建AI学习项目基础结构', 'date': '2024-01-01'},{'hash': 'def5678', 'message': '添加数据分析功能', 'date': '2024-01-02'},{'hash': 'ghi9012', 'message': '优化代码结构', 'date': '2024-01-03'}]for commit in commits:print(f" {commit['hash'][:7]} - {commit['message']} ({commit['date']})")print(f"\n 总共 {len(commits)} 个提交")# 修改main函数,调用新函数
def main():"""主函数"""print("=" * 50)print("🎯 Git版本控制演示程序 v2.0") # 版本号也更新了print("=" * 50)# 显示项目信息print("\n📊 项目信息:")project_info = get_project_info()for key, value in project_info.items():print(f" {key}: {value}")print()# 显示目录结构display_git_status()print()# 演示版本控制的好处demonstrate_version_control()# 新增:分析提交历史analyze_commit_history()print()print("✨ 通过Git,我们可以安全地管理这个AI项目的所有代码!")print("=" * 50)
查看文件修改
# 查看工作区状态
git status# 查看具体修改内容
git diff# 查看暂存区和工作区的差异
git diff --cached
提交修改
# 添加修改的文件
git add src/hello_git.py# 提交修改
git commit -m "添加提交历史分析功能,升级到v2.0"# 查看提交历史
git log --oneline
创建和使用分支
分支让你可以同时开发多个功能:
# 查看当前分支
git branch# 创建新分支
git branch feature-data-analysis# 切换到新分支
git checkout feature-data-analysis# 或者创建并切换(推荐)
git checkout -b feature-visualization# 查看所有分支
git branch -a
在新分支开发功能
创建一个新的数据分析模块:
# src/data_analyzer.py - 数据分析模块
"""
数据分析工具模块
提供常用的数据分析功能
"""import pandas as pd
import numpy as np
import matplotlib.pyplot as pltclass DataAnalyzer:"""数据分析器类"""def __init__(self, data=None):"""初始化数据分析器参数:data: 要分析的数据,可以是DataFrame或文件路径"""self.data = Noneif data is not None:self.load_data(data)def load_data(self, data):"""加载数据参数:data: DataFrame对象或CSV文件路径"""if isinstance(data, str):# 如果是字符串,认为是文件路径try:self.data = pd.read_csv(data)print(f"✅ 数据加载成功:{data}")except Exception as e:print(f"❌ 数据加载失败:{e}")elif isinstance(data, pd.DataFrame):# 如果是DataFrame对象self.data = data.copy()print("✅ DataFrame数据加载成功")else:print("❌ 不支持的数据类型")def basic_info(self):"""显示数据基本信息"""if self.data is None:print("❌ 没有加载数据")returnprint("📊 数据基本信息:")print(f" 形状: {self.data.shape}")print(f" 列名: {list(self.data.columns)}")print(f" 数据类型:")for col, dtype in self.data.dtypes.items():print(f" {col}: {dtype}")print(f"\n🔍 缺失值统计:")missing = self.data.isnull().sum()for col, count in missing.items():if count > 0:print(f" {col}: {count}个缺失值")if missing.sum() == 0:print(" 无缺失值")def statistical_summary(self):"""统计摘要"""if self.data is None:print("❌ 没有加载数据")returnprint("\n📈 数值列统计摘要:")numeric_cols = self.data.select_dtypes(include=[np.number]).columnsif len(numeric_cols) > 0:summary = self.data[numeric_cols].describe()print(summary)else:print(" 没有数值列")print("\n📝 分类列统计:")categorical_cols = self.data.select_dtypes(include=['object']).columnsfor col in categorical_cols:unique_count = self.data[col].nunique()print(f" {col}: {unique_count}个不同值")if unique_count <= 10: # 如果类别不多,显示具体值print(f" 值: {list(self.data[col].unique())}")def create_sample_data(self):"""创建示例数据用于演示"""np.random.seed(42)# 创建示例销售数据dates = pd.date_range('2023-01-01', periods=100, freq='D')categories = ['电子产品', '服装', '食品', '图书']data = []for date in dates:category = np.random.choice(categories)sales = np.random.normal(10000, 2000) # 平均销售额10000,标准差2000quantity = np.random.randint(50, 200)data.append({'日期': date,'产品类别': category,'销售额': max(sales, 1000), # 确保销售额为正'销售量': quantity})self.data = pd.DataFrame(data)print("✅ 示例数据创建完成")return self.datadef quick_visualization(self):"""快速可视化"""if self.data is None:print("❌ 没有加载数据")returnnumeric_cols = self.data.select_dtypes(include=[np.number]).columnsif len(numeric_cols) == 0:print("❌ 没有数值列可以可视化")return# 创建子图fig, axes = plt.subplots(2, 2, figsize=(15, 10))fig.suptitle('数据快速可视化', fontsize=16)# 1. 第一个数值列的直方图if len(numeric_cols) >= 1:col = numeric_cols[0]axes[0, 0].hist(self.data[col], bins=20, alpha=0.7, color='skyblue')axes[0, 0].set_title(f'{col} 分布')axes[0, 0].set_xlabel(col)axes[0, 0].set_ylabel('频次')# 2. 时间序列图(如果有日期列)date_cols = self.data.select_dtypes(include=['datetime64']).columnsif len(date_cols) > 0 and len(numeric_cols) >= 1:date_col = date_cols[0]value_col = numeric_cols[0]daily_data = self.data.groupby(date_col)[value_col].sum()axes[0, 1].plot(daily_data.index, daily_data.values, marker='o')axes[0, 1].set_title(f'{value_col} 时间趋势')axes[0, 1].set_xlabel('日期')axes[0, 1].set_ylabel(value_col)axes[0, 1].tick_params(axis='x', rotation=45)# 3. 类别分析(如果有分类列)categorical_cols = self.data.select_dtypes(include=['object']).columnsif len(categorical_cols) > 0 and len(numeric_cols) >= 1:cat_col = categorical_cols[0]value_col = numeric_cols[0]category_sum = self.data.groupby(cat_col)[value_col].sum()axes[1, 0].bar(category_sum.index, category_sum.values, color='lightgreen')axes[1, 0].set_title(f'各{cat_col}{value_col}')axes[1, 0].set_xlabel(cat_col)axes[1, 0].set_ylabel(value_col)axes[1, 0].tick_params(axis='x', rotation=45)# 4. 相关性热力图(如果有多个数值列)if len(numeric_cols) >= 2:corr_matrix = self.data[numeric_cols].corr()im = axes[1, 1].imshow(corr_matrix, cmap='coolwarm', aspect='auto')axes[1, 1].set_xticks(range(len(numeric_cols)))axes[1, 1].set_yticks(range(len(numeric_cols)))axes[1, 1].set_xticklabels(numeric_cols, rotation=45)axes[1, 1].set_yticklabels(numeric_cols)axes[1, 1].set_title('相关性矩阵')# 添加数值标签for i in range(len(numeric_cols)):for j in range(len(numeric_cols)):text = axes[1, 1].text(j, i, f'{corr_matrix.iloc[i, j]:.2f}',ha="center", va="center", color="black")plt.tight_layout()plt.show()print("📊 可视化完成")def demo_data_analyzer():"""演示数据分析器的使用"""print("🔬 数据分析器演示")print("=" * 30)# 创建分析器实例analyzer = DataAnalyzer()# 创建示例数据analyzer.create_sample_data()# 显示基本信息analyzer.basic_info()# 显示统计摘要analyzer.statistical_summary()# 快速可视化analyzer.quick_visualization()if __name__ == "__main__":demo_data_analyzer()
提交新功能
# 添加新文件
git add src/data_analyzer.py# 提交新功能
git commit -m "添加数据分析模块,支持基本统计和可视化"# 查看分支状态
git log --oneline --graph --all
合并分支
# 切换回主分支
git checkout main# 合并功能分支
git merge feature-visualization# 删除已合并的分支(可选)
git branch -d feature-visualization# 查看最终的提交历史
git log --oneline --graph
远程仓库操作
连接GitHub
- 在GitHub上创建新仓库(不要初始化README)
- 添加远程仓库:
# 添加远程仓库
git remote add origin https://github.com/yourusername/ai-learning-project.git# 查看远程仓库
git remote -v# 推送到远程仓库
git push -u origin main# 以后的推送
git push
克隆项目
# 克隆远程仓库到本地
git clone https://github.com/yourusername/ai-learning-project.git# 进入项目目录
cd ai-learning-project# 查看远程分支
git branch -r
拉取更新
# 获取远程更新(不合并)
git fetch# 拉取并合并更新
git pull# 等价于
git fetch
git merge origin/main
实用Git命令集合
查看和比较
# 查看提交历史
git log # 详细历史
git log --oneline # 简洁历史
git log --graph # 图形化历史
git log --author="张三" # 按作者查看# 查看文件修改
git diff # 工作区vs暂存区
git diff --cached # 暂存区vs版本库
git diff HEAD # 工作区vs版本库
git diff commit1 commit2 # 比较两个提交# 查看文件状态
git status # 详细状态
git status -s # 简洁状态
撤销和回退
# 撤销工作区修改
git checkout -- filename# 撤销暂存区文件
git reset HEAD filename# 撤销最后一次提交(保留修改)
git reset --soft HEAD~1# 撤销最后一次提交(不保留修改)
git reset --hard HEAD~1# 回退到指定提交
git reset --hard commit_hash
标签管理
# 创建标签
git tag v1.0# 创建带说明的标签
git tag -a v1.0 -m "版本1.0发布"# 查看所有标签
git tag# 推送标签到远程
git push origin v1.0
git push origin --tags
完整项目演示
让我们创建一个完整的AI项目演示Git的使用:
创建项目配置文件
# config.py - 项目配置文件
"""
AI学习项目配置文件
包含项目的各种配置参数
"""import os
from pathlib import Path# 项目根目录
PROJECT_ROOT = Path(__file__).parent# 数据目录配置
DATA_DIR = PROJECT_ROOT / "data"
RAW_DATA_DIR = DATA_DIR / "raw"
PROCESSED_DATA_DIR = DATA_DIR / "processed"# 输出目录配置
OUTPUT_DIR = PROJECT_ROOT / "output"
MODELS_DIR = OUTPUT_DIR / "models"
PLOTS_DIR = OUTPUT_DIR / "plots"
REPORTS_DIR = OUTPUT_DIR / "reports"# 确保目录存在
for directory in [DATA_DIR, RAW_DATA_DIR, PROCESSED_DATA_DIR, OUTPUT_DIR, MODELS_DIR, PLOTS_DIR, REPORTS_DIR]:directory.mkdir(parents=True, exist_ok=True)# 项目配置
PROJECT_CONFIG = {'name': 'AI学习项目','version': '1.0.0','author': 'AI学习者','description': '基于Python的AI学习和实践项目','python_version': '3.11+','dependencies': ['numpy>=1.21.0','pandas>=1.3.0','matplotlib>=3.4.0','scikit-learn>=1.0.0','jupyter>=1.0.0']
}# 数据处理配置
DATA_CONFIG = {'random_seed': 42,'test_size': 0.2,'validation_size': 0.1,'n_folds': 5
}# 模型配置
MODEL_CONFIG = {'default_algorithm': 'RandomForest','hyperparameter_tuning': True,'cross_validation': True,'save_models': True
}# 可视化配置
PLOT_CONFIG = {'style': 'default','figure_size': (12, 8),'dpi': 150,'save_format': 'png','font_size': 12
}def print_config():"""打印项目配置信息"""print("⚙️ 项目配置信息")print("=" * 40)print("\n📁 目录配置:")print(f" 项目根目录: {PROJECT_ROOT}")print(f" 数据目录: {DATA_DIR}")print(f" 输出目录: {OUTPUT_DIR}")print("\n📋 项目信息:")for key, value in PROJECT_CONFIG.items():if key == 'dependencies':print(f" {key}:")for dep in value:print(f" - {dep}")else:print(f" {key}: {value}")if __name__ == "__main__":print_config()
创建需求文件
# requirements.txt - 项目依赖列表
# 核心数据科学库
numpy>=1.21.0
pandas>=1.3.0
matplotlib>=3.4.0
seaborn>=0.11.0# 机器学习库
scikit-learn>=1.0.0# Jupyter相关
jupyter>=1.0.0
ipython>=7.0.0# 数据可视化
plotly>=5.0.0# 实用工具
tqdm>=4.60.0
requests>=2.25.0
创建主程序
# main.py - 主程序入口
"""
AI学习项目主程序
整合各个模块,提供统一的项目入口
"""import sys
import os
from pathlib import Path# 添加src目录到Python路径
sys.path.append(str(Path(__file__).parent / "src"))# 导入项目模块
from hello_git import main as hello_main
from data_analyzer import demo_data_analyzer
from config import print_config, PROJECT_CONFIGdef show_menu():"""显示主菜单"""print("\n" + "=" * 50)print("🚀 AI学习项目主程序")print("=" * 50)menu_options = ["1. 查看项目配置","2. Git版本控制演示","3. 数据分析器演示", "4. 运行所有演示","5. 退出程序"]for option in menu_options:print(f" {option}")print("=" * 50)def run_all_demos():"""运行所有演示程序"""print("\n🎬 运行所有演示程序...")print("-" * 30)# 1. 项目配置print("\n1️⃣ 项目配置信息:")print_config()# 2. Git演示print("\n2️⃣ Git版本控制演示:")hello_main()# 3. 数据分析演示print("\n3️⃣ 数据分析器演示:")demo_data_analyzer()print("\n✅ 所有演示完成!")def main():"""主函数"""print(f"欢迎使用 {PROJECT_CONFIG['name']} v{PROJECT_CONFIG['version']}")while True:show_menu()try:choice = input("\n请选择操作 (1-5): ").strip()if choice == "1":print_config()elif choice == "2":hello_main()elif choice == "3":demo_data_analyzer()elif choice == "4":run_all_demos()elif choice == "5":print("\n👋 感谢使用,再见!")breakelse:print("❌ 无效选择,请输入1-5之间的数字")except KeyboardInterrupt:print("\n\n👋 程序被中断,再见!")breakexcept Exception as e:print(f"❌ 发生错误: {e}")input("\n按回车键继续...")if __name__ == "__main__":main()
提交完整项目
# 添加所有新文件
git add .# 查看将要提交的内容
git status# 提交完整的项目结构
git commit -m "完善项目结构:添加配置文件、需求文件和主程序- 添加config.py:项目配置管理
- 添加requirements.txt:依赖管理
- 添加main.py:统一的程序入口
- 完善目录结构和项目组织"# 查看提交历史
git log --oneline --graph
Git最佳实践
提交信息规范
好的提交信息格式:
类型(范围): 简短描述详细描述(可选)相关issue: #123
提交类型:
feat
: 新功能fix
: 错误修复docs
: 文档更新style
: 代码格式修改refactor
: 代码重构test
: 测试相关chore
: 构建过程或辅助工具的变动
示例:
git commit -m "feat(data): 添加数据预处理模块- 实现缺失值处理功能
- 添加数据标准化方法
- 支持分类变量编码相关issue: #15"
.gitignore最佳实践
# .gitignore - 改进版本# === Python相关 ===
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST# === Jupyter Notebook ===
.ipynb_checkpoints
*/.ipynb_checkpoints/*# === 环境配置 ===
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
.python-version# === IDE和编辑器 ===
.vscode/
.idea/
*.swp
*.swo
*~
.spyderproject
.spyproject# === 操作系统 ===
# macOS
.DS_Store
.AppleDouble
.LSOverride
._*# Windows
Thumbs.db
ehthumbs.db
Desktop.ini
$RECYCLE.BIN/# Linux
*~
.directory# === 项目特定 ===
# 数据文件(大文件不提交)
data/raw/*.csv
data/raw/*.xlsx
data/raw/*.json
data/processed/*.pkl# 模型文件
models/*.pkl
models/*.joblib
models/*.h5
models/*.pb
*.model# 日志文件
logs/
*.log# 临时文件
temp/
tmp/
.cache/# 测试覆盖率
htmlcov/
.coverage
.pytest_cache/# 配置文件(可能包含敏感信息)
config/local.py
secrets.py
分支管理策略
# 主分支(production ready)
main/master# 开发分支
develop# 功能分支
feature/user-authentication
feature/data-visualization
feature/model-training# 修复分支
hotfix/fix-data-loading
bugfix/memory-leak# 发布分支
release/v1.0.0
release/v1.1.0
分支工作流程:
# 1. 从develop创建功能分支
git checkout develop
git pull origin develop
git checkout -b feature/new-algorithm# 2. 开发功能
# ... 编写代码 ...
git add .
git commit -m "feat: 实现新的机器学习算法"# 3. 推送功能分支
git push origin feature/new-algorithm# 4. 创建Pull Request/Merge Request# 5. 代码审查通过后合并到develop
git checkout develop
git pull origin develop
git merge feature/new-algorithm# 6. 删除功能分支
git branch -d feature/new-algorithm
git push origin --delete feature/new-algorithm
团队协作最佳实践
代码审查流程
# 1. Fork项目(GitHub)或创建分支
git checkout -b feature/team-collaboration# 2. 实现功能并提交
git add .
git commit -m "feat: 添加团队协作功能"# 3. 推送到远程分支
git push origin feature/team-collaboration# 4. 创建Pull Request
# 在GitHub/GitLab界面操作# 5. 代码审查和讨论
# 根据反馈修改代码# 6. 合并到主分支
# 由项目维护者操作
冲突解决
# 当多人修改同一文件时可能出现冲突
git pull origin main# 如果有冲突,Git会提示
# 手动编辑冲突文件,解决冲突标记
# <<<<<<< HEAD
# 你的修改
# =======
# 别人的修改
# >>>>>>> commit_hash# 解决冲突后提交
git add .
git commit -m "resolve: 解决合并冲突"
常见问题解决
问题1:忘记添加.gitignore文件
# 如果已经跟踪了不应该跟踪的文件
git rm --cached filename
# 或删除整个目录
git rm -r --cached directory/# 然后添加到.gitignore
echo "filename" >> .gitignore
git add .gitignore
git commit -m "add .gitignore and remove tracked files"
问题2:提交了错误的内容
# 修改最后一次提交(还没推送)
git add forgotten_file
git commit --amend -m "新的提交信息"# 已经推送的情况(慎用)
git revert commit_hash
问题3:需要暂存当前工作
# 暂存工作区的修改
git stash# 查看暂存列表
git stash list# 恢复暂存的修改
git stash pop# 恢复指定的暂存
git stash apply stash@{0}
问题4:误删除分支
# 查找已删除分支的最后提交
git reflog# 恢复分支
git checkout -b recovered-branch commit_hash
项目总结和版本发布
让我们为项目打上版本标签:
# 确保所有修改都已提交
git status# 创建版本标签
git tag -a v1.0.0 -m "AI学习项目 v1.0.0 发布主要功能:
- 完整的项目结构
- Git版本控制演示
- 数据分析模块
- 可视化功能
- 配置管理系统"# 推送标签到远程
git push origin v1.0.0# 查看所有标签
git tag
创建发布说明
# AI学习项目 v1.0.0 发布说明## 🎉 新功能
- ✅ 完整的项目结构和配置管理
- ✅ Git版本控制完整演示
- ✅ 数据分析器模块,支持基本统计和可视化
- ✅ 统一的主程序入口
- ✅ 详细的项目文档## 📁 项目结构
ai_learning_project/
├── data/ # 数据文件目录
├── notebooks/ # Jupyter笔记本
├── src/ # 源代码
│ ├── hello_git.py # Git演示程序
│ └── data_analyzer.py # 数据分析模块
├── output/ # 输出结果
├── config.py # 项目配置
├── main.py # 主程序
├── requirements.txt # 依赖列表
├── .gitignore # Git忽略文件
└── README.md # 项目说明
## 🚀 快速开始
1. 克隆项目:`git clone <repository-url>`
2. 安装依赖:`pip install -r requirements.txt`
3. 运行程序:`python main.py`## 📚 学习目标
通过这个项目,你将学会:
- Git版本控制的基本使用
- Python项目的标准结构
- 数据分析的基础方法
- 代码组织和模块化## 🐛 已知问题
- 暂无## 🔮 下个版本计划
- 添加机器学习模型训练功能
- 支持更多数据格式
- 添加自动化测试
- 完善文档和教程
学习总结
通过本节课的学习,你已经掌握了:
✅ Git基础概念
- 理解了版本控制的重要性
- 掌握了工作区、暂存区、版本库的概念
- 学会了文件的四种状态
✅ Git基本操作
- 安装和配置Git
- 创建和管理Git仓库
- 添加、提交、查看历史
- 分支的创建、切换、合并
✅ 远程仓库操作
- 连接GitHub等远程仓库
- 推送和拉取代码
- 克隆项目
✅ 最佳实践
- 规范的提交信息格式
- 合理的.gitignore配置
- 有效的分支管理策略
- 团队协作流程
✅ 实际项目经验
- 创建了完整的AI学习项目
- 体验了从初始化到发布的完整流程
- 学会了项目结构组织
下节课预告
第4讲我们将学习NumPy数组操作,这是AI开发的基础:
- NumPy是什么,为什么重要
- 多维数组的创建和操作
- 数组运算和广播机制
- 数组索引和切片技巧
- 图像数据处理实战
NumPy是所有AI库的基础,掌握它将为后续学习打下坚实基础!
恭喜完成第3讲!
你已经掌握了Git版本控制,这是每个程序员必备的技能。现在你可以安全地管理代码版本,与团队协作开发,再也不用担心代码丢失或冲突了。Git将伴随你整个编程生涯!