从提交列表生成git diff

时间:2013-08-28 12:48:38

标签: git

给出一系列提交,例如

b9dc80c commit msg 1 #530
88a4d3c another commit
1010bce commit msg 2 #530
040ac6d commit msg 3 #530
6b72683 another commit
ed17416 another commit
f49bbbd commit msg 4 #530

我希望看到#530提交中所有更改的差异。 到目前为止,我已经以一种方便的格式提供了所有适当的哈希值。

git log --oneline | grep #530 | awk -F" " '{print $1}' | xargs echo
# b9dc80c 1010bce 040ac6d f49bbbd

我可以以某种方式将这些提交“合并”为一个差异吗?也就是说,合并到内存中,而不会实际影响原始存储库。我知道我可以在一个单独的分支中挑选这些提交并进行区分,但这太复杂了。

用例是我想要查看指定了故障单ID的所有更改。

示例:

echo a > file
git add file && git commit "first"
echo b > file
git add file && git commit "second #XX"
echo a > file
git add file && git commit "third #XX"
the-special-command

我想到的是“diff”,“比较”#XX提交应该提供空输出,而不是对file进行两次单独的更改。

3 个答案:

答案 0 :(得分:1)

有两种选择:

  • 编写merge-the-commit-to-temporary-branch dance。
  • 使用patchutils包中的combinediff命令。

编辑:您可以使用log --grep简化“log | grep”,并将其设为--format的哈希值。

答案 1 :(得分:0)

为你找到的所有提交sha-1打印git show输出是否适合你?:

git log --oneline | grep #530 | awk -F" " '{print $1}' | xargs git show --oneline

如果你想"合并"输出,你只需要提取不必要的提交元数据......

或其他更多"合并友好": git log --oneline | grep a | awk -F" " '{print $1}' | xargs git show --pretty=format:

答案 2 :(得分:0)

这是一种略有不同的方法:

git checkout -b tempbranch b9dc80c
git rebase -i f49bbbd^
# remove all the commits that you don't want from the editor, and
# replace all the other "pick" commands except the first with "squash"
git log -1 -p

这将创建一个新分支,该分支最初包含与当前分支相同的提交序列。然后,在该分支上,rebase将消除您不提交的提交 我希望并将其余的东西压在一起。然后git log -1 -p步骤将 显示生成的补丁(您也可以使用git diff HEAD^ HEAD或其他几个补丁 根据您的需要,您可以选择略微不同的输出 使用补丁)。请注意,根据每次提交的更改的性质, 您可能必须在rebase期间解决一些冲突,但这不一定 异常...

完成此操作后,您可以放弃临时分支:

git checkout otherbranch
git branch -D tempbranch