ぺんぎんらぼ

お笑いとマンガ好きなしょぼしょぼWeb系エンジニアの日記です。たまに絵を描きます。

お笑いとマンガ好きなしょぼしょぼWeb系エンジニアの日記です

EclipseでGit超入門 - プッシュ時のトラブルシューティング

Gitを使うのは初めて。EclipseからGitを使うことになった。そんなあなたのためのEclipseでGit超入門です。
難しいことは説明せず、必要なことだけを解りやすく説明していきます。

プッシュ時のトラブルシューティング

f:id:penguinlabo:20201010184401p:plain

エラーが出てプッシュできないようです。早く解決しないとスケジュールに遅れが出ちゃう!

non-fast-forward

現象

プッシュ結果のダイアログで「拒否 - non-fast-forward」とエラーが表示されるケースです。

f:id:penguinlabo:20201010185956p:plain

理由

これは複数の人が同一のブランチ上で作業をしていると、よく発生するエラーです。

f:id:penguinlabo:20201010192817p:plain

自分がプッシュする前に、ほかの人が同一のブランチにプッシュされ、Gitサーバ上のリポジトリが更新されてることが原因です。

対応方法

自分のPCにコピーしたリポジトリが、Gitサーバ上のリポジトリより古いことが原因なので、自分のPCのリポジトリを最新化することで、このエラーを解消できます。

f:id:penguinlabo:20201010203558p:plain

作業はGitパースペクティブで進めます。
GitリポジトリビューのGitツリーのトップを右クリックし、メニューから[プル]を選択します。


f:id:penguinlabo:20201010235940p:plain

プルした結果が表示されます。プルはプッシュの逆で、Gitリポジトリから変更内容を取得して、PCにコピーしたリポジトリを最新化するものです。
PCのリポジトリを最新化したので、これでプッシュができる状態になりました。
閉じるボタンをクリックしてダイアログを閉じます。


f:id:penguinlabo:20201010204024p:plain

再度、プッシュします。PCのリポジトリへのコミットはされているので、プッシュだけを実行します。
GitリポジトリビューのGitツリーのトップを右クリックし、メニューから[アップストリームへプッシュ]を選択します。


f:id:penguinlabo:20201011000149p:plain

プッシュ結果のダイアログが表示されます。今度はプッシュが成功しています。

競合 (コンフリクト)

現象

Gitリポジトリをプルしても「拒否 - non-fast-forward」のエラーが解消されないケースです。

f:id:penguinlabo:20201010221834p:plain

理由

先に説明した、non-fast-forwardと同様、複数の人が同一のブランチ上で作業をしていて、ほかの人が先にプッシュしたためです。
Gitリポジトリをプルしても解消されない理由は、先にプッシュされた変更と同じ行を変更しているためです。同じ個所の修正が衝突していることから、競合とかコンフリクトと呼ばれます。

競合すると、パッケージ・エクスプローラのプロジェクトに「競合」と表示され、競合しているファイルのアイコンに赤色の両矢印(⇔)が表示されいます。

f:id:penguinlabo:20201010222814p:plain

対応方法

同期化パースペクティブで競合を解決します。

f:id:penguinlabo:20201010223522p:plain

同期化ビューに競合しているファイルが表示されます。競合しているファイルを右クリックして、メニューからマージ・ツールを選択します。


f:id:penguinlabo:20201010223908p:plain

マージツールが立ち上がります。
左のペインに自分の変更した内容、右のペインにGitリポジトリの内容が表示されます。競合している行が赤枠でマークされ、競合している部分がピンクの背景で表示されます。

この競合した内容を確認して、どのような内容にするのかを決める必要があります。

自分の変更した内容を採用する
この場合は、マージ・ツールでの操作は不要です。マージ・ツールをそっと閉じます。

Gitリポジトリの内容を採用する
この場合は、マージ・ツールの競合箇所の間にある小さな四角マークにマウスカーソルを持っていきます。

f:id:penguinlabo:20201010224937p:plain

すると、「<」ボタンが現れるので、このボタンをクリックして、自分の変更内容にGitリポジトリの内容をコピーします。この機能は、自分の変更を残したまま、Gitリポジトリの内容を追加するので、自分の変更内容は手動で削除する必要があります。
最後に変更内容を保存する必要があるので、Ctrl+Sを押してファイルを保存します。

まったく別の内容を採用する
この場合は、マージツールの左のペインで自分の変更した内容を、別の内容で書き換えます。
最後に変更内容を保存する必要があるので、Ctrl+Sを押してファイルを保存します。

競合箇所が複数ある場合は、競合箇所ごとに内容を確認して、どのような内容にするかを決めていく必要があります。


f:id:penguinlabo:20201010230433p:plain

マージ・ツールでファイルの内容が確定したら、ファイルを右クリックして、メニューからマージ済みとマークを選択します。
すべての競合ファイルをマージ済みとマークすると、競合が解決されたことになり、あらためてGitにコミット、プッシュできるようになります。


f:id:penguinlabo:20201010231407p:plain

パッケージエクスプローラに戻ると、先ほどは「競合」と表示されていたところが「マージ済み」となっていることがわかります。
再び、プロジェクトで右クリックして、メニューから[チーム]-[コミット...]を選択します。


f:id:penguinlabo:20201010235940p:plain

Gitステージングビューが表示されます。通常とは違い、コミット・メッセージにマージされたことのメッセージが自動で入力されます。
また、「ステージされた変更」欄を見てください。ファイルが何も登録されてません。競合したファイルの内容を変更せずにマージ済みとした場合、「ステージされた変更」欄にそのファイルは登録されません。これは、以前にコミットした内容から変化がないためです。

コミットおよびプッシュ...ボタンをクリックします。


f:id:penguinlabo:20201011000709p:plain

今度はちゃんとプッシュされました。
競合の解決は、なかなか面倒な作業です。なるべく競合が発生しないよう、同じブランチを複数の人で修正する場合は、役割分担をしっかり決めて、変更箇所が重複しないようにしたほうが良いでしょう。