git commit をやり直し&取り消し、コメントを修正する方法

git commitを実行した後でコミットをやり直したり、コミット自体を取り消す方法を調べたので、残しておきます。

起因

現在、主催している総武線沿線読書会で『アプレンティスシップ・パターン ―徒弟制度に学ぶ熟練技術者の技と心得 (THEORY/IN/PRACTICE)』を対象書籍として読んでいます。

この書籍の中で『読書リスト(Reading List)』という節があり、その中で自分の読書リスト(Reading List)を作成し、読んでいる書籍を記入、公開して、最新状態に常に更新し続けましょうというものがありました。それを切欠に以下で読書リスト(Reading List)を公開しました。

changeworld/reading_list

が、初回のコミット時にinitial commit.というコメントでコメントしていました。後になって、以下の資料を知り、コメントを修正しようと思い立ちました。

直前のコミットをやり直す

直前にしたコミットをやり直す場合、git commit --amendを使用します。

  1. git commit:誤った内容
  2. git add ファイルの追加やファイルの修正内容変更
  3. git commit --amend

但し、コミット時のIDは前のモノと異なるものになります。つまり、git commit --amendを使用した場合、元のコミットを上書きするのではなく、元のコミットを無効にし、その上に新たなコミットをするという動作になっています。

コミット自体を取り消す

コミット自体を取り消す場合には、git resetを使用します。git resetにはgit reset --softgit reset --hardの2種類があります。その違いは以下の通りです。

  • git reset --soft: ワークディレクトリの内容はそのままでコミットの内容だけを取り消す
  • git reset --hard: ワークディレクトリとコミットの内容を取り消す

コメントを修正する

過去のコメントを修正するには、git commit --amendgit rebase -iの2種類があります。

  • git commit --amend: 直前のコメントを修正する
  • git rebase -i: 過去のコメントを修正する

前者は上記の通りです。後者の使い方としては、変更したいコミットで一番古いものより一つ古いものを引数にして、git rebase -iを実行します。

過去2回分のコメントを修正する場合

git rebase -i HEAD~2

今回行った対応

作業前のコミットコメント

  1. initial commit.
  2. Add Killer UX Design to Comming up

コメントを修正したいだけですが、過去のコメントを修正する際に問題がありました。

それは、変更したいコミットで一番古いものより一つ古いものを引数にして、git rebase -iを実行します。という一文です。

修正したいのは初回のコミット=最も過去のコミットの為、それよりも1つ過去のコミットを引数にすることが出来ません。

そこで、以下の手順で対応をしました。

  1. git reset --hard HEAD^
  2. git commit --amend -m "Initial commit"
  3. 2回目の編集内容をファイルに反映
  4. git commit -m "Add Killer UX Design to Comming up"

まず最初に2回目のコミットを取り消し、その後に直前のコメントを修正しました。その後、2回目のコミット内容をファイルに反映し、2回目のコメントでコミットするという対応をしています。

もっとスマートな対応があるとは思いますが、この方法で対応することが出来ました。