4

git で競合を解決する必要がありますが、初心者として、何が最も効果的な方法かわかりません。

これは私の状況です:

ここに画像の説明を入力

すべての変更をコミットしてmasterプッシュする必要があります。

$ git プル:

エラー: 'foo.cpp' へのローカルの変更は、マージによって上書きされます。中止しています。マージする前に、変更をコミットするか、隠しておいてください。

競合するファイルがいくつかあります。もちろん、私はウェブを検索しました:

Git でマージの競合を解決するには?

残念ながら、どちらのソリューションもうまく機能しません。stash を使用して (diff を取得してクリーンにする)、手動で解決することもできますが、git mergetoolまたは SourceTree を使用したいと考えています。

これは私が試したことです:

$ git config merge.conflictstyle diff3
$ git mergetool
merge tool candidates: tortoisemerge emerge vimdiff
No files need merging
$ git mergetool -t vimdiff
No files need merging
$ git mergetool -t vimdiff foo
foo.cpp: file does not need merging
$ git diff foo.cpp
diff --git a/foo.cpp b/foo.cpp
index xxxxxx yyyyy
--- a/foo.cpp
+++ b/foo.cpp
@@ .....
..... <omitted>
$

何が悪いのかわかりません。git mergetool正しく動作しません。合流する必要はないと言われています。ただし、違いが示され、git pull競合が報告されます。

mergetoolQ1)インタラクティブな競合解決またはマージにどのように使用できますか?

Q2) SourceTree を使用して競合を解決することは可能ですか? 試してみましたが、直感的でもありません。

ありがとうございました!

4

2 に答える 2

4

表示されているエラー:

error: Your local changes to 'foo.cpp' would be overwritten by merge. Aborting. Please, commit your changes or stash them before you can merge.

あなたが持っているからですuncommitted changes(これは SourceTree 表示の一番上に表示されます)。コミットされていない変更がある場合、マージの試みは失敗します。次の 3 つの選択肢があります。

  1. すべての変更を無効にする (使用: git reset --hard)
  2. すべての変更を隠します (使用: git stash)
  3. すべての変更をコミットします (使用: git add ...; git commit ...)

それが完了すると、マージが許可されます。上記のオプション #3 を選択すると、競合が発生する可能性があります。オプション #1 または #2 の競合はありません。[注: オプション #2 については、git stash pop後で行うため、競合が発生する可能性があります。]

Q1の場合:do git config merge.tool diff3(またはvimdiffなど)。マージは混乱を招く可能性があります (通常は 3 方向のマージであるため、ツールには 3 つのバージョンと結合されたバージョンが表示されます)。

Q2: SourceTree には独自のマージ ツールが含まれていません。別のものに頼る必要があります (私は p4merge と SourceTree を使用しています)。これらの構成オプションを使用すると:

difftool.sourcetree.cmd=/Applications/p4merge.app/Contents/MacOS/p4merge "$LOCAL" "$REMOTE"
difftool.sourcetree.path=
mergetool.sourcetree.cmd=/Applications/p4merge.app/Contents/MacOS/p4merge "$BASE" "$LOCAL" "$REMOTE" "$MERGED"
mergetool.sourcetree.trustexitcode=true
于 2013-04-04T02:33:58.390 に答える
1

プルされるリモートで変更されたファイルに変更を加えたため、競合メッセージが表示されます。したがって、変更を隠しておくかコミットするようにメッセージが表示されます。

これらのいずれかを行ってからプルすると、解決すべき競合がある場合とない場合があります。たとえば、プルした変更が変更と同じ場所にない場合、競合は発生しません。もしあるなら、mergetool はそれを処理するために動作するはずです。

于 2013-04-03T21:09:23.707 に答える