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を用いたソフトウェア開発の効率性と整理性を向上させることができます。

【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

IT未経験者必見 USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。

「フリーランスエンジニア」

近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。

「成功する人とそうでない人の違いは何か?」

私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。

比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。

多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、

note記事3000いいね超えの殿堂記事 今すぐ読む

エンベーダー編集部

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

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

関連記事