端くれプログラマの備忘録 Git [Git] マージ時のsquashオプション

[Git] マージ時のsquashオプション

git merge <branch名>git merge <branch名> --squash の違いは、マージの方法と履歴の扱いにあります。具体的には、以下のような違いがあります:

1. git merge <branch名>

  • 標準的なマージです。
  • 指定したブランチのすべてのコミットが現在のブランチに統合されます。
  • マージコミット(merge commit)が作成されます。
  • 履歴はブランチの統合過程をそのまま保持します。

挙動

  1. マージ元ブランチのすべてのコミットを現在のブランチに統合します。
  2. 履歴には、両方のブランチのコミットとマージコミットが記録されます。
  3. 履歴をたどると、どのブランチがどのように統合されたかを確認できます。

git checkout main
git merge feature
  • マージコミットが作成されます。
  • 履歴は次のようになります:
  *   Merge branch 'feature'
  |\
  | * Commit 3 on feature
  | * Commit 2 on feature
  |/
  * Previous commit on main

2. git merge <branch名> --squash

  • スクワッシュマージです。
  • 指定したブランチのすべてのコミットを1つのコミットにまとめた状態で現在のブランチに統合します。
  • マージコミットは作成されません。
  • 履歴には統合元のブランチの個別のコミットは記録されず、まとめられた単一のコミットのみが記録されます。

挙動

  1. マージ元ブランチのすべての変更を現在のブランチに適用しますが、個々のコミットは履歴に記録されません。
  2. 現在のブランチに1つの新しいコミットを手動で作成する必要があります。

git checkout main
git merge feature --squash
git commit -m "Merged changes from feature branch"
  • git merge --squashで変更を統合した後、明示的にgit commitを実行します。
  • 履歴は次のようになります:
  * Merged changes from feature branch
  * Previous commit on main

※ 個々の「feature」ブランチのコミットは保持されません。

3. 主な違いの比較

項目通常のマージ (git merge)スクワッシュマージ (git merge --squash)
コミット履歴ブランチの全履歴が残る1つの新しいコミットにまとめられる
マージコミットの作成作成される作成されない
適用される変更ブランチ全体の変更が適用ブランチ全体の変更が適用
作業の明示的なgit commit必要ない必要
履歴の可読性詳細な履歴が残る簡潔で直線的な履歴になる

4. どちらを使うべきか?

  • 通常のマージ (git merge)
    • チーム開発などで履歴をそのまま保持したい場合。
    • ブランチ間のマージ履歴を正確に追跡したい場合。
    • ブランチでの作業内容を詳細に記録したい場合。
  • スクワッシュマージ (git merge --squash)
    • 小さいコミットが多数ある場合や、履歴を簡潔に保ちたい場合。
    • 他の人に不要な履歴を見せたくない場合。
    • 一連の変更を1つのまとまった変更として扱いたい場合。

スクワッシュマージは簡潔な履歴を作るのに役立ちますが、ブランチの詳細な履歴が失われます。一方、通常のマージは履歴を完全に保持できますが、複雑になる可能性があります。それぞれの特性を理解し、プロジェクトの運用方針やチームのニーズに応じて使い分けると良いでしょう。