このブログをご覧のみなさん、こんにちは。

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

起因

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

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

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

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

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

  1. git commit -m "誤った内容"
  2. ファイルの修正内容変更
  3. git add ファイルの追加
  4. 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 回目のコメントでコミットするという対応をしています。

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