慣れてきたらコミットをまとめてPull Requestしよう(git merge --squash)より
複数のコミットを編集する・まとめる方法にはgit rebase -i
とgit merge --squash
が考えられます。
git rebase -i を使う
git rebase -i
を使ってコミットを編集する方法は、次の記事「Gitのコミットメッセージを後から変更する方法をわかりやすく書いてみた」でひさっしーが紹介していますが、この編集コマンドにedit
ではなくsquash
を使えば、複数のコミットを1つにまとめることができます。Pull Requestまでの流れを図示すると次のようなイメージ。
git logのcommitは上が最新だが、git rebaseのcommitは下が最新
新しいものを古いものに統合する方向
作業ブランチのコミットを直接編集できて分かりやすいですが、コミットが多いほどまとめる作業が面倒なので、最終1つのコミットでいい場合は不向きです。
git rebase <branch>
をつかう
Loading...
$ git checkout issue3
$ git rebase master
git mergeで最新状況を取り込んでいると常にマージコミットが作成される
rebaseを使えば対象ブランチの最新からコミットを生やし治すことができる
これを
こうできる
git merge –squash を使う
こちらは、作業ブランチ(例:work/xxx-867)とは別にPull Request用のブランチ(例:work/xxx)を切って、コミットをまとめたうえでPull Requestを送る、という流れになります。
コマンドの流れは次のような感じ。
# 作業ブランチをチェックアウト
$ git fetch
$ git checkout -b work/xxx-867 origin/develop
# git add や commit などして作業完了
# Pull Request用ブランチをチェックアウト
$ git fetch
$ git checkout -b work/xxx origin/develop
# 作業ブランチをマージ
$ git merge --squash work/xxx-867
# Pull Requestに出すコミットを作成
$ git commit
最後のコミットで viエディタを開き、一行目に「統合ブランチに反映する代表コミット」を記述。その下には取りまとめられた作業ブランチのコミットが自動で表示されるので、そのまま残しておきます。
こうしておけば、後から「取りまとめられた中にあるコミット」を対象とした操作をすることが可能です。
コードレビューなどPull Requestの単位が適切であれば、Pull Requestに出すブランチのコミットは1つで十分/適切なことがほとんどなので、Pull Requestの前にはgit merge --squash
が便利ですね。