更改特定提交的提交消息

时间:2016-08-11 09:37:07

标签: git git-commit git-rewrite-history amend

注意:与this one类似的问题,但有一些重要的更改。

在给定提交ID:

的情况下,我有以下函数来重写提交的日期
rewrite-commit-date () {
    local commit="$1"
    local newdate="$2"
    newdate="$(date -R --date "$newdate")"
    echo ">>>> Rewriting commit $commit date: $newdate"
    git filter-branch --env-filter \
        "if test \$GIT_COMMIT = '$commit'
         then
             export GIT_AUTHOR_DATE
             export GIT_COMMITTER_DATE
             GIT_AUTHOR_DATE='$newdate'
             GIT_COMMITTER_DATE='$newdate'
         fi" &&
    rm -fr "$(git rev-parse --git-dir)/refs/original/"
}

我正在尝试实现类似的函数rewrite-commit-message来更改提交消息。我想要的是:

  1. 函数rewrite-commit-message接受两个参数:commit_idnew_commit_message
  2. 无需知道旧的提交消息:让commit_id足以知道要更改的提交
  3. git commit --amend,因为这与旧提交相关(不一定与最近的提交相关)
  4. 不用担心重写历史记录和主回购:我在一个功能分支工作,我被允许做git push -f
  5. 我想使用filter-branch,但我不知道如何:
    • 将更改应用于特定提交:test功能中使用的rewrite-commit-dateenv-filter中使用,但我不会在此处执行env-filter,因为我不想更改与提交环境相关的任何内容,而是更改提交消息。
    • 如何强制提交邮件? --msg-filter需要原始提交消息。我不关心原始提交消息。是--force-msg-filter还是类似?
  6. 我正在寻找的内容类似于this,但有一些警告:

    1. 不要将更改应用于一系列提交,而是应用于特定提交
    2. 我不关心原始提交消息,因为我想完全覆盖它

1 个答案:

答案 0 :(得分:6)

这个小脚本的作用有以下几点:

  1. 这会将您的历史记录从提交重写到分支的顶端。因为您在问题中说明这不是问题,所以这符合条件。

  2. 您的提交包含在master分支中。您可以通过将分支名称作为另一个参数传递来轻松更改此设置,但提交更好将在分支中。您可能应该为此进行一些验证,可能使用git rev-parse --abbrev-ref HEADgit branch --all --contains <commit>

  3. 没有进一步的麻烦:

    #!/bin/bash
    
    change-commit-msg(){
    
      commit="$1"
      newmsg="$2"
      branch="master"
    
      git checkout $commit
      git commit --amend -m "$newmsg"
      git cherry-pick $commit..$branch
      git branch -f $branch
      git checkout $branch
    
    }
    

    演示

    git init
    echo init > a && git add . && git commit -m "init"
    echo another > a && git commit -am "another"
    echo lastly > a && git commit -am "lastly"
    git log --graph --oneline --all --decorate
    
    * bca608c (HEAD -> master) lastly
    * 4577ab5 another
    * b3d018c init
    
    change-commit-msg 4577ab5 "something else"
    
    * c7d03bb (HEAD -> master) lastly
    * 3ec2c3e something else
    * b3d018c init