0. まとめ
- rebase -i でコミットをまとめる(例:
git rebase -i HEAD~2) - テキストエディタが開くので、集約先の
pickはそのままにして、集約によって消したいコミットのpickをsまたはsquashに変更する- vim の場合、
:wqで保存して終了
- vim の場合、
- 再度テキストエディタが開くので、残したいほうのコミットのコメントを編集。
- vim の場合、
:wqで保存して終了
- vim の場合、
-
git push -f origin (ブランチ名)でプッシュ
1. コミットをまとめるときに注意すること
- 共同開発のリモートブランチに安易に git push -f するのは危険なので注意すること
-
push -fはリモートリポジトリに既に公開されているコミット履歴を改変してしまうので、他のメンバがpushしたコミットを上書きしたり削除してしまう可能性があります。
-
2. 詳細手順
rebase -i でコミット2つをまとめたいとする。
ひとまず git rebase -i。
(-i (--interactive)で過去のコミットを編集できます)
$ git rebase -i HEAD~~
または
$ git rebase -i HEAD~2
するとテキストエディタが開き、HEADから2つ分のコミットが表示される。
pick b71985f commit A
pick 32eea59 commit B
# Rebase 7a54171..32eea59 onto 7a54171 (2 commands)
(以下略)
集約先のコミット(残したいコミット)の pick はそのままにして、集約によって消したいコミットの pick を s または squash に変更する:
pick b71985f commit A
s 32eea59 commit B
# Rebase 7a54171..32eea59 onto 7a54171 (2 commands)
(以下略)
:wq で保存して終了。
すると、再度テキストエディタが開:
# This is a combination of 2 commits.
# This is the 1st commit message:
commit A comment
# This is the commit message #2:
commit B comment
(以下略)
残したいほうのコミットのコメントを好きなように編集する:
# This is a combination of 2 commits.
# This is the 1st commit message:
commit A comment + commit B comment
# This is the commit message #2:
# ここを消した
(以下略)
:wq で保存して終了。
最後にプッシュ:
git push --force-with-lease origin (ブランチ名)
--force-with-lease オプションは、リモートブランチが最後にフェッチした時点から変更されていない場合にのみ強制プッシュを実行します。これにより、他の開発者が変更を誤って上書きしてしまうリスクを軽減できます。
以上。