KEIS BLOGは株式会社ケイズ・ソフトウェアが運営しています。

KEIS BLOG

マージコミットが含まれてるブランチをとにかくスカッシュしたい


Gitではスカッシュが困難な状況がいくつか存在し、その中でもマージコミットが含まれている場合はちょっとはまることがあります。以下、そのような状況での対処法について解説します。

1. 手動での対処

話の前提として、普段スカッシュに git rebase のインタラクティブモードを使うものとします。どのコミットをスカッシュしたいか選択できますし、普通はこの方法をつかうと思います。

1.1. 一時的なブランチを作成して、そこに目的のブランチ(例:feature/test)をチェックアウトします。

1git checkout feature/test
2git checkout -b temp-branch

1.2. 対象となるマスターブランチ(例:master)にリベースします。

1.3. コンフリクトが発生した場合は、それを解消します。

1.4. マージコミットを手動で一つ一つ適用していきます。

1.5. マスターブランチにこの一時的なブランチをマージします。

1git checkout master
2git merge temp-branch

・・・まあ、これが出来るならこれでやればいいと思います。地獄かよという作業になるのが普通でしょう。

2. git reset --softを使った方法

今のコミットからガサッーと全部スカッシュしちゃって良ければ以下の方法も使えます。

1git checkout feature/test
2git checkout -b temp-branch
3git reset --soft [スカッシュしたいコミットIDの一個前のコミットID]
4git commit

です。

上記でスカッシュしたやつを、

1git checkout master
2git merge temp-branch

します。

これについては実際に検証してみる事が出来るように、まず、シンプルなGitリポジトリとその履歴を作成するとこから書きます。

初期セットアップ


# 新しいGitリポジトリを作成
mkdir git-squash-example
cd git-squash-example
git init

# ファイルを作成して初めてのコミットを行う
echo "Hello, World!" > hello.txt
git add hello.txt
git commit -m "Initial commit"

feature-branchの作成

次に、feature-branchを作成してそこにいくつかの変更を加えます。


# 新しいブランチを作成
git checkout -b feature-branch

# 新しいファイルを作成
echo "Some feature content" > feature.txt
git add feature.txt
git commit -m "Add feature file"

# hello.txtを編集
echo "Hello, Git!" > hello.txt
git add hello.txt
git commit -m "Edit hello.txt"

masterブランチへの変更とマージ

masterブランチで変更を行い、その後でfeature-branchをマージしてマージコミットを作成します。


# masterに戻る
git checkout master

# hello.txtを編集
echo "Hello, Everyone!" > hello.txt
git add hello.txt
git commit -m "Edit hello.txt in master"

# feature-branchをマージ(マージコミットが作成される)
git merge feature-branch --no-ff

# コンフリクトが発生するので、両方の親を混ぜたようなマージを作りましょう。
echo Hello, Everyone and Git! > hello.txt
git add .
git merge --continue

これでマージが含まれたコミットが出来ました。これをスカッシュしたいわけですね。

スカッシュの実行


git reset --soft <スカッシュしたいコミットIDの一つ前のID>
git commit -m "New squashed commit"

無事スカッシュ出来たと思います。
git rebase -i ではスカッシュ出来ないことも確認してみてください。