EclipseでGitを使う(5)競合を解消する。

この記事は2015年9月6日に書かれたものです。内容が古い可能性がありますのでご注意ください。


EclipseでGitを使う(5)競合を解消する。

本記事は、EclipseでGitを使ってバージョン管理をしていく方法を説明していくシリーズの第5回です。前回は、自分がソースに修正を加えた際にどのような手順で修正履歴を残し、どのように共有リポジトリに上げていく(プッシュする)のかを説明しました。今回は、自分がプッシュする前に別のメンバがプッシュしていた場合の競合と、その解消方法を説明します。

 

1.ソースの修正を行い、コミットする

まずは、前回の内容の通り、Eclipseの「Javaパースペクティブ」「Java EE パースペクティブ」を開き、ソースファイルを修正しましょう。修正ファイルに「>」記号が付きます。

git5-1

今回は以下のように内容を加えました。
空のクラスにmainメソッドを追加した状態です。

変更前:

public class Sample1 {

}

変更後:

public class Sample1 {
public static void main(String[] args){
System.out.println("Sample1 modified!");
}
}

修正ができたらコミットしましょう。

git5-2

コミットが完了すると、「>」が表示されなくなります。

git5-4

ヒストリーを見ると以下のようにコミット履歴が残っていることが分かります。

git5-3

 

2.プッシュすると失敗する

さて、コミットができたら次はプッシュをします。

git5-5

しかし、プッシュが上手くいかない場合があります。
以下のように「拒否」メッセージが出てきてしまう場合です。

git5-6

これはどのような場合でしょうか?
実は、別のユーザが今プッシュしようとした変更ファイルに、別の変更を加えている場合に、このような状態が発生します。こうした場合には、まず別ユーザが変更した内容を自分の内容に反映させてから改めてプッシュを行う必要があります。

 

3.プッシュすると失敗する場合には、まずフェッチ&マージする

別ユーザが変更した内容を自分の内容に反映させるには「フェッチ」と「マージ」、または「プル」を行います。今回は動きを細かく理解するために、「フェッチ」&「マージ」を行います。

まず、フェッチを行います。
フェッチを行ったらヒストリーを見てみましょう。

git5-8

別のユーザ変更した内容が、リモートリポジトリ「origin/master」の方にできあがっており、自分が変更した「master」の方と分かれてしまっていることが分かりますね。じつは、Sample1.javaを別ユーザが変更し、事前にプッシュをしておいたのです。

次に、マージを行いましょう。マージは、どのブランチを現在の「master」にマージするか聞いてくるのでリモートリポジトリの「origin/master」を選択します。

git5-11

すると、以下のようにエラーが発生します。
git5-7

別ユーザは、以下のような事前変更を加えています。

public class Sample1 {

}

変更後:

public class Sample1 {
public static void main(String[] args){
System.out.println("from sourceTree");
}
}

3行目の変更の仕方が、競合してしまっているのですね。
競合してしまった場合は、競合を解消する必要があります。

 

4.競合を解消する

JavaEEパースペクティブを表示してみましょう。以下のように競合する箇所に赤い矢印「⇔」が表示されていますね。

git5-14

対象のSample1.javaをひらいてみましょう。以下のような表示になっています。

public class Sample1 {
public static void main(String[] args){
<<<<<<< HEAD
System.out.println("Sample1 modified!");
=======
System.out.println("from sourceTree");
>>>>>>> refs/remotes/origin/master
}
}

「<<<<<<< HEAD」から「=======」までがローカル、 「=======」から「>>>>>>> refs/remotes/origin/master」がリモートになります。
どこが競合しているかわかりましたので、修正をしましょう。
マージツールを使う方法もありますが、今回は直接javaファイルを修正します。
以下のようにファイルを修正します。

修正後:

public class Sample1 {
public static void main(String[] args){
System.out.println("Sample1 modified!");
System.out.println("from sourceTree");
}
}

コンパイルエラーは消えましたがまだ赤い矢印「⇔」は消えません。
修正が完了している場合は、「チーム>ワークスペース同期化」を選択しましょう。

git5-12

チーム同期化パースペクティブが表示されます

git5-13
修正ファイルを右クリック選択して「マージ済みとマーク」を選択しましょう。
これで赤い矢印が消えます。代わりに「*」印がつきます。

 

5.再コミット&プッシュする

コミットとプッシュを行いましょう。今度は正常にプッシュできるはずです。
ヒストリーを見ると、マージされていることが分かります。

git5-9

 

6.まとめ

今回は上手くプッシュできない場合の対応方法を書きました。同一ソースファイルの複数人での編集は極力避けるべきですが、どうしても開発を行っている場合には発生してしまう問題でもあります。落ち着いて対処できるとよいですよね。次回はマージツールの使い方を説明します。

 

  • このエントリーをはてなブックマークに追加

PAGE TOP