4

给定一系列提交,例如

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

考虑到我想到的“差异”,“比较”#XX提交应该给出空输出,而不是对file.

4

3 回答 3

1

有两种选择:

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

编辑:您可以使用 简化“log | grep”log --grep并要求它仅使用--format.

于 2013-08-28T13:31:08.620 回答
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
于 2013-08-28T14:49:40.587 回答
0

git show您找到的所有提交 sha-1 的打印输出是否对您有用?:

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:

于 2013-08-28T13:06:20.030 回答