kakiro-webカキローウェブ

システム開発情報とコンピューター書籍の紹介サイト

EclipseでGitをクライアント用途として使用(EGit)(その2)

当サイトのEclipseでGitをクライアント用途として使用のページでは、EclipseでGitをクライアント用途として使用する際の導入部分を主に取り上げていますが、ここではファイルの変更内容の差分の確認方法や、競合のマージ方法を紹介していきます。

ここではGitサーバーとして、当サイトのCentOSにGitをサーバー用途としてインストール、設定のページで紹介しているリポジトリを例として使用しています。

ここで紹介している手順は、Windows8.1でEclipse 4.5 Mars Pleiades All in One PHPを使用したものになっています。

ファイルの変更内容の差分の確認

Eclipseでプロジェクト上のファイルとローカルのリポジトリとの差分、ローカルのリポジトリとサーバーのリポジトリの差分を確認するには、同期化ビューを使用します。

(1)

「Gitリポジトリー」でリポジトリのブランチの表示は「ローカル」と「リモート・トラッキング」に分かれていますが、「リモート・トラッキング」のほうのブランチ(ここでは「master」)の右クリックメニューから「ワークスペースと同期化」を選択します。

尚、サーバーのリポジトリに他のユーザーによって追加されているファイルの変更情報を、ローカルのリポジトリに取得するには(プロジェクトへのファイルの取得までは行わない)、Gitではフェッチという操作を行うのですが、「リモート・トラッキング」のほうのブランチで同期化を行うと、フェッチも自動で行われるようになっています。

(2)

プロジェクト上のファイルとローカルのリポジトリで差分のあるファイル、ローカルのリポジトリとサーバーのリポジトリで差分のあるファイルが表示されます。

※この表示は、表示形式(ツリーのアイコンから選択)に「Gitコミット」を選択したものになります。

表示される差分の分類は、上から以下のようになっています。

  • working tree:プロジェクト上で変更を行い、ローカルのリポジトリへ索引の追加(ステージ)を行っていないファイルが表示されます。
  • staged changes:プロジェクト上で変更を行い、ローカルのリポジトリへ索引の追加(ステージ)を行い、コミットを行っていないファイルが表示されます。
  • 青色の左向きの矢印でコミットメッセージ付きで表示されているファイル:サーバーのリポジトリに別のユーザーがファイルの変更内容の送信(プッシュ)を行っており、ローカルのリポジトリに取得(プル)されていないファイルが表示されます。同期化ビューのツリーにはコミットの単位別に表示されます。(ここではbbb.txtへの変更とコミットが2回行われている状態となっています。)
  • 黒色の右向きの矢印でコミットメッセージ付きで表示されているファイル:プロジェクト上で変更を行い、ローカルのリポジトリへコミットを行い、サーバーのリポジトリへの送信(プッシュ)を行っていないファイルが表示されます。同期化ビューのツリーにはコミットの単位別に表示されます。(ここではaaa.txtへの変更とコミットを3回行っている状態となっています。)

コミットは新しいのもが上に表示されるようになっています。

※前述の「Gitリポジトリー」で「ローカル」のほうのブランチで同期化を行った場合は、同期化のツリーには「working tree」、「staged changes」のみが表示されるようになります。(自動でフェッチも行われません。)

(3)

同期化ビューのツリーに表示されているファイルをダブルクリックすると、比較エディタで変更内容の差分を確認することができます。

「aaa 1回目の変更」とコミットメッセージが表示されているファイル「aaa.txt」を比較エディタで開いた場合。

「aaa 2回目の変更」とコミットメッセージが表示されているファイル「aaa.txt」を比較エディタで開いた場合。

「aaa 3回目の変更」とコミットメッセージが表示されているファイル「aaa.txt」を比較エディタで開いた場合。

「staged changes」のファイル「aaa.txt」を比較エディタで開いた場合。

「working tree」のファイル「aaa.txt」を比較エディタで開いた場合。

「bbb 1回目の変更」とコミットメッセージが表示されているファイル「bbb.txt」を比較エディタで開いた場合。

「bbb 2回目の変更」とコミットメッセージが表示されているファイル「bbb.txt」を比較エディタで開いた場合。

(4)

「Gitリポジトリー」でリポジトリの「ローカル」、「リモート・トラッキング」のそれぞれのブランチには、最新のコミットのメッセージも表示されるようになっていますが、上記の同期化時に自動でフェッチも行われるため、「リモート・トラッキング」のブランチのコミットメッセージも最新のものに更新されます。

(5)

プロジェクトの右クリックメニューから「チーム」→「プル」を選択、または「Gitリポジトリー」でリポジトリの右クリックメニューから「プル」を選択すると、サーバーのリポジトリから最新のファイルが、ローカルのプロジェクトに取得されます。

プロジェクトの右クリックメニューから「チーム」→「Push Branch 'master'」を選択、または「Gitリポジトリー」でリポジトリの右クリックメニューから「Push Branch 'master'」を選択すると、ローカルのリポジトリにコミットされているファイルの変更情報が、サーバーのリポジトリに送信されます。

プッシュのエラーについて

サーバーのリポジトリからプルしていないファイルが存在する状態では、プッシュを行うことはできず、以下のような「拒否 - non-fast-forward」のエラーになります。

サーバーのリポジトリからプルを行うことで、プッシュを行うことができるようになります。

プルのエラーについて

サーバーのリポジトリからプルを行う際に、以下のような「Failed Paths DIRTY_INDEX」のエラーになってしまう場合、

ローカルのリポジトリへ索引の追加(ステージ)を行い、コミットを行っていないファイル(staged changesの状態のファイル)が存在すると、プルを行えないようです。

プロジェクトの対象のファイルの右クリックメニューから「チーム」→「索引から除去」を行うことで、プルを行えるようになります。(索引から除去を行っても、ファイルの内容に変更はありません。)

競合のマージ

ローカル環境でファイルの変更を行い、まだサーバーのリポジトリに送信(プッシュ)をしていないファイルを、別のユーザーが変更を行い、先にサーバーのリポジトリに送信(プッシュ)を行うと、そのファイルのローカルからサーバーのリポジトリへの送信も、サーバーのリポジトリからローカルへの取得もお互いの変更が衝突して行えない、競合状態となります。

競合状態を解消するには、マージを行う必要があります。

マージを行うには、ローカル環境で変更を行ったファイルは、ローカルのリポジトリにコミットされている必要があります。

以下のように、別のユーザーが変更し、サーバーのリポジトリにプッシュを行っているファイルを例として、ローカルで変更していきます。

以下のように、ローカルでファイルの変更を行い、ローカルのリポジトリにコミットを行っていない状態とします。

競合状態となるファイルのコミットをまだ行っていない場合、以下で紹介するマージの手順を行っても、以下のように「Checkout Conflicts」、「The files shown below have uncommitted changes (略)」と表示され、競合のマージは行えません。

また、競合状態となるファイルのコミットをまだ行っていない場合、サーバーのリポジトリからプルを行おうとしても、「Checkout conflict with files (略) CheckoutConflictException」と表示され、プルを行うことはできません。

以下のように、ローカルで行った変更を、ローカルのリポジトリにコミットした状態とします。

この状態でプッシュを行おうとしても、先に記載したようにサーバーのリポジトリからプルしていないファイルが存在する状態では、プッシュを行うことはできません。

以下、マージを行う手順になります。

(1)

「Gitリポジトリー」で、「リモート・トラッキング」のほうのブランチの右クリックメニューから「マージ」を選択します。

(2)

「マージ結果」画面に「Conflicting」と表示されます。「OK」ボタンをクリックします。

※尚、手順(1)でマージではなく、プルを行った場合は、以下のように表示され、手順(3)以降は同様にマージを行うことができます。

(3)

同期化ビューを表示すると、競合状態の表示になっています。

また、競合しているファイルの内容は以下のようにローカルのリポジトリの変更内容と、サーバーのリポジトリの変更内容が特殊な形式で組み合わされたものになっています。

(4)

上記のような競合状態のファイルは直接編集せず、マージツールを使用して編集することができます。

同期化ビューで、競合状態の表示になっているファイルの右クリックメニューから「マージ・ツール」を選択すると、以下のようにローカルのリポジトリの変更内容と、サーバーのリポジトリの変更内容を左右で比較して確認することができます。

マージツールで左のローカル側に表示されている内容を競合を解消した状態に編集し、変更内容を保存(Ctrl+Sを使用した通常の保存)します。

マージツールで編集し保存したファイルは、競合状態の特殊な形式でもなくなっています。

(5)

マージツールでのファイルの編集が完了したら、同期化ビューで競合状態の表示になっているファイルの右クリックメニューから「マージ済みとマーク」を選択します。

マージ済みとマークを行うと、同期化ビューの表示も競合状態ではなくなります。

尚、マージツールで競合の解消を行ったファイルは「staged changes」の状態となり、ローカルのリポジトリへのコミットは行われていません。

マージ前にローカルのリポジトリに行ったコミットも残った状態となります。

マージ前にサーバーのリポジトリに行われたプッシュも残った状態となります。

(6)

マージしたファイルのコミットを行うと、マージが完了します。

コミットのダイアログでコミットメッセージには、デフォルトでマージ用のメッセージが入力されています。

コミット後の同期化ビューの表示は、ローカルのリポジトリへのコミットのみになります。

(7)

最後にローカルのリポジトリからサーバーのリポジトリへ変更内容の送信(プッシュ)を行うと、ローカルのリポジトリとサーバーのリポジトリが同じ最新の状態となります。

以上でEclipseでGitをクライアント用途として使用(EGit)(その2)の完了です。