Извлечение исходного хэша коммита из аннулированного коммита

Предположим, у меня есть эта история:

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

Учитывая хеш коммита cr, есть ли программный способ получить хеш коммита c1? Это не обязательно фарфор, сантехника тоже подойдет.

2 ответа

Решение

Как отмечено в комментарии, это зависит от обычного сообщения журнала возврата, но в остальном это просто:

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

(где $revspec это способ, которым вы намереваетесь назвать возвратный коммит, будь то необработанный SHA-1 или что-то вроде master~5или что угодно).

(Если идентификатор отсутствует в сообщении фиксации, вы не получите никакого вывода. В этом случае, или если идентификатор присутствует, но неверный, вы в значительной степени СОЛ.)

Да. Сообщение журнала возврата по умолчанию содержит идентификатор оригинала. Вы можете разобрать git log найти его. @torek уже рассмотрел это.

Что делать, если вы не использовали возвращаемое сообщение по умолчанию? Ты SOL. Зачем? Git не хранит информацию об обратном где-либо еще. И вы не можете получить исходный идентификатор коммита.

Код фиксации - это криптографическая контрольная сумма, означающая, что она не содержит информации о том, что это контрольная сумма. Вы не можете извлечь информацию о коммите из контрольной суммы.

Не могли бы вы использовать diff с предыдущим коммитом для регенерации исходного сообщения коммита? Опять нет. Во-первых, не гарантируется, что разница будет такой же, например, возможно, произошел конфликт или части фрагмента могли перемещаться. Что еще более важно, идентификатор фиксации представляет собой контрольную сумму не только содержимого, включая такие вещи, как содержимое файлов, сообщение журнала, дату и т. Д. Вам также нужно знать все это для генерации исходного идентификатора коммита.

Ваше последнее прибежище для уничтожения вещей git reflog, но это тебе тоже не поможет. Он запишет тот факт, что произошел возврат, но сообщение будет первой строкой вашего сообщения о коммите. Он не будет содержать исходный идентификатор фиксации.


Есть надежда, но она не программная. Получите разницу в обращении, найдите значительную линию изменений, удалите + или же -, Теперь беги 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
Другие вопросы по тегам