Git对比分支时忽略指定变更及模拟Rebase后对比的方法
Git分支对比实用技巧:忽略特定变更/分支变更
问题1:如何在Git中对比两个分支,同时忽略其中一个分支的部分变更?
这个需求分两种常见场景,对应不同的解决方法,咱一个个说:
场景1:忽略分支中特定文件/目录的变更
如果你只是不想看到某几个文件或目录的修改内容,直接在git diff命令后加路径排除规则就行,用:!前缀标记要忽略的路径:
# 对比branch1和branch2,忽略branch2里的docs目录和config.yaml文件 git diff branch1 branch2 -- ':!docs/' ':!config.yaml'
注意路径是相对于仓库根目录的,要是路径里有空格,记得用引号包裹起来。
场景2:忽略分支中特定Commit的变更
如果要忽略的是某个具体Commit的所有变更,有两种简单方式:
- 临时分支法(直观好理解):
# 基于目标分支创建临时分支 git checkout -b temp-branch branch2 # 回滚要忽略的commit c(替换成实际的Commit哈希) git revert --no-edit <commit-c-hash> # 对比branch1和临时分支 git diff branch1 temp-branch # 对比完删掉临时分支 git checkout branch1 git branch -D temp-branch
- 管道过滤法(无需创建分支):
# 对比branch1和branch2,排除commit c的变更 git diff branch1 branch2 -- $(git diff --name-only <commit-c-hash>^ <commit-c-hash> | sed 's/^/:/!')
这个命令先找出commit c修改过的所有文件,再在diff时排除这些文件的变更,一步到位。
问题2:如何对比branch1与branch2,同时忽略master分支中的变更(即commit c),效果等同于将branch2变基到master后再对比?
你想要的效果本质是只看branch2相对于master的独有变更,和branch1之间的差异,不用实际执行rebase(避免冲突风险),用Git的范围对比就能实现:
方法1:三点语法快速实现
git diff branch1 master...branch2
这里的master...branch2表示branch2相对于master的所有新增变更(也就是把branch2 rebase到master后,branch2独有的内容),这个命令直接对比branch1和这些变更的差异,和你rebase后再对比的结果完全一致。
方法2:明确指定对比范围(更清晰)
如果觉得三点语法有点抽象,也可以直接指定对比的起点:
git diff branch1 $(git merge-base master branch2)..branch2
git merge-base master branch2会找出master和branch2的共同祖先,..branch2表示从这个祖先到branch2的所有变更,对比branch1和这个范围的内容,同样能达到rebase后对比的效果。
验证小技巧
要是你不确定结果对不对,可以创建测试分支实际rebase验证:
git checkout -b test-rebase branch2 git rebase master git diff branch1 test-rebase # 和前面的命令结果对比,应该完全一致 git checkout branch1 git branch -D test-rebase
内容的提问来源于stack exchange,提问作者Mr_and_Mrs_D
相关产品推荐
相关产品推荐

