如何在不更改提交哈希的情况下更改git commit消息

时间:2011-03-06 19:53:33

标签: git history

标题不准确,但我无法用一行表达它。

  • 我实际上知道如何更改像here这样的git commit消息。
  • 但我知道它也会改变SHA-1,我想避免这种情况。

我只想在git-log看到其他消息。我认为可以使用git-notes以某种方式完成,但我还没有管理它。


说明:

我需要它来修复提交消息中的错误。我总是在那里写一个文件的名称,其中包含我与客户的沟通(看起来就像T1234 Replace foo by bar)。通信往往是相当长的,这样我就可以松了大量的时间,直到我发现我被错误的文件名提交信息的误导。

使用git-notes

看起来git-notes实际上按照here的规定运作。但是我总是使用

git log --oneline

所以我从不看到它。关于有关使混帐骗用户评论:恕我直言,这是可以接受的使用像--replace-messages-by-notes,是不是一个特殊的开关,当这种情况发生时唯一的?因为我总是使用别名而不是直接使用git log,所以我会得到我想要的东西而不需要输入很多东西。

您认为这是一个合理的功能要求,还是会向我推荐其他工作流程?

3 个答案:

答案 0 :(得分:15)

git notes是在不更改SHA1的情况下获得不同git日志消息(不同于提交消息)的唯一方法,如"Notes to Self" article中所述。

但有几点评论:

  • Notes由命名空间组织,默认值为“提交”。
  • 备注不要修改提交消息,只会添加(这可能是git notes无法为您工作的原因)。
  • 默认情况下不会推送注释,除非您明确指定它们的refspec(refs/notes/*

答案 1 :(得分:8)

正如各种人所指出的那样(例如在VonC's very useful answer中),git notes确实是你正在寻找的机制。您将别名更改为以下内容是不够的?

git log --oneline --show-notes

据推测,只是偶尔你必须为一个提交添加一个注释,这些注释在该命令的输出中会在视觉上突出显示。

如果你真的想要替换每个提交的主题,如果存在笔记,你总是可以创建一个脚本:

for c in $(git rev-list HEAD)
do
    n=$(git notes show $c 2> /dev/null)
    m=$(git show --oneline $c|head -1)
    if [ -n "$n" ]
    then
       m=${m/ */ $n}
    fi
    echo $m
done

......但在我看来,这对于微不足道的收获来说更加丑陋。

答案 2 :(得分:7)

从技术上讲,这似乎是不可能的(至少对我来说,我不是git pro)。

git commit存储树形哈希(想想:当时工作目录的状态)以及其他提交信息。当您更改提交消息时,树形哈希将不会更改,但是提交哈希将更改,因为它是从提交对象计算的,没有办法解决它。

有关详细信息,请参阅Progit internals