やなぎにっき

学んだことの記録

過去のコミットの内容を変更する

Gitで過去のコミット内容を変更したときのメモ

やりたいこと

Gemfileなどの設定ファイルの最終行を入れ忘れるのをよくやってしまう。

Githubにpushした後に気づいたので、既にこの状態でコミットを数回かけてしまっている。 f:id:yana_g:20201111154757p:plain 修正したものを新たにコミットしてもいいんだけど、できるならGemfile追加したコミットで修正したい。

やったこと

git rebase -iを使って修正した。

1.修正したいコミットの1つ前のコミットハッシュを取得

$ git log -n 10 --oneline --reverse
897dd2a (master) first commit
31a7030 gemfileにkaminari追加
30c612d ページング処理実装
319ec6e kaminari_config.rb作成
6bfb404 default_per_page設定
3556732 (HEAD -> pagination, origin/pagination) 並び順の指定

※過去10個分のコミットを1行ずつ表示している


2.上記の 31a7030のコミットを修正したい場合
$ git rebase -i 31a7030

vimで表示されるコミットのうち、対象のコミットだけpickupをeditにして保存&終了

3.当該コミットがワークブランチに展開される
f:id:yana_g:20201111160119p:plain この状態で修正する
修正が終わったらgit addで変更をステージングする(忘れがち)
git commit --amendを実施することで、元のコミットを修正できる


4.最後にgit rebase --continueでコミットを修正される
同時に元の作業コミットに戻る f:id:yana_g:20201111160939p:plain

この場合通常のpushしてもエラーが出てしまうので、-fで強制プッシュを行う。
無事に修正できました f:id:yana_g:20201111160907p:plain


コミットは修正できましたが、同じ過ちを繰り返さぬようVSCode側の設定でtrimFinalNewlines をtrueにして自動で改行を入れてくれるように設定しました。



参考
git-rebase - 過去のコミットを修正したい(コミット分割、内容訂正・追加) akikumo_tea - Ruffnote (ラフノート)
VS Codeで行末やファイル末尾の空白文字を削除するには:Visual Studio Code TIPS - @IT

関連
なぜ最終行に改行が必要なのか - komagataのブログ