Git 一个分支的差异,不包括在其他分支中的提交

Git diff of a branch, excluding commits in other branch

为了进行代码审查,我经常对功能分支进行 git difftool hash_of_parent_of_first_commit_in_branch last_commit_in_branch。 feature_branch 是从它的源代码创建的(我们称它为 master 分支)并在其上完成了工作。但是在这中间,master分支收到了一些commit,这些commit被合并到feature_branch.

澄清一下,如果我使用的是 git 日志,则此命令很简单:git log feature_branch ^master(可能带有 --no-merges 或不带有,视情况而定)。有了这个,我会从 feature_branch.

中过滤掉主提交

我做了一些研究,但无法弄清楚如何实现这一目标。也许使用 cherry-pick?关于如何在 diff/difftool 命令上实现类似的东西有什么想法吗?

首先,您可以像这样获得合适的提交列表:

git rev-list --reverse --no-merges feature_branch ^master

这会获取 feature_branch 上所有无法从 master 访问的非合并提交。 reverse按时间顺序排列,适合应用。

其次,您可以挑选这些到临时分支:

git branch review $(git merge-base feature_branch master)
git checkout review
git rev-list --reverse --no-merges feature_branch ^master | xargs git cherry-pick

然后您的评论就会出现

git diff $(git merge-base feature_branch master)..review

请注意 xargs 可能很难以交互方式解决 cherry-pick 问题。您可以编写一个包装器脚本来使用 for 循环而不是 xargs 来完成所有这些操作,以使所有内容都很好地连接到终端。