実践Git:別ブランチでの作業中に他の変更を取り込む方法

チーム開発実践編
📌 よくある実践シナリオ

チーム開発では、複数のブランチで同時に開発が進むことが一般的です。自分が機能ブランチで作業している間に、mainブランチや他のチームメンバーのブランチで重要な更新があった場合、それらの変更を自分のブランチに取り込む必要があることがよくあります。

本記事では、あなたが作業中のブランチに他の人の変更を安全に取り込む方法を、具体的なシナリオと共に解説します。mergeとrebaseの使い分けや、コンフリクト回避のテクニックなど、チーム開発で役立つ実践的な内容です。

他の人の変更を上手に取り込めるようになると、チーム開発がスムーズになり、コンフリクトのストレスも大幅に減ります!
🔄

🌳 ブランチ間の変更取り込み基本

複数ブランチでの作業では、2つの主要な変更取り込み方法があります:

🔄 Mergeによる統合
元のブランチの履歴をそのまま保持
マージコミットが作成される
「ブランチが合流した」履歴が残る
$ git merge
📝 Rebaseによる再配置
変更を対象ブランチの先端に移動
履歴が線形になる
「常にこのブランチで開発していた」ように見える
$ git rebase
ℹ️ 重要な違い: mergeは履歴を保持し安全ですが、複雑な履歴ツリーになります。rebaseは綺麗な履歴になりますが、共有ブランチでは使用に注意が必要です。
main
feature
マージ後
具体的なケースで見るとき、「どの変更を」「どのように」取り込むかが重要です。状況に応じた最適な方法を選びましょう!
📝

📝 シナリオ1: mainの最新変更を取り込む

最も一般的

機能開発中に、mainブランチに重要な更新(バグ修正など)が入ったケース。あなたの機能ブランチを最新の状態に保つために、mainの変更を取り込みます。

状況

あなたは「feature/login」ブランチで認証機能を開発中。この間にチームの他のメンバーがmainブランチにセキュリティパッチを適用した。あなたの機能にもこのパッチが必要。

Mergeを使う方法(推奨)
作業ブランチにいることを確認
$ git checkout feature/login # 現在のブランチを確認 $ git branch * feature/login main
最新のmainブランチを取得
$ git fetch origin main
mainブランチの変更を自分のブランチにマージ
$ git merge origin/main
コンフリクトがあれば解決し、続行
# コンフリクト解決後 $ git add . $ git commit -m "Merge main into feature/login"
✨ Pro Tip

開発中は定期的にmainブランチの変更を取り込むと、最終的なマージ時のコンフリクト解決が簡単になります。

🔀

🔀 シナリオ2: 他の開発者のブランチから取り込む

協業

あなたの機能が他の開発者が作業中の機能に依存している場合、その開発者のブランチから必要な変更を取り込みます。

状況

あなたは「feature/dashboard」ブランチでユーザーダッシュボードを開発中。同僚の田中さんが「feature/api」ブランチでAPIエンドポイントを開発している。ダッシュボードは新しいAPIに依存しているため、田中さんの変更を取り込む必要がある。

事前準備
まず田中さんのブランチをローカルに取得
# 田中さんのブランチをリモートから取得 $ git fetch origin feature/api
Option 1: マージする
# 自分のブランチにいることを確認 $ git checkout feature/dashboard # 田中さんの変更をマージ $ git merge origin/feature/api
Option 2: 特定のコミットだけ取り込む
# 必要なコミットのみを取り込む(チェリーピック) $ git cherry-pick
📝 cherry-pickとは: 他のブランチから特定のコミットだけを取り込む技術です。全体をマージせず、必要な変更だけを適用したい場合に便利です。
💡 コミュニケーションのヒント

他の開発者のブランチから変更を取り込む前に、必ずその開発者と相談しましょう。未完成の機能や実験的な変更が含まれている可能性があります。

📊

📊 シナリオ3: rebaseで履歴を整理する

上級者向け

長期間開発している機能ブランチをmainの最新状態に追いつかせつつ、履歴を綺麗に保ちたい場合に有効です。

状況

「feature/payments」ブランチで2週間ほど決済機能を開発中。その間にmainブランチには多くの変更が入っており、今後のマージを円滑にするためにrebaseで履歴を整理したい。

rebaseの手順
最新のmainを取得
$ git fetch origin main
自分のブランチをrebase
$ git checkout feature/payments # mainの上に自分の変更を再配置 $ git rebase origin/main
コンフリクトがあれば解決
# ファイルを編集してコンフリクトを解決 $ git add # rebaseを続行 $ git rebase --continue
⚠️ 注意点

rebaseは履歴を書き換えるため、すでに共有されているブランチでは使わないようにしましょう。他の開発者が同じブランチを使っている場合は特に注意が必要です。

main
feature
rebase後
↓ rebase
⚙️

⚙️ コンフリクト解決テクニック

変更を取り込む際、同じファイルの同じ箇所が編集されているとコンフリクト(競合)が発生します。効率的に解決するテクニックを学びましょう。

コンフリクト解決の基本フロー
コンフリクトが発生したファイルを確認
$ git status # 「both modified:」と表示されているファイルがコンフリクト中
ファイルを開き、コンフリクトマーカーを確認
<<<<<<< HEAD // あなたのブランチのコード ======= // 取り込もうとしているブランチのコード >>>>>>> feature/branch
コードを適切に編集して解決
# マーカーを削除し、最終的に残すコードだけにする
解決したファイルをステージングして続行
$ git add # mergeの場合 $ git commit -m "Resolve merge conflicts" # rebaseの場合 $ git rebase --continue
🔍 コンフリクト防止策

小さな単位で頻繁に変更を取り込むことで、大規模なコンフリクトを防げます。長期間放置すると解決が複雑になります。

🛠️

🛠️ 実践的なワークフロー例

実際のチーム開発では、以下のようなワークフローがよく使われます:

1. 作業前にmainを最新化
$ git checkout main $ git pull origin main $ git checkout -b feature/new-feature
2. 定期的にmainの変更を取り込む
$ git fetch origin main $ git merge origin/main # または $ git rebase origin/main
3. 他のブランチの特定の変更が必要な場合
$ git fetch origin feature/other $ git cherry-pick
4. 機能完成後、PRを出す前の最終調整
$ git fetch origin main $ git rebase origin/main // または merge $ git push -f origin feature/new-feature // rebaseした場合は -f が必要
実際の開発では、チームのルールに従うことが重要です。rebaseを使うか、mergeだけで統一するかなど、プロジェクトごとに方針が異なります。
📚

📚 上級テクニック

interactive rebase

複数のコミットをまとめたり並べ替えたりしながらrebaseする高度なテクニックです。

$ git rebase -i origin/main
コミットの並べ替え、結合、編集、削除などが可能
PR提出前に履歴を整理するのに最適
stash & apply

作業中の変更を一時的に退避させて、別の変更を取り込んでから戻す技術です。

# 変更を一時退避 $ git stash # 他ブランチの変更を取り込む $ git merge origin/main # 退避した変更を戻す $ git stash pop
🚀 ワークフロー効率化

これらの上級テクニックを習得すると、複雑な状況でも効率的に作業できるようになります。必要に応じてカスタムエイリアスやGitツールを活用しましょう。

SUMMARY

📝 ケース別のベストプラクティス

mainの変更を取り込む
個人的な機能ブランチの場合: rebaseを使って綺麗な履歴を維持
共有ブランチの場合: mergeを使って安全に統合
頻度: 1-2日に一度は最新のmainと同期を取る
他の機能ブランチから取り込む
全体が必要な場合: mergeを使用
特定の変更のみ必要: cherry-pickを使用
注意点: 他のブランチの状態を必ず確認
📌 重要ポイント: 変更の取り込み方法を選ぶときは、「履歴の綺麗さ」と「安全性」のトレードオフを考慮します。公開/共有ブランチではmergeを優先し、個人の作業ブランチではrebaseも積極的に活用するというバランスが理想的です。
Gitは柔軟なツールです。チームに合ったワークフローを確立し、一貫性を持って運用することが成功の鍵です。定期的に「git fetch」で最新情報を確認する習慣をつけましょう!