Gitマージとリベースコマンド解説

マージとリベース

git merge - ブランチのマージ

指定したブランチの変更を現在のブランチに統合します。

オプション 説明
--no-ff 常にマージコミットを作成(Fast-forwardしない)
--ff-only Fast-forwardできる場合のみマージ
--squash すべての変更を1つのコミットにまとめる
--abort コンフリクト発生時にマージを中止
--continue コンフリクト解決後にマージを続行
-m <メッセージ> マージコミットのメッセージを指定

例:

git merge feature - featureブランチを現在のブランチにマージ
git merge --no-ff feature - Fast-forwardせずにマージコミットを作成
git merge --ff-only origin/main - Fast-forwardできる場合のみマージ
git merge --squash feature - featureブランチの変更をまとめて1つのコミットにする
git merge --abort - コンフリクト発生時にマージを中止
git merge -m "Merge feature branch" feature - カスタムメッセージでマージ

git rebase - コミット履歴の再構成

ブランチのベースを変更し、コミット履歴を整理します。

オプション/引数 説明
<ブランチ名> 指定したブランチをベースに現在のブランチを再構成
-i, --interactive 対話的リベース(コミットの編集、並べ替え、統合などが可能)
--onto <新ベース> <古いベース> <ブランチ> 特定の範囲のコミットを新しいベースに移動
--continue コンフリクト解決後にリベースを続行
--abort リベースを中止し、元の状態に戻す
--skip 現在のコミットをスキップしてリベースを続行

例:

git rebase main - 現在のブランチをmainブランチの先端に再配置
git rebase -i HEAD~3 - 直近3つのコミットを対話的に編集
git rebase --onto main feature-base feature - featureブランチのfeature-baseからの変更をmainブランチの先端に再配置
git rebase --continue - コンフリクト解決後にリベースを続行
git rebase --abort - リベースを中止

注意: リベースはコミット履歴を書き換えるため、既にプッシュした変更に対して行うと問題が発生する可能性があります。共有ブランチでのリベースは避け、個人的なブランチでのみ使用することをお勧めします。

git cherry-pick - 特定のコミットを取り込む

他のブランチから特定のコミットを選んで現在のブランチに適用します。

オプション/引数 説明
<コミットハッシュ> 取り込むコミットのハッシュ値
-n, --no-commit 変更をステージングするだけで、コミットしない
-e, --edit コミットメッセージを編集する
-x 元のコミットハッシュをコミットメッセージに追加する
-s, --signoff Signed-off-by行をコミットメッセージに追加する
--continue コンフリクト解決後にcherry-pickを続行
--abort cherry-pickを中止し、元の状態に戻す
--skip 現在のコミットをスキップしてcherry-pickを続行

例:

git cherry-pick abc123 - コミットabc123を現在のブランチに適用
git cherry-pick abc123 def456 - 複数のコミットを順番に適用
git cherry-pick abc123..def456 - 指定した範囲のコミットを適用(abc123は含まない)
git cherry-pick abc123^..def456 - 指定した範囲のコミットを適用(abc123を含む)
git cherry-pick -n abc123 - コミットせずに変更をステージングエリアに追加
git cherry-pick --continue - コンフリクト解決後にcherry-pickを続行
git cherry-pick --abort - cherry-pickを中止

注意: cherry-pickは他のブランチから特定のコミットだけを取り込みたい場合に便利ですが、同じ変更が複数の場所に存在することになるため、後のマージ時に複雑になる可能性があります。

develop環境とstaging環境間でのcherry-pickベストプラクティス

以下は、develop環境からstaging環境に特定の機能や修正を選択的に適用する際のベストプラクティスをスクリプト形式で示しています。

# 1. 最新の状態に更新
git checkout develop
git pull origin develop    # develop環境を最新に更新

git checkout staging
git pull origin staging    # staging環境を最新に更新

# 2. developブランチで適用したいコミットを特定
git checkout develop
git log --oneline -n 10    # 最近の10件のコミットを表示して適用したいコミットを特定

# 3. コミットIDをメモ(例: abc123, def456)

# 4. stagingブランチに切り替えてcherry-pick実行
git checkout staging

# 単一のコミットを適用する場合
git cherry-pick abc123

# 複数のコミットを適用する場合(順番に適用)
git cherry-pick abc123 def456

# 連続した範囲のコミットを適用する場合
git cherry-pick abc123^..def456    # abc123を含む
# または
git cherry-pick abc123..def456     # abc123を含まない

# 5. コンフリクトが発生した場合の対応
# コンフリクトが発生した場合、ファイルを編集してコンフリクトを解決
git add .                  # 解決したファイルをステージング
git cherry-pick --continue # cherry-pickを続行

# 途中で中止したい場合
# git cherry-pick --abort

# 6. リモートリポジトリにプッシュ
git push origin staging    # 変更をstagingブランチにプッシュ
            

ヒント:

  • cherry-pickを行う前に、両方の環境(developとstaging)を最新の状態に更新することが重要です。
  • コミットメッセージに元のコミットハッシュを含めるには -x オプションを使用します(例: git cherry-pick -x abc123)。
  • 複数のコミットをcherry-pickする場合は、依存関係を考慮して正しい順序で適用してください。
  • 大きな機能全体を移行する場合は、cherry-pickよりもブランチのマージを検討してください。
  • cherry-pickしたコミットには、どの環境から取り込んだかを記録しておくと追跡が容易になります。
  • 定期的にdevelopからstagingへのマージを行い、環境間の差異を最小限に抑えることをお勧めします。