Spring Boot解説第14回(開発環境編：Egit)

こんにちは！
情創 技術開発局
前回担当した記事で初めてコメントをいただき、調子に乗ってる @TEBASAKI です。

今回は Egit について説明していきます。
なお、ブランチについてはまたの機会に説明します。

# Egitとは
第8回でも少し触れましたが、 Egit は Eclipse で Git を扱うためのプラグインです。
Egit は Jgit という Java の Git ライブラリを使用しています。
なので、Gitのコマンドラインツールなどを別途導入する必要はありません。
なお、Jgit は Eclipse 傘下のプロジェクトです。

# 使い方
ここでは Egit による Git の操作方法を解説します。
リポジトリの作成に関しては[第8回](http://qiita.com/TEBASAKI/items/df301fa808f37e6480b6 "Spring Boot解説第8回(開発環境編：EclipseプロジェクトのGit管理) - Qiita")で解説しているので、そちらを参照してください。

## プル
プルの操作自体は簡単です。
プロジェクトを右クリックして、チーム→プルを選択するだけです。
![image](https://qiita-image-store.s3.amazonaws.com/0/116031/47289dc1-9d85-0b86-d863-c1daf669a67d.png)

なお、プルはフェッチ→マージの順に操作することと同じです。

## コミット、プッシュ
コミット、プッシュは第8回でも解説しましたが、再度説明します。

コミットはプロジェクトを右クリックして、チーム→コミットを選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/116031/f5b7e46f-a29f-8fd7-b77d-8af4a08ab81e.png)

その後コミット・メッセージの記入と、コミットするファイルを選択して、コミットします。
![image](https://qiita-image-store.s3.amazonaws.com/0/116031/83a44f43-8a8e-70ff-e737-0e4d456bc377.png)


プッシュはプロジェクトを右クリックからチーム→アップストリームへプッシュを選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/116031/379bc917-8b06-d776-816c-08d344fa761b.png)

特に変更することなくOKを押下して完了ですが、
以下のように「拒否」のメッセージが表示されることがあります。
![image](https://qiita-image-store.s3.amazonaws.com/0/116031/9c265d94-850b-e00c-79a5-32c0de33a73c.png)

これは競合が発生している場合に起きるもので、プッシュに失敗してしまいます。


## 競合の解消
上記の通り、プッシュはリモートリポジトリと競合が起きている場合は失敗してしまいます。
チームでの作業には、競合は付き物です。
競合はファイルの内容を比較してマージすることで解消できます。
一連の流れについては後述することにして、ここではマージ作業について説明します。

競合しているファイルをマージツールで開くと、以下のように表示されます。

```java:TestController.java
<<<<<<< HEAD
package com.qiita.demo.web.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.qiita.demo.domain.tbl.TestBean;
import com.qiita.demo.service.test.TestService;


@Controller
public class TestController {
   @Autowired
   private TestService testService;

  @RequestMapping("/test")
  @ResponseBody
  public String home() {
	  String returnStr = "temp";
	  List<TestBean> list = testService.selectAll();
	  for (TestBean testBean : list) {
		  returnStr += "id  :" + testBean.getId() + " ";
		  returnStr += "name:" + testBean.getName() + "<br>";
	  }
	  return returnStr;
  }



}
=======
package com.qiita.demo.web.controller;

import java.util.List;

import com.qiita.demo.domain.tbl.TestBean;
import com.qiita.demo.service.test.TestService;


@Controller
public class TestController {
   @Autowired
   private TestService testService;

  @RequestMapping("/test")
  @ResponseBody
  public String home() {
	  String returnStr = "test";
	  List<TestBean> list = testService.selectAll();
	  for (TestBean testBean : list) {
		  returnStr += "id  :" + testBean.getId() + " ";
		  returnStr += "name:" + testBean.getName() + "<br>";
	  }
	  return returnStr;
  }



}
>>>>>>> branch 'master' of http://(サーバー名)/gitbucket/git/(ユーザー名)/gitgradle.git

```

"======="で区切られた上の部分がローカルリポジトリの内容で、
下の部分がリモートリポジトリの内容です。
見比べてみるとimport文とreturStrの初期化部分が異なっているのが確認できます。

それを踏まえて、以下のように修正します。

```java:TestController.java
package com.qiita.demo.web.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.qiita.demo.domain.tbl.TestBean;
import com.qiita.demo.service.test.TestService;


@Controller
public class TestController {
   @Autowired
   private TestService testService;

  @RequestMapping("/test")
  @ResponseBody
  public String home() {
	  String returnStr = "test";
	  List<TestBean> list = testService.selectAll();
	  for (TestBean testBean : list) {
		  returnStr += "id  :" + testBean.getId() + " ";
		  returnStr += "name:" + testBean.getName() + "<br>";
	  }
	  return returnStr;
  }



}


```

このようにして競合部分を修正します。
今回はローカルを優先した修正を行いましたが、
場合によってはリモートを優先したり、
掛け合わせたような修正を行うこともあり得ます。

## チーム開発での流れ
チーム開発の現場ではどのような流れになるでしょうか？
その状況を想定した手順を説明します。

### 1.リモートリポジトリとの比較
まずはローカルリポジトリとリモートリポジトリの比較を行います。
Gitパースペクティブからリモートトラッキングのマスターを選択し、
右クリックからワークスペースと同期化を選択します。
Gitパースペクティブの開き方は[第8回](http://qiita.com/TEBASAKI/items/df301fa808f37e6480b6 "Spring Boot解説第8回(開発環境編：EclipseプロジェクトのGit管理) - Qiita")で解説しているので、そちらを参照してください。
![image](https://qiita-image-store.s3.amazonaws.com/0/116031/a159d7c8-9073-cf34-ce40-bbd41c26200f.png)


すると同期化パースペクティブが開かくかどうかを尋ねられるので、はいを押下します。
![image](https://qiita-image-store.s3.amazonaws.com/0/116031/a81f9f58-f33b-2da6-3b49-d4d82c3ae73f.png)

同期化パースペクティブ内の表示は以下のようになっており、
赤色矢印が競合しているファイル(以下競合ファイル)、
灰色矢印がコミット対象のファイル(以下コミット対象ファイル)、
青色矢印がプル対象のファイル(以下プル対象ファイル)
をそれぞれ表現しています。
![image](https://qiita-image-store.s3.amazonaws.com/0/116031/e5047767-a721-54f5-20c1-3bf8d4cf75bc.png)


### 2.競合の有無の確認
競合ファイルの有無によって、対応方法が異なります。

競合ファイルがひとつもなければ、以下の操作を行えば完了です。

コミット対象ファイルがある→コミット、プッシュ
プル対象ファイルがある→プル

しかし、競合ファイルがひとつでもある場合は3．以降の処理が必要です。

### 3．ローカルリポジトリへのコミット
まずはプル対象ファイルを対処します。
Ctrlを押しながらクリックして、プル対象ファイルを全選択します。
その後、右クリックから上書きを選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/116031/d73aaaae-9543-1582-daff-abb8d845b2ed.png)

この操作を行うことでリモートの変更をローカルに反映させます。
この時、プル対象ファイルのアイコンが赤色矢印になりますが、問題ありません。

そして、プロジェクトを右クリックからコミットを選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/116031/8ddbe28e-8ee6-8d2f-bc61-58220fd26ae3.png)

コメントを記入してコミットボタンを押下します。
![image](https://qiita-image-store.s3.amazonaws.com/0/116031/82c8e73f-702b-d8c0-8c52-f160a1ac7366.png)


### 4.競合の確認と解消
プロジェクトを選択して、プルボタンを押下します。
![image](https://qiita-image-store.s3.amazonaws.com/0/116031/f0802c83-261c-c4b4-ba7d-8573aa7a6c7f.png)

すると表示が変化し、**赤上矢印**が表示されるようになります。
※競合ファイルの表記と非常に似ているので注意してください
![image](https://qiita-image-store.s3.amazonaws.com/0/116031/4110c1b1-4068-f3ab-bdd7-fe85dd40d552.png)


左が競合ファイル、右が赤上矢印のイメージ画像です。
![image](https://qiita-image-store.s3.amazonaws.com/0/116031/30c9c0fb-1ee5-310d-bab4-49066d254035.png)



この赤上矢印のファイルが修正すべき競合ファイルとなるので、ダブルクリックします。
マージツールが開くので、比較しながら修正を行います。
修正に関しては[競合の解消](#%E7%AB%B6%E5%90%88%E3%81%AE%E8%A7%A3%E6%B6%88)を参照してください。
![image](https://qiita-image-store.s3.amazonaws.com/0/116031/64c99e27-2b29-8f95-2c41-7610ed88ef25.png)

修正が完了したら保存し、対象ファイルを右クリック→マージ済みとマークを選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/116031/4f5132bf-13a5-947f-e829-a62c1d1f4c90.png)

以下のような表示になったらOKです。
![image](https://qiita-image-store.s3.amazonaws.com/0/116031/b2b168b5-2f22-920c-1186-be38932178bc.png)


以上の操作を赤上矢印のファイルすべてに対して行います。

### 5.リモートリポジトリへの反映
すべての競合ファイルを修正し終えたら、プロジェクトを右クリックからコミットを選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/116031/42557db4-7eaf-c288-da47-1cb74e392ead.png)

ここでGit管理から外したファイルがチェックされている場合があります。
この時チェックボックスの操作ができないので、コミットをキャンセルします。
その後 Java パースペクティブを開き、
対象のファイルを右クリックして、
チーム→拡張→変更なしを想定 を選択します。
そして同期化パースペクティブへ戻り、再度プロジェクトを右クリックからコミットを選択します。

問題がなければコミットボタンを押下します。
![image](https://qiita-image-store.s3.amazonaws.com/0/116031/83188749-3266-8c2a-c28b-09108224bee0.png)

コミット対象ファイルのみであることを確認して、プッシュボタンを押下します。
![image](https://qiita-image-store.s3.amazonaws.com/0/116031/12d13f59-336b-f1b9-6c27-c20220a1ef1a.png)

問題なければOKボタンを押下して完了です。
![image](https://qiita-image-store.s3.amazonaws.com/0/116031/07e5397d-7940-9eb9-e646-e9eeacb16cf5.png)

以上が競合解消の一連の流れになります。

# Egitの注意点
Egitを使う上で、ファイルの操作には注意が必要です。
まず、ファイルの追加・削除ですが、Eclipse上の右クリック操作から行います。
これはOSでのファイル操作を行うと、Gitのインデックスが崩れてしまうためです。

ファイルの追加の手順を説明します。
ファイルを追加するフォルダを右クリックして、インポートを選択します。
![image](https://qiita-image-store.s3.amazonaws.com/0/116031/f38c098c-948d-0f36-396b-b13ec03b7b3d.png)

一般→ファイル・システムを選択し、次へ進みます。
![image](https://qiita-image-store.s3.amazonaws.com/0/116031/ee556c14-c721-705e-551e-4a713593fc8a.png)

追加したいファイルを選択したら完了ボタンを押下すればOKです。
![image](https://qiita-image-store.s3.amazonaws.com/0/116031/aaa25ebd-b98d-392b-e20a-3fbaf8de5d02.png)

ファイルの削除は説明するまでもないとは思いますが、
対象ファイルを選択して右クリックから削除を選択するだけです。
![image](https://qiita-image-store.s3.amazonaws.com/0/116031/4640a84c-17b3-c6fe-7ed5-bcfade9c4920.png)


ファイルの移動に関しては、ドラッグアンドドロップを使えばGitが追従してくれます。
![image](https://qiita-image-store.s3.amazonaws.com/0/116031/247c6c0b-0f15-e653-658f-8bb54ce48f8f.png)


* * *
今回はここまでです。
開発環境編も残り少なくなってきました。

それではみなさん、またお会いしましょう！

# 参考URL
[Eclipse EGit の使い方(1/2) | hiromasa.another :o)](http://another.maple4ever.net/archives/2060/ "Eclipse EGit の使い方(1/2) | hiromasa.another :o)")