マージコミットが含まれてるブランチをとにかくスカッシュしたい
- 2023年10月09日
- CATEGORY- 1. 技術力{技術情報}
Gitではスカッシュが困難な状況がいくつか存在し、その中でもマージコミットが含まれている場合はちょっとはまることがあります。以下、そのような状況での対処法について解説します。
1. 手動での対処
話の前提として、普段スカッシュに git rebase のインタラクティブモードを使うものとします。どのコミットをスカッシュしたいか選択できますし、普通はこの方法をつかうと思います。
1.1. 一時的なブランチを作成して、そこに目的のブランチ(例:feature/test
)をチェックアウトします。
git checkout feature/test git checkout -b temp-branch
1.2. 対象となるマスターブランチ(例:master
)にリベースします。
git rebase master
1.3. コンフリクトが発生した場合は、それを解消します。
1.4. マージコミットを手動で一つ一つ適用していきます。
1.5. マスターブランチにこの一時的なブランチをマージします。
git checkout master git merge temp-branch
・・・まあ、これが出来るならこれでやればいいと思います。地獄かよという作業になるのが普通でしょう。
2. git reset --soft
を使った方法
今のコミットからガサッーと全部スカッシュしちゃって良ければ以下の方法も使えます。
git checkout feature/test git checkout -b temp-branch git reset --soft [スカッシュしたいコミットIDの一個前のコミットID] git commit
です。
上記でスカッシュしたやつを、
git checkout master git 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
ではスカッシュ出来ないことも確認してみてください。
- 2023年10月09日
- CATEGORY- 1. 技術力{技術情報}