Git で複数のコミットを1つのコミットにまとめる(squash)の具体的な例
ターゲットブランチに移動:
git checkout <target_branch>
ここで、
<target_branch>
は、複数のコミットをマージしたいブランチです。マージを実行:
git merge --squash <source_branch>
ここで、
<source_branch>
は、マージしたいコミットが含まれるブランチです。
例
git checkout main
git merge --squash feature_branch
注意
- コミット履歴の変更: squash を実行すると、コミット履歴が変更されます。元のコミットは消え、新しいコミットが作成されます。
複数のコミットを作成する
まず、複数のコミットを作成してみましょう。例えば、ある機能を実装するために、以下の3つのコミットを作成したとします。
# ファイルを変更してコミット
git add .
git commit -m "機能追加: 初期化処理"
# ファイルを変更してコミット
git add .
git commit -m "機能追加: データ処理"
# ファイルを変更してコミット
git add .
git commit -m "機能追加: 表示処理"
方法1: git rebase -i
を使う
インタラクティブなリベースを開始:
git rebase -i HEAD~3 # 直近の3つのコミットを対象とする
このコマンドを実行すると、テキストエディタが開き、コミットの一覧が表示されます。
方法2: git merge --squash
を使う
マージするブランチに移動:
git checkout main
squash マージを実行:
git merge --squash feature_branch
例: git rebase -i
を使った具体的な例
pick commit-hash 機能追加: 初期化処理
squash commit-hash 機能追加: データ処理
squash commit-hash 機能追加: 表示処理
機能追加: 初期化処理、データ処理、表示処理
どちらの方法を使うかは、状況によって異なります。
- コミット履歴を細かく管理したい場合:
git rebase -i
注意:
git rebase
はコミット履歴を書き換えるため、注意して使用してください。squash
を実行すると、元のコミットは失われます。
- インタラクティブなリベースでできること:
- コミットの順序変更
- コミットの分割
- コミット履歴の可視化:
git log
コマンドでコミット履歴を確認できます。
この説明は、Gitの基本的な使い方を理解している方を対象としています。もし、Gitの初学者の方は、まずは基本的な操作を習得してから、この機能を試してみてください。
- 「コミット履歴が複雑になってしまい、整理したいのですが、どのような手順でsquashを行えばよいですか?」
インタラクティブなリベース (git rebase -i) の詳細
pick
: コミットをそのまま残すreword
: コミットメッセージを編集するedit
: コミットを一時停止し、変更を加えるdrop
: コミットを削除する
具体的な例
pick commit-hash 機能追加: 初期化処理
squash commit-hash 機能追加: データ処理
edit commit-hash 機能追加: 表示処理 # このコミットを修正したい場合
edit
を指定すると、そのコミットで作業ディレクトリが変更され、自由に編集できます。編集が終わったら、git add
とgit commit --amend
でコミットを修正します。
- 特徴:
- 別のブランチからのマージに特化している
- マージ後のコミットメッセージを自由に編集できる
- 注意点:
git reset
とgit commit --amend
を組み合わせる:- より細かい制御が必要な場合に有効
- コミットを一つずつ戻し、修正を加えながら再コミットする
- 外部ツールを使う:
- GUI ツールやスクリプトを使って、より視覚的にコミットを操作できる
- 例: Sourcetree, GitHub Desktop
ワークフローへの組み込み
- プルリクエストの作成前に squash:
- レビューを簡潔にし、マージ後の履歴をきれいに保つ
注意点
- コミット履歴の変更: squash はコミット履歴を書き換えるため、慎重に行う
- リモートリポジトリとの連携: リモートリポジトリに push 済みであれば、force push する必要がある場合がある
- チームでの作業: チームで作業する場合は、squash の影響範囲を考慮する
git rebase -i
: 柔軟性が高く、細かい制御が可能git merge --squash
: 別ブランチからのマージに便利
どの方法を選ぶかは、以下の要素によって異なります。
- コミット数
- コミットの複雑さ
- チームのワークフロー
- 個人的な好み
具体的な状況に合わせて、最適な方法を選択してください。
- squash をすると、元のコミットは消えてしまうのですか?
- はい、元のコミットは失われます。
- squash をした後、間違えてしまった場合、どうすれば良いですか?
git reflog
でコミット履歴を確認し、git reset
で状態を戻すことができます。
追加情報
- Git の公式ドキュメント: より詳細な情報を確認できます。
例:
- 「特定のコミットだけを squash したいのですが、どうすればいいですか?」
- 「リモートブランチに push した後に squash を実行したいのですが、何か注意することはありますか?」
git git-merge git-squash