ちょっと話題の記事

Gitを使った分散開発管理16 – p4mergeでマージを行う

2013.04.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Gitでのマージ作業

Gitを使用していて競合が発生した場合、それを解決して正しい状態にする必要があります。
私は以前、競合が発生したファイルに<<<<<<<HEADとかのよくわからない文字列が入って、どうやって修正すればいいか悩んでいました。
こういった競合を解消するためのツールはいくつもありますが、今回はMacで「p4merge」というツールを使用して
Gitの競合を解消する方法について紹介します。

環境

今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.7.5
  • Git : 1.8.2

Gitは使える状態にしておいてください。

p4mergeをセットアップ

1.p4mergeをダウンロード
まずはここからp4mergeをダウンロードして、p4merge.appを/Applicationsにインストールします。

2.gitconfigの設定
~/.gitconfigファイルを修正して、マージ用ツールとしてp4mergeのパスを設定します。

[merge]
        tool = p4merge
[mergetool]
        keepBackup = false
[mergetool "p4merge"]
        path = p4merge
        keepTemporaries = false
        trustExitCode = false

3.p4mergeシェルを作成
パスの通っている場所(/usr/local/binとか)にp4mergeシェルを作成します。

#!/bin/sh

P4MERGE=/Applications/p4merge.app/Contents/MacOS/p4merge
${P4MERGE} $*

実行権限もつけておきましょう。これで設定は完了です。

% chmod 755 /usr/local/bin/p4merge

p4mergeを使って競合を解消してみる

では、p4mergeを使うために、わざと競合状態をつくります。
まずp4mディレクトリを作成し、そこでGitを初期化します。

% mkdir p4m
% cd p4m
% git init

次にp4mディレクトリでhello.jsファイルを作成し、コミットしましょう。

function greet(name) {
  return "Hello," + name;
}

console.log(greet("juno"));

% git add hello.js
% git commit -m "initial commit"

次にブランチを作成し、ファイルを編集してコミットします。

//ブランチを作成
% git checkout -b myBranch

hello.jsは次のように修正しましょう。

function greet(say,name) {
  return say + "," + name;
}

console.log(greet("Good Morning","juno"));

ブランチでコミットします。

% git add hello.js
% git commit -m "change greet from myBranch"

masterブランチに戻り、さっきとは違う修正をしてコミットします。

% git checkout master

次のようにhello.jsを修正します。

function greet(greeting,name) {
  console.log("greeting:", greeting);
  return greeting + ","  + name;
}

console.log(greet("Good Afternoon","juno"));

hello.jsをコミット後にマージしようとしたら競合が発生しました。git mergetoolコマンドを使用してp4mergeを起動します。

% git add hello.js
% git commit -m "change greet"
% git merge myBranch
Auto-merging hello.js
CONFLICT (content): Merge conflict in hello.js
Automatic merge failed; fix conflicts and then commit the result.

% git mergetool
Merging:
hello.js

Normal merge conflict for 'hello.js':
  {local}: modified file
  {remote}: modified file
Hit return to start merge resolution tool (p4merge):

p4mergeで競合を解決しましょう。
使い方はシンプルで、基本的には競合している箇所を確認し、どの内容を適用するか決めます。
内容に対応した色のボタンがあるので、どの内容を残すかきめましょう。なお、直接内容を入力することもできます。
p4

競合を解消したら、ファイルを保存してp4mergeを終了し、コミットすれば競合を解決してマージ完了です。

% git commit -m "merge from myBranch"

まとめ

今回はp4mergeをつかってGitの競合を解決してみました。
テキストでがんばって修正するよりわかりやすく、簡単に競合の解決ができますね。