从还原提交中检索原始提交哈希

Retrieving original commit hash from a revert commit

假设我有这段历史:

...
* c1   
...
* cr: git revert c1
...

给定 cr 的提交哈希,是否有一种编程方式来检索 c1 的提交哈希?不用瓷的,水暖也可以。

如评论中所述,这依赖于正常的恢复日志消息,但在其他方面很容易:

git log -1 --format=%B $revspec | \
    perl -n -e '/^This reverts commit ([0-9a-f]+)/ && print  '

(其中 $revspec 是您打算命名还原提交的方式,无论是原始 SHA-1,还是类似 master~5 的东西)。

(如果提交消息中缺少 ID,您将不会得到任何输出。在这种情况下,或者如果 ID 存在但不正确,您几乎是 SOL。)

是的。默认恢复日志消息包含原始 ID。您可以解析 git log 来找到它。 .

如果您不使用默认回复消息怎么办?你是 SOL。为什么? Git doesn't store the revert information 其他任何地方。而且您无法推导出原始提交 ID。

提交 ID 是一个 cryptographic checksum,这意味着它 不包含任何信息 关于它是什么的校验和。您无法从校验和中提取有关提交的信息。

你可以使用与之前提交的差异来重新生成原始提交消息吗?再一次,不。首先,不能保证 diff 是相同的,例如可能存在冲突或者 diff 的部分可能已经移动。更重要的是,the commit ID is a checksum of more than just the content 包括文件内容、日志消息、日期等内容。您还需要知道所有这些才能生成原始提交 ID。

您撤消操作的最后避难所是 git reflog,但这对您也没有帮助。它将记录存在还原的事实,但该消息将是您提交消息的第一行。它不会包含原始提交 ID。


有希望,但不是程序化的。获取还原的差异,找到重要的更改行,删除 +-。现在 运行 git log -S'...yourline' 查找更改该行的提交。

例如,假设我有...

commit 2c257ccae4c124e7cff6cfa7ca069250fb33907f (HEAD -> master)
Author: Michael G. Schwern <schwern@pobox.com>
Date:   Thu Oct 8 20:19:26 2015 -0700

    dlfjalkdjflkadj

diff --git a/Build.PL b/Build.PL
index 8c87db4..bed5170 100644
--- a/Build.PL
+++ b/Build.PL
@@ -73,10 +73,6 @@ my $builder = MyBuild->new(
         # so some CPAN shells won't see it.
         "Module::Build"      => '0.36',
     },
-    recommends => {
-        # Significant performance improvements
-        autodie         => '2.26',
-    },

     meta_merge => {
         resources => {

然后我可以 运行 git log -S'Significant performance improvements' 并得到:

commit 2c257ccae4c124e7cff6cfa7ca069250fb33907f (HEAD -> master)
Author: Michael G. Schwern <schwern@pobox.com>
Date:   Thu Oct 8 20:19:26 2015 -0700

    dlfjalkdjflkadj

commit ac43bedc8c70fb851c7a594cace18d5fbad135ac
Author: Michael G. Schwern <schwern@pobox.com>
Date:   Wed Dec 31 14:46:05 2014 -0800

    Recommend the latest autodie which has significant performance improvements.

    It's loads much faster and uses much less memory and has significant bug fixes.
    None of this is required by perl5i, so I left the required version at what
    Debian stable is using.

    In the future this can be bumped to a requirement.

    For #284