【Git】複数のコミットを一つにまとめる|squash/fixupで履歴を整える

【Git】複数のコミットを一つにまとめる|squash/fixupで履歴を整える

Amazonのアソシエイトとして、ITナレッジライフは適格販売により収入を得ています。

記事の文字数:4664

Gitコミット履歴が乱雑で困っていませんか?rebase -i(squash/fixup)やamendで、煩雑な複数のコミットを一つにまとめる具体的な手順を解説。コードレビュー効率とプロジェクト可読性を高め、スマートな開発スキルを習得しましょう。誤操作時の復元方法も紹介し安心です。


更新履歴


お役立ちツール



Gitユーザにお勧めの本

Gitで作業中、細かな修正コミットが増えて履歴が乱雑になり困っていませんか?Git コミットを一つにまとめることで、プロジェクトの可読性は劇的に向上します。

本記事では、rebase -i(squash)を用いた統合手順や、fixup、amendの使い分けをエンジニア視点で分かりやすく解説します。履歴を綺麗に整える術を学び、チームメンバーから信頼されるスマートな開発スキルを習得しましょう。

記事のポイント

  • 煩雑なコミット履歴を整理することで、コードレビューの効率とプロジェクトの可読性が大幅に向上します。
  • git rebase -iコマンドを活用し、squashfixupを使い分けることで複数のコミットを自在に統合できます。
  • 直前のコミット内容を修正・統合したいだけなら、専用のgit commit --amendを使うのが最も効率的です。
  • リモートにプッシュ済みの履歴を変更する際は、チームへの影響と強制プッシュのリスクを正しく理解しておく必要があります。
  • 万が一操作を間違えても、git reflogを使えば履歴がまだ保持されている限り統合前の状態に復元できるため、初心者でも安心です。

Gitコミットを一つにまとめるメリットと具体的な操作手順

Gitで開発を進めていると、「誤字脱字の修正」や「動作確認のための微調整」など、細かなコミットが積み重なってしまうことがあります。そのままの状態でプルリクエストを作成すると、履歴が煩雑になり、レビューの負担が増える可能性があります。

ここでは、コミットを一つにまとめる意義と、具体的な操作方法について解説します。

gitGraph commit id: "Feature A initial" commit id: "fix: typo" commit id: "fix: add logic" commit id: "Feature A complete (Squashed)"

開発効率と可読性を高めるためにコミットを一つにまとめる理由

コミットを適切に集約することで、プロジェクトの履歴が整理され、チーム全体の開発効率向上が期待できます。主なメリットは以下の通りです。

メリット内容の詳細
レビューの効率化変更の意図が明確になり、レビュアーがコードの差分を確認しやすくなります。
履歴の可読性向上「何を達成したか」という単位で履歴が残るため、後からの追跡が容易になります。
差し戻しの容易性一つの機能が一個のコミットにまとまっていると、問題発生時の切り戻しがスムーズです。

git rebase -i コマンドを使用して複数のコミットを統合する手順

複数のコミットを統合する際に最も汎用的なのが git rebase -i(対話型リベース)コマンドです。例えば、直近3つのコミットをまとめたい場合は以下のコマンドを実行します。

Terminal window
git rebase -i HEAD~3

実行後、テキストエディタが開き、対象となるコミットの一覧が表示されます。

alt text

squash(スカッシュ)を選択してコミットメッセージを編集する方法

squash は、前のコミットに現在のコミットを統合しつつ、それぞれのコミットメッセージを組み合わせて再編集できる機能です。

  1. エディタ上の2行目以降にある picksquash(または s)に書き換えて保存します。

alt text

  1. 統合後の新しいコミットメッセージを編集する画面が表示されます。

alt text

  1. 不要なメッセージを削除し、内容を整理して保存すれば完了です。

alt text

Terminal window
Successfully rebased and updated refs/heads/main.
Terminal window
$ git log -1 --pretty=%B
コミット123

fixupを使用してメッセージを破棄しつつコミットをまとめる方法

fixup は、直前のコミットに統合する点は squash と同じですが、統合される側のコミットメッセージを破棄する点が異なります。

  • 「タイポ修正」など、履歴に残す必要のない些細な修正をまとめる際に便利です。
  • pickfixup(または f)に書き換えるだけで、メッセージ編集の手間を省いて素早く統合できます。

alt text

Terminal window
Successfully rebased and updated refs/heads/main.

実行後の Before / After(git log 表示例)

実際に統合を行った後のログの変化を確認してみましょう。

統合前:

Terminal window
$ git log --oneline
1243e79 (HEAD -> main) コミット3
ac33d9f コミット2
64140bc コミット1

統合後(squash/fixup 実行後):

Terminal window
$ git log --oneline
17fb3aa (HEAD -> main) コミット1

autosquash を使うと fixup を自動整理できる

Gitには、fixupコミットを自動で整理する --autosquash という便利な機能もあります。 例えば次のようにコミットすると、特定のコミットに紐づく修正として記録できます。

Terminal window
git commit --fixup <commit-hash>

git commit --fixup は、対象コミットのメッセージを自動で参照するため、履歴整理の際に非常に便利です。 その後、以下を実行するとGitが fixup コミットを対象コミットの直後へ自動で並び替えてくれます。

Terminal window
# 今のコミットから5個前までを対象
git rebase -i --autosquash HEAD~5

この機能を使うと、後から追加した修正コミットも rebase 実行時に自動整理されるため、履歴のメンテナンスが非常にスムーズになります。

Kindle Unlimited

書籍が定額で読み放題

1冊数千円する専門書からビジネス書、雑誌まで、500万冊以上が定額で読み放題。IT技術の習得はもちろん、幅広い知識を効率よくインプットしたい方に最適です。

30日間無料体験を始める

直前のコミットと一つにまとめるなら git commit —amend が最適

「直前のコミットに、今の修正を少しだけ加えたい」という場合には、git commit --amend を使うのが一般的です。

  1. ファイルを修正し、git add します。
  2. git commit --amend を実行します。
  3. メッセージを確認して保存すれば、新しいコミットを作らずに直前のコミットを更新できます。

なお、--amend はコミットハッシュを書き換えるため、すでにリモートにプッシュ済みのコミットに対して使用する場合は注意が必要です。

【関連記事】

今日から使える!Gitコミットメッセージの書き方と型
ITナレッジライフ

今日から使える!Gitコミットメッセージの書き方と型

Gitのコミットメッセージは、ソースコードの変更内容を後から理解するための重要な手がかりです。本記事では、わかりやすく、再利用しやすいコミットメッセージを書くための基本ルール・フォーマット・良い例と悪い例を詳しく解説します。チーム開発や個人開発でも役立つ、実践的な書き方を身につけましょう。

【完全ガイド】Gitのコミット・プッシュを取り消す方法
ITナレッジライフ

【完全ガイド】Gitのコミット・プッシュを取り消す方法

Gitのコミット・プッシュを取り消す方法を詳しく解説します。直前のコミットの取り消しから特定のコミットの修正、プッシュ済みの変更の取り消し方法まで、具体的なコマンドとともに分かりやすく紹介します。適切な方法を選んで、安全にGitの履歴を管理できるようになりましょう。

Gitコミット集約に関するよくある質問(FAQ)

Gitのコミットをまとめる作業は非常に便利ですが、履歴を書き換える操作を伴うため、慣れないうちは不安を感じることもあるかもしれません。ここでは、作業中によく遭遇する疑問やトラブルへの対処法をまとめました。

Q. 既にリモートにプッシュ済みのコミットを一つにまとめても大丈夫?

結論から述べると、 自分一人だけが使っているブランチであれば可能ですが、共有ブランチでは避けるのが無難 です。

Gitのコミットをまとめると、コミットのハッシュ値(ID)が新しく書き換わります。既にリモートへプッシュ済みの履歴を書き換えて再度プッシュしようとすると、通常の git push ではエラーになります。この場合、 git push --force-with-lease などの強制プッシュが必要になります。

  • 自分専用の機能開発ブランチ(Feature Branch): コミットを整理して見やすくするために、プッシュ後でもまとめて問題ないケースが多いです。
  • 共有ブランチ(mainやdevelopなど): 他のメンバーがあなたのコミットをベースに作業している場合、履歴の不整合が起き、チーム全体の開発に支障をきたす恐れがあります。

Q. コミットをまとめている途中でコンフリクトが発生した時の解決策は?

git rebase -i でコミットをまとめている最中に、同じ箇所の変更が衝突して コンフリクト(衝突) が発生することがあります。その場合は、以下の手順で落ち着いて対処しましょう。

手順操作内容コマンド例
1衝突しているファイルを手動で修正するエディタでコンフリクト箇所を直す
2修正したファイルをステージングに上げるgit add <ファイル名>
3リベース作業を再開するgit rebase --continue

もし途中で作業がわからなくなったり、最初からやり直したくなったりした場合は、 git rebase --abort を実行することで、 リベースを開始する前の状態に安全に戻す ことができます。

Q. 間違えてコミットをまとめてしまった場合に元の状態に戻す方法は?

「必要なコミットまで消してしまった」「まとめ方を間違えた」という場合でも、Gitには git reflog という強力な救済策があります。

git reflog コマンドを実行すると、HEADの移動履歴(過去の操作履歴)が一覧表示されます。リベース前の状態を見つけたら、以下のコマンドで復元できる可能性があります。

Terminal window
git reflog
# reset --hard は作業内容も破棄するため注意してください。
# 必ず reflog の履歴を確認してから実行しましょう。
git reset --hard HEAD@{5}

このように、Gitでは操作ミスをしても reflog によって過去のHEAD移動履歴が保持されているため、慌てずにログを確認することが大切です。なお、reflogの履歴は一定期間(通常は数十日〜90日程度)で削除される場合があります。

Gitコミットを綺麗に管理するためのまとめ

今回のまとめ:振り返りチェックリスト

  • 「squash」と「fixup」を使い分け、 コミットメッセージを残すか破棄するかで最適な統合方法を選択する
  • 共有ブランチにプッシュ済みのコミット は原則として履歴を書き換えないことを意識し、チーム開発でのコンフリクトや混乱を未然に防ぐ
  • 失敗しても git rebase --abortreflog でやり直せる ことを理解し、恐れずに履歴整理に挑戦してみる
  • アドバイス: 次回プルリクエストを送る前に、一度自分のコミット履歴を眺めて「第三者が理解しやすい粒度か」を確認する習慣を身につけましょう!

このセクションでは、Gitのコミットを一つにまとめる作業の重要性を振り返り、プロジェクトの可読性と保守性を維持するためのベストプラクティスを整理します。

Gitの履歴を綺麗に保つことは、自分自身の備忘録としてだけでなく、チームメンバーとの円滑なコミュニケーションにおいても非常に重要です。細かすぎるコミット(「タイポ修正」「微調整」など)が大量に並んでいると、後から特定の変更点やバグの混入箇所を探すのが困難になる可能性があります。

git rebase -igit commit --amend を活用してコミットを一つにまとめることで、一つの機能実装やバグ修正に対して一つのコミットという 「意味のある単位」 に整えることができます。

適切な粒度でコミットを一つにまとめるために

開発の現場では、 「1コミット・1タスク(Atomic Commit)」 という考え方が推奨されることが多いです。しかし、実際の開発中には試行錯誤が伴うため、どうしてもコミットが細切れになりがちです。以下の表を参考に、適切なタイミングで履歴を整理する習慣をつけると良いでしょう。

シチュエーション推奨される操作メリット
ローカルでの作業中git commit (随時)こまめに保存することで、作業の切り戻しが容易になる
プルリクエスト作成前git rebase -i (squash)履歴がスッキリし、レビュワーが内容を把握しやすくなる
直前の些細なミス修正git commit --amend無駄なコミットを増やさず、綺麗な履歴を維持できる

履歴を美しく保つためのポイントは、以下の3点に集約されるかもしれません。

  1. 作業中は自由にコミットする: 開発のリズムを崩さないよう、ローカル環境ではバックアップ代わりに細かくコミットを残します。
  2. マージ前に「物語」を整える: 公開用のブランチにマージする直前に git rebase -i を使い、後から見た人が理解しやすいストーリーになるようコミットを統合します。
  3. メッセージの質にこだわる: コミットをまとめた後は、その変更が「何のために」「何をしたか」が明確に伝わるメッセージを記述するように心がけましょう。

Gitの操作に慣れるまでは、履歴を書き換えることに不安を感じるかもしれません。しかし、今回紹介した手法をマスターすることで、 「コードの品質だけでなく、履歴の品質も高いエンジニア」 への一歩を踏み出せるはずです。万が一操作を間違えても git reflog という救済策があることを忘れずに、積極的に綺麗な履歴作りへ挑戦してみてください。

【参考リンク】

この記事はお役に立ちましたか?



Gitユーザにお勧めの本


以上で本記事の解説を終わります。
よいITライフを!
目次

記事を評価

Thanks!
Scroll to Top