🎉

git - 複数コミットを一つにまとめてマージするまで

に公開

やりたいことと背景

gitで開発中、複数の細かい修正(複数コミット)をfeatureブランチ上で行い、最後にdevelopブランチにマージする際に、分かれたコミットを一つにまとめたくなることがあります。

githubを使用していると、Squashマージという機能がデフォルトで使用できるので、それをポチッと押すと期待する動作 = 複数コミットを一纏めのコミットにしてマージすると言うことができるのですが、諸事情でこのSquashマージを禁止しているプロジェクトがあります。

事情は色々ありますが、Squashマージを許可すると、developから派生したブランチAに対して、develop -> ブランチAへのマージを時間を置いて複数回やる場合競合が発生してしまう(一度ブランチAに取り込んだ差分が、もう一度別の差分として取り込まれる動きになる)とか、まあ色々Squashに纏わるトラブルがあると聞いています。

やり方

Squashマージをせずとも、複数のコミットをfeatureブランチのマージ前に纏めることができます。既にコミットをpush済でもできます。

developから発生したfeature/branch_aで作業している場合。まず自分がいるブランチを確認します。

注意: ブランチを自分だけが作業している状態であることを確認して下さい。他のメンバーが同じブランチで作業している場合トラブルになりがちです

git status
Your branch is up to date with 'origin/feature/branch_a'.

次に以下を実行します。

git rebase -i develop

vi(vim?)が開かれます

pick f392171 Commit message 1
pick d7322aa Commit message 2
pick c9318f4 Commit message 3

コミットが、古いものが上、新しいものが下で開かれます。ここで、pickは残したいコミットです。pickの部分をsquashまたはsに書き換えると、直近の過去のpickにコミットが統合されます。

最古のコミット一つだけを残したい場合こうします。

pick f392171 Commit message 1
s d7322aa Commit message 2
s c9318f4 Commit message 3

ESC押下後、:q!で作業をキャンセルできます。:wqで保存して終了できます。
うまくいくとSuccessfully rebased and updated...と表示されます。

エラーや間違えた場合

git rebase --abort

で、rebaseを最初からやり直しできます。

push済の場合、以下でリモートブランチに変更を反映させることができます。

git push --force-with-lease
git fetch

この状態でfeatureブランチをdevelopブランチに通常マージすれば、実質的にGithubのSquashマージをした場合と同じ効果が得られます。

Discussion