我如何发现一个差异(diff)包含哪些提交(commits)?

3
如果我收到一个类似于git diff rev^ rev或者git show -p rev生成的补丁文件,我如何发现哪些提交被差异化了呢?
我不确定这个用例在Git中是否相关,但是在cvs/svn中在补丁头中注明文件路径和/或修订号会让我感到温暖和舒适,因为我收到或创建的补丁与正确的源或修订版本进行了差异化。
具体来说,如果我们检查一个Git差异头:
diff --git a/lib/blueprint/semantic_class_names.rb b/lib/blueprint/semantic_class_names.rb
index 41bd496..c17af1d 100644
--- a/lib/blueprint/semantic_class_names.rb
+++ b/lib/blueprint/semantic_class_names.rb

我无法找到有关此差异涉及的提交的任何区分信息。有一个索引行,我只能假设它不是缩写的提交哈希,而是文件差异部分的哈希。它肯定不匹配相关的提交签名。
如果我对几个文件进行差异比较,并决定采用旧式的电子邮件补丁,那么在发送我制作的补丁之前,我是否没有办法快速地双重检查我是否已经正确地进行了文件/修订的差异比较,只需查看标题?我了解在Git中,由于其分布式性质,修订版本并不像在cvs/svn中那样有意义,但我是否是唯一一个希望在标题中至少看到文件的缩写提交签名的人?

有趣的问题。我期待着回答。 - Charlie Flowers
3个回答

3

差异中提供的哈希实际上是一个blob的哈希。

因此,您可以使用此问题中提供的方法找到包含该blob的提交:Git:哪个提交包含此blob?


1
如果您使用git show <rev>(或git show -p <rev>),您将获得一个补丁,其中包括提交标识符、作者、日期和提交消息。
$ git show rel
commit 82bf5b5df1e0308939a6e91cf4c7d2dae8088d99
Author: Brian Campbell 
Date:   Thu Mar 5 14:00:54 2009 -0500
Update another file diff --git a/another b/another index 2102854..4083e0c 100644 --- a/another +++ b/another @@ -1 +1,3 @@ Yet another + +More lines \ No newline at end of file
补丁工具通常会忽略补丁开头的额外内容,因此整个输出都可以用作补丁。您还可以使用git format-patch来获取格式化后更容易自动发送的内容,例如使用git send-emailgit imap-send
正如htanata所指出的那样,在单个文件的diff头中看到的是blob标识符;虽然您可以使用它来查找可能来自的修订版本,但这将会很慢,而且不一定正确。如果您需要引用提交,请最好保留包含补丁的头部提及提交。

0
你可以很容易地挑选出引入树中已知路径上特定 Blob ID 的提交记录。
例如,带有“blob_path”设置为补丁影响的树中路径,并且“blob_sha1”是补丁中简短的 sha1(即紧随补丁中“diff”行后面的内容),此简短脚本将查找引入该文件版本的提交记录。
for h in $(git log --pretty=format:%H "$blob_path")
do
    test "$(git rev-parse "$h:$blob_path")" = "$(git rev-parse "$blob_sha1")" &&
        echo $h
done

当然,你可能想要最新的提交,仍然具有该文件的版本,在这种情况下,你需要在git log --pretty=format:%H "$blob_path"中立即出现在其前面的提交的父级。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接