1. ホーム
  2. 記事一覧
  3. gitのコミット履歴を整理するためにsquashを使いこなそう

2023.11.26

gitのコミット履歴を整理するためにsquashを使いこなそう

Squashを使用する目的とメリット

Squashは、複数のコミットを1つのコミットにまとめる操作です。Squashを使用すると、コミットの履歴を整理したり、コミットのメッセージや変更内容を変更したりすることができます。

使用シナリオの例

Squashは、以下のシナリオでよく使用されます。

開発中の頻繁な微調整

開発中、特に新機能の開発やバグ修正時には、多くの小さなコミットが発生することがあります。これらのコミットは、最終的な成果物には重要ではなく、履歴を乱雑にする可能性があります。例えば、タイプミスの修正や小さなコードのリファクタリングなどです。

例えば、新機能の「ボタンのデザインを変更する」というコミットと「ボタンの挙動を変更する」というコミットを1つにまとめることができます。これにより、Git履歴が整理され、変更内容が一目でわかるようになります。

コードレビューの準備

プルリクエストやコードレビューを行う前に、関連する変更を1つのコミットにまとめることで、レビュアーの理解を助け、レビュープロセスをスムーズにします。

例えば、新機能の「ユーザー登録機能を追加する」というコミットを、複数の小さなコミットに分けて実装し、コードレビュー前に1つにまとめることができます。これにより、コードレビュアーが変更内容をより簡単に理解し、効率的にレビューを行うことができるようになります。

ワークフローの整理

複数の開発者が関与する大きな機能開発では、個別のコミットが多くなりがちです。これらを意味のある単位にまとめることで、プロジェクトの歴史を追いやすくします。

例えば、複数の開発者が関与する「Webサイトのデザインを変更する」という大規模な機能開発において、各開発者の変更を1つにまとめることができます。これにより、将来的に変更内容を理解したり、必要に応じて変更を取り消したりすることが容易になります。

Squashを使う主なメリット

Squashを使用する主なメリットは、以下の3つです。

履歴の簡潔化

Squashを使用すると、複数のコミットを一つのコミットにまとめることができます。これにより、Git履歴が整理され、変更内容が一目でわかるようになります。

コードレビューの効率化

一連の小さなコミットを一つにまとめることで、コードレビュアーが変更内容をより簡単に理解し、効率的にレビューを行うことができます。

メンテナンス性の向上

関連する変更が1つのコミットに集約されていると、将来的にその変更を理解したり、必要に応じて変更を取り消したりすることが容易になります。

コラム:squashの語源

squashの語源は、英語の動詞「squash(スカッシュ)」です。squashは、野菜の「かぼちゃ」や「ズッキーニ」を潰すという意味の動詞です。squashの操作は、複数のコミットを1つのコミットに「潰す」ことに似ていることから、この名前が付けられたと考えられています。

また、squashは、複数のものを1つにまとめるという意味の「圧縮」や「統合」という意味でも使用されます。この意味でのsquashも、squashの操作と関連しています。

なお、GitのSquashは、英語では「squash merge」または「squash commit」とも呼ばれます。

Gitにおけるsquashとは何か?

squashは、Gitの強力な機能の一つで、複数のコミットを一つのコミットに統合する操作を指します。このプロセスでは、複数の変更を含むコミットが、一つの新しいコミットに「潰され」、一連の変更が単一のコミットとして履歴に残ります。結果として、Gitのコミット履歴がより整理され、見通しが良くなります。

いつ、なぜsquashするのか

squashの使用は以下のようなシナリオで特に有用です。

コミットの簡潔化

開発中に発生する小さな修正や、一時的な変更を一つにまとめて、履歴を整理したい場合。

コードレビューのための準備

プルリクエストを作成する際に、関連する一連のコミットを一つにまとめて、レビューを容易にしたい場合。

機能の完全な実装の表示

特定の機能やバグ修正が完了したときに、その全体像を示すために、関連する全てのコミットを一つに統合したい場合。

squashがコミット履歴に与える影響

squashを使用すると、Git履歴が以下のような点で改善されます。

履歴のクリーンさ

squashを使用すると、Git履歴がスッキリとして、特定の変更点を追跡しやすくなります。これにより、履歴の可読性が向上し、プロジェクトの進行状況をより簡単に理解できます。

情報の集約

関連する変更が一つのコミットにまとめられることで、変更の内容が明確になり、将来のレビューやメンテナンスが容易になります。

コミットメッセージの明確化

複数のコミットを統合することで、コミットメッセージをより意味のあるものにすることができ、プロジェクトの歴史をより明確に記録できます。

squashの実践方法

ステップバイステップガイド

squashの操作は、Gitのリベース機能を使用して行われます。以下は、基本的な手順を踏んだ説明です。

1. リベースの開始

まず、リベースしたいコミットの範囲を決定します。コマンドはgit rebase -i HEAD~[N]を使用します。ここで、[N]は統合したいコミットの数です。

git rebase -i HEAD~3

このコマンドを実行すると、テキストエディタが開き、リベースするコミットのリストが表示されます。

pick commit_hash_1
squash commit_hash_2
squash commit_hash_3

git rebaseについてはこちらの記事で詳しく解説しています。

https://envader.plus/article/244

2. Squashの選択

コミットの前にpickと書かれているものをsquashまたはsに書き換えます。最初のコミットはpickのままにし、続くコミットをsquashにします。これにより、pickされたコミットにsquashされたコミットが取り込まれます。

pick commit_hash_1
squash commit_hash_2
squash commit_hash_3

3. コミットメッセージの編集

全てのコミットをsquashに書き換えた後、新しいコミットメッセージを入力します。不要なメッセージは削除またはコメントアウトします。

pick commit_hash_1
squash commit_hash_2
squash commit_hash_3

# 新機能の完全な実装

4. 変更の確定

新しいコミットメッセージを保存し、リベースを完了します。

git rebase --continue

具体的な例

例として、以下のようなコミットがあったとします。

コミットA: 新機能の初期実装
コミットB: 新機能のバグ修正
コミットC: 新機能の改善

これらを1つのコミットにまとめる場合、次のように操作します。

git rebase -i HEAD~3

# 編集
pick commit_hash_1
squash commit_hash_2
squash commit_hash_3

# 新機能の完全な実装
git rebase --continue

注意点

  • 安全な環境での実行

    Squash操作は履歴を改変するため、誤って重要な情報を失わないように注意が必要です。実験的な変更は、新しいブランチで試すことをお勧めします。

  • 共有されたブランチでの使用の注意

    他の開発者と共有しているブランチでSquashを行うと、他の開発者の作業に影響を与える可能性があるため、事前にチーム内で確認することが重要です。

Squash後のリモートへの反映

Squash操作後、ローカルのコミット履歴がリモートの最新の履歴と異なるため、通常のgit pushでは拒否されることがあります。このような場合、強制プッシュ(git push -f)を使用して変更をリモートに反映させる必要があります。

強制プッシュの例

# ローカルリポジトリで変更を確認
git log

# 強制プッシュの実行
git push -f origin [ブランチ名]

注意点

強制プッシュによるリモートリポジトリの履歴上書きのリスク

強制プッシュは、リモートリポジトリの履歴を上書きします。他の開発者の作業が含まれる場合、それらの変更を失うリスクがあります。共有されているブランチに強制プッシュを行う前には、チーム内での十分なコミュニケーションと、リモートリポジトリのバックアップの取得が必要です。

コンフリクトの解決

強制プッシュを行った後に、他の開発者がリモートの最新の状態に基づいて作業をしていた場合、コンフリクトが発生する可能性があります。このような場合は、以下のステップで解決します。

# 最新のリモート状態の取得
git pull origin [ブランチ名]

# コンフリクトの手動解決
`git status` でコンフリクトが発生したファイルを確認
`vim [ファイル名]` などでファイルを開き、コンフリクトを解決

# 再度のコミットとプッシュ
git add [ファイル名]
git commit -m "[コミットメッセージ]"
git push origin [ブランチ名]

まとめ

GitのSquash機能は、複数のコミットを1つのコミットにまとめる操作です。この機能は、コミット履歴の整理や、コードレビューの準備、機能の完全な実装の表示など、さまざまな場面で役立ちます。

Squashを行う際には、以下の点に注意が必要です。

強制プッシュ(git push -f)は、他の開発者の作業を上書きする可能性があるため、共有ブランチでは慎重に行うべきです。Squash操作や強制プッシュによってコンフリクトが発生する可能性があるため、その場合は適切に手動で解決する必要があります。

Squashを理解し、適切に使用することで、Gitを用いたソフトウェア開発の効率性と整理性を向上させることができます。

エンベーダー編集部

エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

RareTECH 無料体験授業開催中! オンラインにて実施中! Top10%のエンジニアになる秘訣を伝授します! RareTECH講師への質疑応答可

関連記事