Git(29)EclipseのMerge Toolでコンフリクトを修正する

2017-06-25

旧ブログ

t f B! P L
いまだにコンフリクトの修正がスムーズにできません。とりあえずわかったMerge Toolの使い方を記録しておきますが、いまだにいまいち使い方がわかりません。Eclipse Neon.2(4.6.2)、Eclipse Git Team Provider 4.4.1でやっています。

前の関連記事:Git(28)EclipseのPullでCheckout conflictがでたときのマイルール


FeatureブランチをFinishしてDevelopブランチにマージする



このfeature/201706200017ブランチをdevelopブランチにマージします。

feature/201706200017ブランチを右クリック→Git Flow→Finish Feature。


developブランチのコミットを整理したいのでSquashにチェックをして、さらにまだブランチを残しておきたいのでKeep branchにもチェックを付けておきました。


Squashをチェックしているので一つにまとめたコミットのメッセージを修正できます。

それでこのマージはコンフリクトしているのですが、何もメッセージボックスがでてきません。

ソースをみると<<<<<<< HEADとか挿入されていてコンフリクトしていることがわかります。

Merge Toolでコンフリクトを修正する

<<<<<<< HEAD
もともとブランチにあったコード
=======
マージさせたいブランチのコード
>>>>>>> refs/heads/feature/201706200017
ソースはこのようになっているのでこれを修正してもいいのですが、修正コードが長いとみにくいのでツールを使うことにします。

コンフリクトしているdevelopブランチを右クリック→Synchronize with Workspace。


Synchronizeタブを見るとコンフリクトしているファイルがどれかわかります。

コンフリクトしているファイルを右クリック→Merge Tool。


これの使い方がよくわからないのですよね。

左側がマージさせたい新しいコード、右側がもともとあったコードになっています。
(2017.6.29追記コミットが新しい方のファイルが左に来るようです。どちら側にコミットしようとしているかはコードの枠の上にでているコミット名の間にある矢印で判断します。)
(2017.6.30追記。コミット名の間にある矢印が両端矢印になるとき(コメントのみの差異のとき?)があり当てになりません。
Two-Way Compare(Ignore Ancestor)ボタンをクリックするとコミット名間の矢印はなくなりますが、結局はそのボタンの右にあるボタンの矢印の方向で判断するのが最善のようです。)


Show Ancestor Paneボタンをクリックすると新しい枠がでてきます。


上の枠には右側のコードが表示されています。

右下のもともとにあるコードを編集していくので、上のコードにはその編集前のコードが表示されることになります、、、と思いましたが、そうでもないようで画面を切り替えると結局は右下と上の枠は同じコードが表示されてしまいます。

左端のSwap Left and Right View ボタンは名前からすると下の左右の枠の中身が入れ替わりそうですがクリックしても何も変化がありません。
(2017.8.25追記。いまだに左右がどちらになるのか規則がわかりません。とりあえず職場で使っているPCでは右から左にマージ、自宅で使っているPCは左から右へマージになっていて、それを変える方法はわかりません。)


左から3つ目のTwo-Way Compare(Ignore Ancestor)ボタンをクリックすると色合いが変わってShow Ancestor Paneボタンがクリックできなくなります。

うーん、色がついている単語も少し変更になっていますが、Three-Way Compareとの違いがよくわかりませんね。


真ん中に表れているコネクタの四角にマウスポインタを載せるとCopy Current Change from Left to Rightボタンが表示されます。

これをクリックすると左のコードが右のコードに置き換えられます。

元に戻すには右の画面で右クリック→Undo、で戻せました。

Compareモードを切り替えると比較部分が一新されました。


Copy Current Change from Left to Rightボタンをいちいちクリックしなくても、Copy All from Left to Rightボタンをクリックすると左側の変更部分がすべて右側にコピーされます。

ところがこのCopy All from Left to Rightボタンが反応しないときも多くて、どうしたものかと思いましたが、Two-Way Compare(Ignore Ancestor)ボタンをクリックしたあとだと必ず動作することがわかりました、、、めんどくさ、、、

とりあえず右枠のコードを編集すればよいようです。

マージされるブランチをマージするブランチで置き換えたいときはMerge ToolでTwo-Way Compare(Ignore Ancestor)ボタンをクリックして、Copy All from Left to Rightボタンをクリックすることにします。

コードのコンフリクトを解消した後コミットする


Merge Toolの右側のコードを修正してファイルを保存します。

これだけではまだコンフリクトしたままの扱いです。


ソースを編集して保存したのだからコミットするものと思うのですが、コミットしようと思うと変更点がないので前回のコミットコメントを修正するのか、と聞かれてコミットできません。

コミットするにはSynchronizeタブで編集したファイルを右クリック→Add to Index、でコミットできるようになります。

Add to IndexするとSynchonizeタブからそのファイルが見えなくなります。

それはIncoming Modeに切り替わるからです。


Add to Indexを戻すにはSynchronizeタブにあるボタンからIncoming/Outgoing Modeに戻します。

そしてAdd to Indexしたファイルを右クリック→Remove from Index、でAdd to Indexする前の状態に戻せます。

Incoming/Outgoing Modeボタンの右横にあるConflicts Modeボタンをクリックするとまだマージが完了していないファイルだけ表示させることができます。

Compare Editorは使えない


Team SynchronizingパースペクティブのSynchronizeビューでコンフリクトしているファイルを右クリック→Open in Compare Editor、を選択するとCompare Editorでファイルが開きます。


Merge Toolとよく似た見た目ですが、左側の枠には何も表示されず、右側の枠には<<<<<<< HEADなどが挿入されたままです。

Compare Editorはファイル同士を比較するのに使うようですが、どうやって比較対象を追加するのすらよくわかりませんでした。

Overwriteを選択するとファイルが消えてしまう


Team SynchronizingパースペクティブのSynchronizeビューでコンフリクトしているファイルを右クリック→Overwriteを選択します。


ここでYesを選択するとファイル自体が消えてしまいました。


Synchronizeビューでは-アイコンが表示されています。

Compare Editorでは右の枠の表示が消えて、左側の枠にマージされる側のブランチのコードが表示されました。

この状態で新たなファイルを開くと右側の枠に新たに開いたファイルの内容が表示されて、左側のコードと比較できるようになります。

このOverwriteしてしまった状態を元に戻すにはコミットを戻すしかありませんでした。

Cannot resolve ORIG_HEADがでてくるときの対応



FeatureブランチをFinishしてDevelopブランチとコンフリクトしたのでSynchronize with WorkspaceでMerge Toolを起動しようするとCannot resolve ORIG_HEADと言われて操作できないときに出くわしました。

EGIT: cannot resolve ORIG_HEAD - Stack Overflow

.git/ORIG_HEADファイルがないのが原因のようです。

確かにこのエラーがでているときにORIG_HEADファイルが存在しませんでした。

Featureブランチをチェックアウトして、Resetして、マージを元に戻してからもう一度マージをやり直すとORIG_HEADファイルが出現しました。

これで問題は解決しましたが原因はよくわかりませんでした。

単に処理のタイミングの問題でしょうか。

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ