

たとえば3つ前のコミットメッセージを修正したいときに、

  * git log
  * git rebase -i コミットID
  * r
  * 書き換えて保存

としています。もっと手軽にやる方法はありますか？


CC BY-SA 3.0
2018-04-09T16:00:36.707
43104
2018-04-10T06:45:15.563
12896
question
git
過去のコミットメッセージの修正方法


`git rebase -i <commit-id>`するまでの省力化を考えてみました。  
以下は`bash`が動く環境を前提としています。

[code]

    git log --pretty=oneline | cat --number-nonblank; select id in $(git log --pretty=oneline | cut --delimiter=' ' --fields=1); do git rebase -i "$id"; break; done
    
[/code]

申し訳ないことにgitのaliasにする方法を見つけきれませんでしたが、関数としてbashrcに書いておくことはできました。

[code]

    selrb() { 
        git log --pretty=oneline | cat --number-nonblank && select id in $(git log --pretty=oneline | cut --delimiter=' ' --fields=1);
        do
            git rebase -i "$id";
            break;
        done
    }
    
[/code]


CC BY-SA 3.0
2018-04-09T21:51:41.933
43105
2018-04-10T06:45:15.563
2018-04-10T06:45:15.563
25936
25936
43104
answer


直前のコミットであれば`git commit
--amend`で直接コミットメッセージを編集出来ますが、2つ以上前のコミットメッセージを書き換えるには(既に使われている)`rebase`の手順しかないと思います。


CC BY-SA 3.0
2018-04-10T04:39:06.237
43113
2018-04-10T04:39:06.237
3060
43104
answer


### rewrite-history.sh

[code]

    #!/bin/bash
    
    refspec="$1"
    export MSG="$2"
    export REWRITE_REF=$(git log -n 1 --format=%H "$refspec" )
    git filter-branch --msg-filter '
          if [ $GIT_COMMIT = $REWRITE_REF ]
          then
            printf "%s\n" "$MSG"
          else
            cat
          fi
        ' "$refspec"^..HEAD
    
[/code]

### 使い方

[code]

    path/to/rewrite-history.sh master^3 "commit message"
    
[/code]

### 注意点

  * filter-branch でゴリゴリコミットを書き換えていくので、書き換えた commit 移行、すべての sha がおきかわります。


CC BY-SA 3.0
2018-04-10T06:23:28.017
43118
2018-04-10T06:37:06.130
2018-04-10T06:37:06.130
754
754
43104
answer