コマンド git rebase -i HEAD~○
コミット履歴を変更したい。
何はともあれまず、git log
。
...これより下にはthird commit, second commit, first commit(最初)と続く。
↑にいくほど新しいコミット
↓にいくほど古いコミット
3つのコミット履歴を変更したければ
HEAD~○ の ○ を4に指定
(○ = 変更したい履歴の数 + 1)
(HEADは最新のコミットを指す)
つまり打ち込むコマンドは
git rebase -i HEAD~4
(HEAD~4 = HEADを含んで数えて4つのコミットを編集すると言う意味)
すると、
pick 0511...
pick 38c3...
...
pick 016d...
と書かれている部分が過去のコミットを表す。その下の#が説明文。
※注意
↓にいくほど新しいコミット
↑にいくほど古いコミット
(git log の時とは逆)
ここではsquashを説明
先ほどの画像でpick
と書かれた部分をsquash
またはs
と書き換えることで
コミット履歴を消し、コミット文を編集することができる。
(コミット履歴が消えるだけでそのコミットで行ったファイルの変更などは消えないので安心を)
キーボードのi
を押すとinsertモードに変わるので編集
編集後esc
ボタンを押し:wq
を入力してEnter
!注意!
squash
はそのコミットを1つ手前のコミット(1つ古いコミット)にマージさせるような処理なので
squash
と記述したコミットの上に、pick
となるコミットがなければエラーが起きる。(これがまた起きたら少々面倒なのじゃ...)
※もちろんこの画像における下から2つ目のpick
となっているコミットの部分をsquash
にしても、1番上のコミット(この中で1番古いコミット)がpick
となっているので成功する。
すなわち、
pick 0511..
squash 38c3...
squash 7177...
squash 016d...
でも成功する。今回は画像のようにpick
とs
交互のパターンで進める
コミット文を編集
上記の続き:
:wq
->Enter
を押すと下記のようにコミット文を編集できる画面に移行
#
はコメントアウトされている文なので無視
例によってi
を押しinsertモードに変更して編集
↓
例によってesc
->:wq
->Enter
すると次のコミットに関するコミット文の編集
↓
確認
git log
で確認してみると見事にコミット履歴が合併されている
注意
push
やpull
など、リモートリポジトリとやり取りした以降のコミット履歴しか編集してはならない。コミット履歴はプロジェクトの仲間と共有しているから、ハッシュ値そのものが変わってしまうと迷惑をかけることになる。ローカルのみにしか存在しないコミット履歴の範囲を編集してそれをpush
はOK。
非推奨のpush
は、した時に警告がでるのでそれを要確認。