检查由一组提交引起的差异

时间:2011-10-23 08:17:48

标签: git

我想查看只有两次提交的差异。

例如

$ git log --oneline
0ff4567 fix bug #1, now really really really
1ff4567 fix bug #1 really
2ff4567 fix bug #2
3ff4567 fix bug #3
4234567 refactor code
5ff4567 fix bug #1
6234567 fix bug #4

我只想查看与错误#1相关的提交,即提交0ff45671ff45675ff4567

我不关心其余提交的差异。

有一种简单的方法吗?

更新:我知道相关提交的列表。鉴于此列表,我想获得一个差异,这更容易审查。

2 个答案:

答案 0 :(得分:2)

您可以使用--grep选项git log,该选项仅输出具有与特定正则表达式匹配的日志消息的提交。在你的情况下,你可以这样做:

git log --oneline --grep='bug #1'

...如果你想看到每个提交引入的补丁,当然,你应该这样做:

git log -p --grep='bug #1'

在下面的评论中,您解释说您确实需要一个补丁作为输出,这表示这三个提交引入的补丁的累积效果。在这种情况下,您可以尝试以下之一:

  • 使用patchutils中的combinediff工具组合差异。 (这可能不起作用,具体取决于中间提交的更改。)
  • 创建一个临时的新分支,并使用交互式rebase(可能在GIT_EDITOR环境变量中使用狡猾的构造命令)来重新排序和压缩提交。

要扩展后一个选项,此脚本基于("super-kludgy") example Jefromi {/ 3>}

#!/bin/sh

set -e

if [ $# -ne 2 ]
then
    echo "Usage: $0 REGEX TEMPORARY_BRANCH_NAME"
    exit 1
fi

REGEX="$1"
BRANCH_NAME="$2"

git checkout -b "$BRANCH_NAME"

FIRST_COMMIT=$(git log --grep="$REGEX" --pretty=format:%H | tail -1)
if [ -z "$FIRST_COMMIT" ]
then
    echo "No commits matched '$REGEX'"
    exit 2
fi

export GIT_EDITOR="f() { if [ \"\$(basename \$1)\" = \"git-rebase-todo\" ]; then sed -i -n '/${REGEX}/p' \$1 && sed -i '2,\$s/pick/squash/' \$1; else vim $1; fi }; f"
git rebase -i ${FIRST_COMMIT}^

...你可以调用它:

squash-matching-commits 'bug #1' tmp-branch

...然后将创建分支tmp-branch,将rebase返回到匹配bug #1的第一个提交的父级,仅选择与bug #1匹配的提交并压缩除{}之外的所有提交第一。 (您可能必须修复一些冲突,并为压缩的提交提供提交消息。)如果成功,那么您可以这样做:

git show

...看到组合补丁。我并不认真推荐任何人使用这个脚本,但我认为这是一种有趣和愚蠢的做法,我认为:)

答案 1 :(得分:1)

您可以使用git log --grep=fix1(如Git reference中所示)以隔离相关提交,然后为每次提交执行git show <commit>

请参阅“Shorthand for diff of git commit with its parent?”。

将这些补丁组合为单个差异并非易事,正如Jefromi在“git diff with author filter”中所解释的那样。

  

这里的问题是在一般情况下你不能这样做   假设Alice更改了特定文件,然后Bob更改了它 - 包括Alice更改的部分 - 最后Alice再次更改它   你如何将Alice的两个差异组合成一个差异?   如果你把它们作为两个补丁,那么第二个补丁根本不适用而不首先应用Bob的补丁!   但是你也不能简单地将最终状态与原始状态区分开来,因为这将包括鲍勃的变化。

在您的情况下,可能(非常繁琐)的解决方案应该类似于“Extract relevant changes for code review”:

  

在第一次更改之前检查修订版的工作副本。然后将所有相关提交合并到您的工作副本中   现在你有一个工作副本,它只是根据相关的变化而与它的基础不同。您可以直接查看,也可以从中创建补丁以供审核。

所以:一个专用的fix1_review分支是可能的,但这仍然是一个半自动设置(因为你必须解决可能的冲突)。