名称: git分析 描述: 分析git仓库变更、分支差异和提交历史。适用于分析分支、比较变更、检查提交历史或准备PR/提交操作时使用。
Git分析
本技能提供全面的git仓库分析能力,用于理解分支变更、提交历史和代码差异。
能力
- 分析分支差异和合并基准点
- 提取结构化提交历史
- 识别变更文件及其统计信息
- 确定默认分支和远程配置
- 支持PR创建、代码审查和提交操作
使用时机
在以下情况使用本技能:
- 分析分支中的变更内容
- 准备PR创建信息
- 审查提交历史
- 比较分支
- 理解提交或审查的代码变更
核心分析步骤
1. 识别默认分支
获取仓库的默认分支(通常是main或master):
git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@'
这确定了用于比较的基础分支。
2. 查找合并基准点
确定当前分支从默认分支分叉的位置:
# 获取合并基准点
git merge-base origin/<默认分支> HEAD
合并基准点是分支分叉的提交点,而不是基础分支的当前状态。
3. 分析变更
获取全面的变更信息:
# 列出从合并基准点开始的提交
git log --oneline <合并基准点>..HEAD
# 获取详细的提交信息
git log --format="%H|%s|%an|%ae|%ad" --date=iso <合并基准点>..HEAD
# 获取文件统计信息
git diff --stat <合并基准点>..HEAD
# 获取完整差异
git diff <合并基准点>..HEAD
4. 检查当前状态
了解未暂存和已暂存的变更:
# 检查未跟踪文件
git status
# 检查已暂存变更
git diff --cached
# 检查未暂存变更
git diff
辅助脚本
本技能包含常用操作的辅助脚本:
get_branch_diff.sh
提取分支差异,包括:
- 默认分支名称
- 合并基准点提交
- 提交列表及统计信息
- 变更文件摘要
用法:
bash scripts/get_branch_diff.sh
输出格式:
默认分支: main
合并基准点: abc123def456
提交数: 5
变更文件数: 12
get_commit_history.sh
以结构化格式提取详细的提交历史:
用法:
bash scripts/get_commit_history.sh <合并基准点>
输出格式(每行一个提交):
哈希值|主题|作者姓名|作者邮箱|日期
最佳实践
- 始终使用合并基准点:从合并基准点比较,而不是从基础分支的当前状态
- 并行运行命令:收集多个信息时,并行运行独立的git命令
- 结构化输出:将git输出解析为结构化数据以便于使用
- 优雅处理错误:在继续之前检查命令是否成功
常见模式
模式1:完整分支分析
# 并行获取所有信息
git status &
git diff --cached &
git diff &
默认分支=$(git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@')
合并基准点=$(git merge-base origin/$默认分支 HEAD)
git log --oneline $合并基准点..HEAD
git diff --stat $合并基准点..HEAD
wait
模式2:提交历史提取
# 获取结构化提交数据
合并基准点=$(git merge-base origin/$(git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@') HEAD)
git log --format="%H|%s|%an|%ae|%ad" --date=iso $合并基准点..HEAD
模式3:变更摘要
# 获取高级别变更摘要
合并基准点=$(git merge-base origin/$(git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@') HEAD)
echo "提交数: $(git log --oneline $合并基准点..HEAD | wc -l)"
echo "变更文件: $(git diff --stat $合并基准点..HEAD | tail -1)"
与其他技能的集成
本技能与以下技能配合良好:
github-pr最佳实践:使用git分析结果生成PR内容- 提交消息生成:分析变更以创建有意义的提交消息
- 代码审查:理解审查目的的变化
错误处理
处理常见的git错误:
# 检查是否在git仓库中
if ! git rev-parse --git-dir > /dev/null 2>&1; then
echo "错误:不在git仓库中"
exit 1
fi
# 检查远程是否存在
if ! git ls-remote origin > /dev/null 2>&1; then
echo "错误:未找到远程'origin'"
exit 1
fi
# 检查分支是否有提交
if [ -z "$(git log --oneline $合并基准点..HEAD)" ]; then
echo "警告:分支中未找到提交"
fi
输出格式建议
呈现git分析结果时:
- 摘要优先:从高级别统计信息开始
- 结构化数据:使用一致的格式以便于解析
- 上下文信息:包含分支名称和日期
- 可操作的见解:突出显示任务中的重要内容
示例输出结构:
分支分析摘要
-----------------------
基础分支: main
当前分支: feature/new-feature
分叉于: abc123d (2025-01-15)
变更:
- 5个提交
- 12个文件变更
- 234行插入,89行删除
最近提交:
1. feat(api): 添加新端点 (2025-01-16)
2. test(api): 添加端点测试 (2025-01-16)
3. docs(api): 更新API文档 (2025-01-17)
...
相关Git命令参考
有关详细的git命令文档和高级使用模式,请参阅参考文档.md。