Git功能分支代码差异比较完全指南
核心命令速查
1. 直接比较两个分支
git diff feature-branch-a feature-branch-b
git diff feature-branch-a feature-branch-b -- path/to/file.js
|
2. 比较分支与共同祖先
git diff master...feature-branch
git diff $(git merge-base master feature-branch) feature-branch
|
3. 查看提交历史差异
git log master..feature-branch --oneline
git log --oneline --graph --decorate master feature-branch
git merge-base master feature-branch
|
4. 详细差异分析
git diff --stat master feature-branch
git diff --numstat master feature-branch
git diff --name-only master feature-branch
git diff --name-status master feature-branch
|
5. 使用Commit ID进行比较
git diff abc1234 def5678
git diff abc1234 HEAD
git diff abc1234
git show abc1234
git show abc1234 --stat
git diff abc1234^ abc1234
git show abc1234
git diff abc1234~3 abc1234
|
6. Commit ID相关的实用技巧
git log -S "function_name" --oneline
git log --grep="bug fix" --oneline
git rev-parse --short abc1234
git rev-parse abc1234
git log abc1234..def5678 --oneline
git show abc1234:path/to/file.js
|
实际使用场景
场景1:Code Review前的自检
git diff master...HEAD
git log master..HEAD --oneline
|
场景2:比较不同功能分支的实现方案
git diff feature/user-auth feature/oauth-integration
git diff feature/user-auth feature/oauth-integration -- src/auth/
|
场景3:合并冲突预检查
git diff --name-only feature-a feature-b
git merge-tree $(git merge-base feature-a feature-b) feature-a feature-b
|
场景4:版本回滚和历史分析
git diff v1.2.0 HEAD
git diff abc1234^ abc1234
git diff abc1234 HEAD --stat
git diff v1.1.0 v1.2.0 --name-status
|
场景5:Cherry-pick前的预览
git show abc1234
git diff HEAD abc1234
git log --oneline --graph abc1234~3..abc1234^
|
语法解释
两点 vs 三点语法
git diff A..B 等价于 git diff A B - 比较两个分支的当前状态
git diff A...B - 比较A和B的共同祖先与B的差异
提交范围语法
master..feature - 在feature中但不在master中的提交
feature..master - 在master中但不在feature中的提交
master...feature - 两个分支的对称差异(mutual exclusive commits)
高级技巧
1. 创建差异补丁
git diff master feature-branch > feature.patch
git apply feature.patch
|
2. 可视化工具
git difftool master feature-branch
git difftool --tool=vimdiff master feature-branch
|
3. 忽略特定类型的差异
git diff -w master feature-branch
git diff --ignore-cr-at-eol master feature-branch
|
常见陷阱与注意事项
⚠️ 常见错误
混淆两点和三点语法
- 使用错误的语法可能看到不相关的差异
- 记住:三点语法用于查看分支特有的变化
忘记指定基准分支
git diff feature 比较的是工作区与feature分支
- 应该使用
git diff master feature
大文件差异性能问题
- 使用
--stat 先查看概览
- 对于大型二进制文件,考虑使用
--name-only
🔧 最佳实践
- 在合并前总是检查
git diff master...feature-branch
- 使用
--stat 快速了解变化规模
- 结合
git log 理解变化的上下文
- 对于复杂差异,使用可视化工具
📝 别名推荐
[alias] df = diff dfs = diff --stat dfn = diff --name-only branch-diff = "!f() { git diff $1...$2; }; f" feature-diff = diff master...HEAD
commit-diff = "!f() { git diff $1 $2; }; f" show-stat = show --stat last = log -1 HEAD --stat find-commit = "!f() { git log -S $1 --oneline; }; f" search-commit = "!f() { git log --grep=$1 --oneline; }; f"
|
总结
Git提供了灵活的分支和提交比较功能,关键是理解不同语法的含义:
分支比较
- 直接比较:
git diff branchA branchB
- 基于共同祖先:
git diff branchA...branchB
- 提交范围:
git log branchA..branchB
Commit ID比较
- 两个提交:
git diff commit1 commit2
- 提交与当前:
git diff commit HEAD
- 单个提交变化:
git show commit
- 提交与父提交:
git diff commit^ commit
快速查找Commit ID
git log --oneline -10
git log -S "关键字" --oneline
git log --grep="提交信息" --oneline
|
选择合适的命令和参数,可以精确了解不同功能分支或特定提交之间的代码差异,无论是用于代码审查、版本回滚还是历史分析。