Gitコマンドの一つ、git merge は複数のブランチの内容を合流(合併)させるコマンドです。リモートリポジトリの内容をローカルリポジトリに取り込む際や、複数のブランチで開発を行い最後に変更内容を統合する際に必ず使います。
目次
git merge の使い方
実際に git merge コマンドを使ってみましょう。
リモートリポジトリの内容をローカルリポジトリに取り込む
Git でリモートリポジトリの内容をローカルリポジトリに取り込む流れは下記のようになります。
リモートリポジトリ
↓ git fetch
ローカルリポジトリ(origin/master)
↓ git merge
ローカルの作業ディレクトリ(master)
このうちローカルリポジトリの origin/master ブランチに取り込んだ変更内容を、作業ディレクトリに結びついている master ブランチに反映させるコマンドが git merge です。
今回はあらかじめリモートリポジトリから git fetch コマンドでローカルリポジトリに変更内容を取り込んでおきました。
git fetch コマンドでリモートリポジトリの内容をローカルリポジトリに取り込む方法
git merge origin/master
これで現在のブランチに origin/master ブランチをマージすることができました。
作業ディレクトリの内容がリモートのものと同じになっています。
用意した複数のブランチをマージする
複数人でのチーム開発ではブランチを分けてそれぞれの開発を行い、テストが完了した段階で変更内容をメインの master ブランチに取り込むことで一つのプロジェクトにまとめ直すのが一般的です。
master ブランチに 今回あらかじめ用意しておいたsub1 ブランチをマージしてみましょう。
まずは master ブランチに移動します。
git checkout master
下記のコマンドを実行して sub1 ブランチの内容をマージします。
git merge sub1
実行結果は以下の通りです。
これで sub1 ブランチの内容を master ブランチにマージすることができました。
git mergeを実行する場合の注意点
複数のブランチを合流させる git merge はたびたびコンフリクトなどの問題を引き起こすことがあります。しっかりと理解して使いましょう。
コミットが済んでいないファイルを残したまま git merge しない
コミットが済んでいない状態で git merge を実行すると、ブランチの変更内容が反映されないままマージしてしまいます。
全てのコミットを済ませた状態で実行しましょう。
ブランチの状態は git status コマンドで確認できます。
git statusコマンドでファイルのステータスを確認する方法
衝突(コンフリクト)が発生した場合
同じファイルの同じ個所を複数の開発者が修正した状態で git merge を実行すると、衝突(コンフリクト)が発生する場合があります。
その場合「CONFLICT」というエラーメッセージとともに、変更が衝突したファイル名が表示されますので修正し、コミットし直してからマージしましょう。
マージを元に戻す(取り消す)方法
マージ自体を元に戻す(取り消す)には下記のコマンドを実行します。
マージ後、まだコミットしていない場合
git reset --hard HEAD
マージ後、コミット済みの場合
git reset --hard ORIG_HEAD
git merge で使用可能なオプション
git merge コマンドにつけられるオプションには下記のようなものがあります。
マージを中断する
git merge --abort
コンフリクトが生じ、まだコミットが行われていない状態で、マージを中断して git merge 実行前の状態に戻します。
マージを再開する
git merge --continue
コンフリクトが生じ、コードを編集して競合を解決した後に、マージを完了するように指示します。
自動マージ方針を指定
git merge -ours git merge -theirs
Git に自動マージさせる際に競合を解決するヒントを与えます。
- -ours:強制的に現在チェックアウトしているブランチの変更を優先
- -theirs:マージするように指定したブランチの変更を優先