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

Git 从还原提交中检索原始提交哈希,git,git-revert,Git,Git Revert,假设我有这样的历史: ... * c1 ... * cr: git revert c1 ... 给定cr的提交散列,是否有一种编程方式来检索c1的提交散列?它不需要是瓷制的,管道也很好。如评论中所述,这依赖于正常的恢复日志消息,但在其他方面很容易: git log -1 --format=%B $revspec | \ perl -n -e '/^This reverts commit ([0-9a-f]+)/ && print $1 ' (其中,$revspe

假设我有这样的历史:

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

给定
cr
的提交散列,是否有一种编程方式来检索
c1
的提交散列?它不需要是瓷制的,管道也很好。

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

git log -1 --format=%B $revspec | \
    perl -n -e '/^This reverts commit ([0-9a-f]+)/ && print $1 '
(其中,
$revspec
是您打算命名恢复提交的方式,无论它是原始SHA-1还是类似于
master~5
,或者其他什么)


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

如注释中所述,这依赖于正常的恢复日志消息,但在其他方面很简单:

git log -1 --format=%B $revspec | \
    perl -n -e '/^This reverts commit ([0-9a-f]+)/ && print $1 '
(其中,
$revspec
是您打算命名恢复提交的方式,无论它是原始SHA-1还是类似于
master~5
,或者其他什么)


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

是。默认还原日志消息包含原始日志的ID。您可以分析git日志来找到它

如果您没有使用默认的恢复消息怎么办?你是索尔。为什么?其他任何地方。您无法派生原始提交ID

提交ID表示它不包含有关其校验和的信息。无法从校验和中提取有关提交的信息

您是否可以将差异与上一次提交一起使用以重新生成原始提交消息?同样,没有。首先,它不能保证差异是相同的,例如可能有冲突或差异的碎片可能已经移动。更重要的是,包括文件内容、日志消息、日期等。要生成原始提交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 => {

对。默认还原日志消息包含原始日志的ID。您可以分析git日志来找到它

如果您没有使用默认的恢复消息怎么办?你是索尔。为什么?其他任何地方。您无法派生原始提交ID

提交ID表示它不包含有关其校验和的信息。无法从校验和中提取有关提交的信息

您是否可以将差异与上一次提交一起使用以重新生成原始提交消息?同样,没有。首先,它不能保证差异是相同的,例如可能有冲突或差异的碎片可能已经移动。更重要的是,包括文件内容、日志消息、日期等。要生成原始提交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 revert
会给您写一条提交消息,上面写着
This revert commit
。出于某种原因,这是缺失还是不正确?(如果是这样的话,你大部分都是运气不佳:你可以尝试还原还原,然后看看是否可以使用
git cherry
找到具有相同更改的早期提交。在紧握的手上,通常你可以还原还原。)我需要原始提交,以便从中获取一些元数据。我应该补充我的问题,我正在寻找一个程序化的方式。你做了很多回复吗?这可能表明您的开发模型有问题。@Schwern:我通常根本不做恢复。我在这里试图解决的问题更多地与检测其他开发人员造成的混乱有关。通常,
git revert
会为您编写一条提交消息,上面写着
This revert commit
。出于某种原因,这是缺失还是不正确?(如果是这样的话,你大部分都是运气不佳:你可以尝试还原还原,然后看看是否可以使用
git cherry
找到具有相同更改的早期提交。在紧握的手上,通常你可以还原还原。)我需要原始提交,以便从中获取一些元数据。我应该补充我的问题,我正在寻找一个程序化的方式。你做了很多回复吗?这可能表明您的开发模型有问题。@Schwern:我通常根本不做恢复。我在这里试图解决的问题更多地与检测其他开发人员造成的混乱有关。@Cactus Git提交不以元数据的方式存储太多内容,它们依赖提交消息,这是一个遗憾。@Cactus Git提交不以元数据的方式存储太多内容,它们依赖提交消息,这是一个遗憾。