Gitのコミットを綺麗にまとめる方法
とりあえず方法を2つ(他に簡単な方法があれば知りたい)
-
git rebase -i
を用いる方法 -
git merge --squash
を用いる方法
git rebase -i を用いる方法
特徴
* squash や fixup など各コミットについて個別に細かい指定が可能
* 一般的なやり方(?)
サルでもわかるGit入門をまとめると以下の手順
-
git log
などで現在作業しているブランチの最初のコミットを確認 -
git rebase -i HEAD~(ブランチの最初から何回コミットしたか)
を実行
例)$ git rebase -i HEAD~3 - テキストエディタが開くので最初の行以降の
pick
になっている項目をsquash(もしくは省略でs)
に変更して保存、終了 - もう一度テキストエディタが開くので、コミットメッセージを編集して保存、終了
- push
git merge --squash を用いる方法
特徴
* コミット個別の設定云々よりもとにかく1つにまとまればOKの場合はこちらが簡単
* 最初のコミットが何個前か〜、順番が〜、コメントが〜、等を考えなくて良い
* 新規の別ブランチを使うので操作の失敗に強い(気がする)
サルでもわかるGit入門をまとめると以下の手順
- 現在のブランチがpushするブランチ名になっているか確認。もし なっていたらリネームする。
- ブランチのリネームは
git branch -m <古いブランチ名> <新しいブランチ名>
で可能 - push するブランチを新たに作成。※新規ブランチ作成はブランチ元をチェックアウトして行うこと
- 新たに作成したブランチをチェックアウトして
git merge --squash <まとめたいブランチ>
を実行 - コミットしてpush
具体例)
feature ブランチから feat/Proc1 を作成して作業していたが、push前に1つにまとめたい場合。
1. まずは作業していたブランチをリネーム
$ git branch -m feat/Proc1 feat/Proc1_hist
2. feature ブランチからコミットログの無い feat/Proc1 を新たに作成
$ git checkout feature
$ git checkout -b feat/Proc1 // ブランチ作成と同時にチェックアウト
これで
* feat/Proc1_hist :コミットログが溜まっている作業ブランチ
* feat/Proc1 :push用のブランチ(コミットログ無し)
が出来る
3. feat/Proc1 に対して feat/Proc1_hist を squash でマージ
$ git merge --squash feat/Proc1_hist
※ もし merge に --no-ff を設定していたら --ff も付ける
4. feat/Proc1_hist のコミットがまとめて stage されているのでコミット&push
$ git commit
$ git push origin feat/Proc1
※ 作業が完了したら必要に応じて feat/Proc1_hist を削除。