web-dev-qa-db-ja.com

EGitの競合を解決する方法

Eclipse v4. (Kepler)でEGitを使用しています。変更をコミットしてプッシュしたい。最初にプルを実行すると、1つのファイルが競合しています。競合を手動で解決した後(ローカルとリモートは同じになりました)、まだ問題が発生しています。

各アクションのエラーメッセージは次のとおりです。

アップストリームにプッシュ

マスター:マスター[拒否-早送りなし]

引く

状態がMERGING_RESOLVEDのリポジトリにプルできません

マージ済みとしてマーク

インデックスへのリソースの追加に失敗しましたインデックスへのリソースの追加に失敗しましたaddコマンドの実行中に例外がキャッチされました

ハードリセット

「refs/heads/masterへのリセット」中に内部エラーが発生しました。リセットコマンドの実行中に例外がキャッチされました。 {0}

競合を削除して変更をプッシュするにはどうすればよいですか?私は何を間違えていますか?

51
Sionnach733

チーム同期ビューを使用していますか?もしそうならそれは問題です。 Team Synchronizeビューでの競合解決は、EGitでは機能しません。代わりに、Gitリポジトリビューを使用する必要があります。

Gitパースペクティブを開きます。 Gitリポジトリビューで、BranchesLocalmasterに移動します右クリック→Merge...

Remote TrackingOrigin/masterを自動選択する必要があります。押す Merge

result:conflictと表示されるはずです。

競合するファイルを開きます。ファイルに古いsk000l >>>> ===== <<<<スタイルマージの競合があるはずです。ファイルを編集して競合を解決し、保存します。

これで、「Gitステージング」ビューの「ステージングされていない変更」に変更されたファイルが表示されます。右クリックして「インデックスに追加

Enter image description here

残りのファイルについて繰り返します。

「gitステージング」ビューから、コミットしてプッシュします。 Git/Eclipseは、リモートのOriginの変更をマスターにマージしたことを知っているため、非早送りエラーを回避する必要があります。

75
dan carter

また、EGitでマージの競合を解決することは混乱を招きます。共有リポジトリにいくつかの変更をコミットする準備ができたら、私が学んだ手順は次のとおりです。

  1. プロジェクトを右クリックして、「チーム:コミット...」を選択します。
  2. 変更内容を確認して、誤って行った変更や忘れていた無関係な変更をコミットしていないことを確認します。変更を確認している間にコミットメッセージを作成します。
  3. 私は楽観的ですので、まず「コミットしてプッシュ」ボタンをクリックします。誰も変更をプッシュしていない場合、完了です。誰かが持っている場合、コミットは成功し、プッシュは拒否されます。
  4. プロジェクトを右クリックして、「チーム:プル」を選択します。競合がない場合は、[チーム:上流へプッシュ]を選択して完了です。
  5. 競合がある場合は、パッケージエクスプローラーを調べて、競合しているファイルを確認します。競合する各ファイルを右クリックして、[チーム:マージツール]を選択します。両方のバージョンのファイルのすべての変更が表示され、競合は赤で表示されます。ボタンをクリックして、競合しない変更をすべてマージし、赤いセクションを手動で編集します。共通の祖先を含む3者間マージを表示するボタンもあります。
  6. ファイルへの変更を保存します。必要に応じて、HEADと比較して、今行った変更の上にどのような変更を加えているかを確認できます。
  7. ファイルを右クリックし、[チーム:インデックスに追加]を選択して、EGitにそのファイルのマージが完了したことを伝えます。私にとって、これは最も直感的なステップではありませんが、gitコマンドラインはaddコマンドを使用してマージが完了したことを示します。
  8. 他の競合ファイルについても繰り返します。
  9. すべてのファイルがマージされたら、プロジェクトを右クリックして、「チーム:リベース:リベースを続行」を選択します。競合するコミットがさらにある場合は、競合の処理に戻ります。
  10. リベースが完了したら、テストを実行して、リベースが何も破損していないことを確認します。
  11. プロジェクトを右クリックして、「チーム:上流へプッシュ」を選択します。
24
Don Kirkby

このガイドは役に立ちました http://wiki.Eclipse.org/EGit/User_Guide#Resolving_a_merge_conflict

更新された私の手順についてのメモだけで、これは私が進める方法です:

  1. 変更をコミット
  2. フェッチ(ワークスペースの同期化)
  3. 引く
  4. マージツール(チーム->マージツール)を使用して競合を管理し、保存する
  5. 各ファイルをステージに追加します(チーム->インデックスに追加)
  6. これで、ステージウィンドウのコミットメッセージに「マージされたXXX」が事前入力されます。そのままにするか、コミットメッセージを変更できます
  7. コミットおよびプッシュ

場合によっては危険ですが、Git ExtensionやSource Treeなどの外部ツールの使用を避けることは非常に便利です

6
Tonino

私はこれが古い投稿であることを知っていますが、同様の問題に見舞われ、それを解決することができたので、共有したいと思いました。

更新:以下のコメントに記載されているように、この回答はeGitに「git stash」機能を含める前でした。)

私がしたことは:

  1. 競合するファイルのローカルコピーを、上流のバージョンからの変更がある場合とない場合があります。
  2. Eclipse内で、競合の直前にファイルを「元に戻す」。
  3. リモートリポジトリから「プル」を実行して、すべての変更をローカルの作業ディレクトリに同期できるようにします。これにより、ファイルシステムに到達する更新がクリアされ、Pushに残したものだけが残ります。
  4. コピーしたコピーを使用して、作業ディレクトリ内の競合ファイルの現在のバージョンを確認します。違いがある場合は、ファイルを適切にマージし、作業ディレクトリにそのバージョンのファイルをコミットします。
  5. 次に、変更を「プッシュ」します。

それが役に立てば幸いです。

4
B.Kaatz

競合するファイルを右クリックし、競合を解決してからインデックスに追加します。

1
user1583465

これは私たちが頻繁に直面する問題であるため、以下にそれを解決する手順を示します。

  1. Gitパースペクティブを開きます。 Gitリポジトリビューで、ブランチローカルマスターに移動し、右クリック→マージ ...

  2. 自動選択リモートトラッキング→* Origin/master。押す Merge

  3. Eclipseでステージビューを起動します。

  4. 最初に競合を示したファイルをダブルクリックします

  5. 競合のマージビューで、すべての非競合+競合の変更に対して左から右へ左矢印を選択すると、すべての競合を解決できます。

  6. マージされたファイルを保存します。

  7. チームを行う→Eclipseから再度プルします。

準備万端です :)

0
Som

Eclipseで(ステージングビューを介して)競合を解決する以前のプロセスは、数年前よりずっと直感的に見えたので、ツールが以前のように機能しなくなったか、内部のマージ競合を解決するプロセスを覚えています- SVNリポジトリ。とにかく、競合するファイルを右クリックすると、この気の利いた「マージ済みとしてマーク」メニューオプションがありました。

2019年に早送りして、Eclipse(v4.11)の「Git Staging」ビューを使用しています。実際、私はSTS(Spring Tool Suite 3.9.8)を使用していますが、Git StagingビューはJava/Springベースのプロジェクトを操作するための標準のEclipseプラグインだと思います。私が他の人に役立つ場合と、GITコマンドラインからマージの競合を解決するために、次のアプローチを共有します。 ;-)

今思い出した機能はなくなっているため(または、現在のバージョンのGITとEclipseで異なる方法で実行される可能性があるため)、GITリポジトリを使用してEclipseを介してマージの競合を解決するための現在の手順を次に示します。それは私にとって最も直感的なようです。明らかに、ここでの応答の数から、マージの競合を解決する方法はmanyあることが明らかです。多分、3者間マージツールを使用してJetBrains IntelliJに切り替える必要があるだけです。

  1. 問題のあるファイルをダブルクリックします
  2. 競合するコミットを並べて表示した「テキスト比較」インターフェースが表示されます。
  3. どのビューがファイルのローカル状態であるか、または最新のコミットであるかを特定します。
  4. 問題のあるコミットからの変更を追加または編集して、ローカルウィンドウに変更を加えます。
  5. 目的の変更セットが確認および更新されたら、ステージングされていないファイルを右クリックします。
  6. [インデックスに追加]オプションをクリックすると、ファイルが段階的な変更に追加されます。
  7. これにより、競合するファイルがステージングされていないリストから削除され、「マージ済みとしてマークされている」ことを示します。
  8. 競合する追加フ​​ァイルごとにこのプロセスを続けます。
  9. 競合するすべてのファイルを破棄したら、必要なすべてのファイル(追加の変更を含む)がステージングされていることを確認します。
  10. 適切なコミットメッセージを追加します。
  11. 「マージされた」ファイルをOriginリポジトリにコミットしてプッシュすると、ファイルがマージ済みとして正式にマークされます。

注:メニューオプションは直感的ではないため、多くのことが誤解を招く可能性があります。たとえば、更新をローカルに保存し、競合するファイルを再度開いて、行った変更が保持されていることを確認しようとすると、変更ではなく元の競合状態が開かれるため混乱が生じる可能性があります。

ただし、インデックスにファイルを追加すると、そこに変更が表示されます。

また、マージの競合を引き起こす変更を取り込む場合は、最初にローカルの変更を「隠して」から、再度変更を取り込むことをお勧めします。少なくともGITでは、保護として、変更を元に戻すかスタッシュするまで、外部の変更を取り込むことはできません。変更が重要でない場合は、破棄してHEAD状態に戻しますが、そうでない場合は隠しておきます。

最後に、1つまたは2つのファイルのみを変更する場合は、それらを参照として個別のテキストファイルにプルし、HEADに戻してから、変更をプルするときにファイルを手動で更新することを検討してください。

0
Michael M

このアプローチは「スタッシュ」ソリューションに似ていますが、より明確になると思います。

  1. 現在のローカルブランチは「マスター」であり、ローカルに変更があります。
  2. 同期後、着信変更があり、一部のファイルをマージする必要があります。
  3. したがって、最初のステップは、新しいローカルブランチに切り替えることです(「my_changes」など):
    • チーム->切り替え->新しいブランチ
      • ブランチ名:my_changes(例)
  4. 新しいブランチに切り替えた後、コミットされていないローカルの変更はまだ存在しています。したがって、コミットされていないすべてのローカル変更を新しいブランチ「my_changes」にコミットします。
  5. ローカルの「マスター」ブランチに切り替えます:
    • チーム->切り替え->マスター
  6. ここで、[チーム]-> [ワークスペースの同期]を選択すると、「マージ」ファイルは表示されません。
  7. チームを選択->プル
    • これで、ローカルの「マスター」ブランチは、リモートの「マスター」ブランチに対して最新の状態になりました。
  8. 現在、2つのオプションがあります。
    • オプション1:
      • 「チーム」->「マージ」を選択して、「my_changes」ローカルブランチから元のローカル変更を「マスター」ローカルブランチにマージします。
      • ここで、前のステップから受け取った変更をローカルの「マスター」ブランチにコミットし、それらをリモートの「マスター」ブランチにプッシュします。
    • オプション2:
      • 「my_changes」ローカルブランチに再び切り替えます。
      • ローカルの「マスター」ブランチからの更新を「my_changes」ブランチにマージします。
      • 「my_changes」ブランチで現在のタスクを続行します。
      • タスクが完了したら、上記のオプション1を使用して、ローカル「マスター」ブランチとリモートブランチの両方を更新します。
0
ashawki

競合を解決するには、Git stashを使用して、コミットされていない変更を保存します。次に、リモートリポジトリの変更セットをプルダウンします。次に、ローカルスタッシュをポップして、コミットされていない変更を再適用します。

Eclipse v4.5(火星)で変更を隠します(比較的最近の追加で、以前のEGitにはありませんでした)。これを行います。GitコントロールにあるトップレベルのEclipseプロジェクトを右クリックし、Team、ピックStashes、ピックStash Changes; stashコミットメッセージを要求するダイアログが開きます。

トップレベルプロジェクトでコンテキストメニューを使用する必要があります! Git制御プロジェクト内のディレクトリまたはファイルを右クリックしても、適切なコンテキストメニューが表示されません。

0
chrisinmtown