はじめに

gitで作業中のブランチから別のブランチにマージしたい時に、

細かくなってしまったコミットを1つにまとめるため、

rebaseコマンドを使いました。その時の手順についてです。

環境

・macOS Big Sur バージョン 11.6.1

準備

まず、 mainブランチで”first commit”というコミットメッセージでコミットし、

そこからブランチを切り、

“add A”,”add B”,”add C”というコミットメッセージのコミットをしました。

・マージ先のブランチ名:main

・マージ元の作業ブランチ名:branch1

この状態で、branch1ブランチからmainブランチへプルリクを作成すると、

GitHubのページでは、下記のようにブランチを切ってから行った3つのコミットが表示されます。

このままmainブランチにマージすると、

このコミット履歴が、mainブランチに含まれてしまうので、

3つのコミットを、1つにまとめていきます。

手順

対象のコミットログを確認

対象の作業ブランチをチェックアウトした状態で、git rebaseコマンドを使って行います。

まず、git logコマンドなどでコミット履歴を確認します。

上記のように、GitHubのページから確認しても大丈夫です。

確認するコミット番号は、作業ブランチをきる直前に行ったコミット番号になります。

git rebaseコマンドの実行

対象のコミット番号がわかったら、下記のようにgit rebaseコマンドを実行します。

git rebase -i "ブランチをきる直前のコミット番号"

今回は、作業ブランチで最初に行った”add A”よりも前のコミット”first commit”のコミット番号を指定して、

下記のコマンドを実行しました。

git rebase -i 7d0538579f4763f76c22f6fcb943bc7f01d12897

すると、下記のように、

作業ブランチで行ったコミットがすべて編集対象として表示されます。

この画面で、それぞれのコミットをどのように扱うかを指定できます。

(コミットの内容を採用するかしないかや、コミットメッセージを残すかどうかなど選ぶことができます)

指定方法は、一番上のそれぞれのコミット番号の左側に単語または省略文字を記載することで可能です。

初期の状態だと、pick=use commitが記載されています。

今回は、すべてのコミットを採用しつつ、

全てのコミットをまとめ、新しいコミットメッセージを付与したいので、

1番最初のコミット(”add A”)のみreword(コミットを採用するが、コミットメッセージを編集)

2, 3番のコミット(”add B”, “add C”)は、

fixup(変更内容を直前のコミットにマージし、コミットメッセージを破棄)とします。

それぞれのコミットをどう扱うかの指定が決まったら、エディタの保存を行います。

そうすると、次に下記の画面が開き、コミットメッセージの編集ができます。

最初のコミットメッセージが表示されるので、

コミットメッセージを好きなものに変更し、保存します。

コミットの強制プッシュ

そうすると、ローカルのリポジトリでは、

作業ブランチで行った全てのコミットをまとめた新しいコミットが作成されています。

これをリモートのリポジトリにプッシュするのですが、そのまま行うと、

コンフリクトしてしまうため、間違っていないことを確認した上で、

下記のコマンドオプションで、強制的にプッシュします。

git push -f origin branch1

確認

完了すると、下記のように

リモートでもローカルでも、全てのコミットがまとまった新しいコミットが作成されます。

先ほど確認したGitHubのページでも、

プルリクに表示されるコミットは、1つになっています。

この状態で、マージすることでコミット履歴も整理されます。