Git,rebaseで過去のコミットの修正を行う.

ファイルを編集している際,三つ前のコミットに現在のコミットを取り込みたい状況が発生したとします. git rebaseを用いることで,過去のコミットの修正を行う事が出来ます.

 $ git log --oneline 
92244c6 (HEAD -> master) add file2
7651e79 add file1
aec26dc initial commit

ここで,遡りたいコミットのひとつ前のコミットのハッシをコピーし,

 $ git rebase -i aec26dc

と打つとエディタがひらいてコミットが羅列されているはずです.

変更を加えたいコミットに対してpick -> editと変更すると,そのコミットを変更することができます.

(変更前)

pick 7651e79 add file1
pick 92244c6 add file2

(変更後)

edit 7651e79 add file1
pick 92244c6 add file2

これでエディタを閉じるとeditとしたところでrebaseがストップし,新しく変更を記述することができます.

粗方過去のコミットに取り込みたい変更が追加し終わったら

 $ git add .
 $ git rebase --continue

としてrebaseを進めることができます.

ここで,過去のコミットに対してこのように変更を加えた場合,コミットログのハッシュが書き変わってしまうため,リモートにpushするときにはじかれてしまいます. rebaseが意図したものである場合は

 $ git push --force

とすることで強制的にremoteの変更をoriginに同期させることができます.

このrebaseによる操作をstashなどと組み合わせるとコミットログが簡潔にまとまり,後々コンフリクトなどに対応しやすくなると思います.