我想查看只有两次提交的差异。
例如
$ 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相关的提交,即提交0ff4567
,1ff4567
,5ff4567
。
我不关心其余提交的差异。
有一种简单的方法吗?
更新:我知道相关提交的列表。鉴于此列表,我想获得一个差异,这更容易审查。
答案 0 :(得分:2)
您可以使用--grep
选项git log
,该选项仅输出具有与特定正则表达式匹配的日志消息的提交。在你的情况下,你可以这样做:
git log --oneline --grep='bug #1'
...如果你想看到每个提交引入的补丁,当然,你应该这样做:
git log -p --grep='bug #1'
在下面的评论中,您解释说您确实需要一个补丁作为输出,这表示这三个提交引入的补丁的累积效果。在这种情况下,您可以尝试以下之一:
combinediff
工具组合差异。 (这可能不起作用,具体取决于中间提交的更改。)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
分支是可能的,但这仍然是一个半自动设置(因为你必须解决可能的冲突)。