56

競合データを含むファイルをコミットすることができます。git mergetool を実行すると必要なファイルが生成され、マージ ツールが実行されるように、これらのファイルを再び競合としてマークする方法はありますか?

4

6 に答える 6

41

--conflict=mergeインデックスがすでに競合状態にある場合は、次のフラグを使用してファイルをチェックアウトします。

git checkout --conflict=merge file

未解決のファイルが[誤って]追加されたためにインデックスがクリーンな場合は、チェックアウトする前にリセットしてください:

git reset file
git checkout --conflict=merge file

これにより、通常の競合解決を再開できます (例: git mergetool)。

:@fourpastmidnightからのリクエストにより、@jakub-narębskiの回答へのコメントを独自の回答に昇格させます。:)

于 2016-05-18T16:37:15.910 に答える
29

を使用して競合マーカーを含むファイルの内容を取得できますがgit checkout --conflict=merge -- file、を使用してインデックスをクリーンアップした場合git add file(または、GUIがそれを行った場合)、機能しません。

ありますがgit update-index --unresolve、ハッキーで、あまり確実に動作しません。復元する状態はgit-mergetoolには不十分だと思います。

おそらく、マージをやり直すか、git update-index --cacheinfoステージのバージョンを手動で設定するために使用する必要があります... git-stashは、正しく解決された競合を保持するのに役立ちます。

于 2010-05-07T01:17:57.300 に答える
7

最もエレガントな解決策は、この問題を最初から防ぐことです。
git config --global mergetool.[tool].cmd [command-line call]
git config --global mergetool.[tool].trustExitCode false

于 2010-05-18T15:08:17.697 に答える
2

私の知る限りでは、ファイルに競合マーカーが含まれている間はコミットできません。...これは正確には真実ではありません:
OPはあなたができると述べています(私はここに彼の pastbinをコピーします)が、それはmergetoolが再びトリガーされるのに十分ではありません:

Auto-merged README
CONFLICT (content): Merge conflict in README
Automatic merge failed; fix conflicts and then commit the result.
lynx:~/test_clone$ ls
README
lynx:~/test_clone$ git add README
lynx:~/test_clone$ git commit -a
Created commit 46ee062: It works!
lynx:~/test_clone$ ls
README
lynx:~/test_clone$ cat README
<<<<<<< HEAD:README
testingtesting
=======
hmm
>>>>>>> 881d60f5f738bc5716f5c9a9384e262b535717fd:README
lynx:~/test_clone$

Charles Baileyがコメントし、このSO answerで説明しているように、 indexに同じファイルの 3 つのインスタンスがあるため、mergetool がクエリされます。

競合中のマージされていないファイルの場合、git はインデックス内のファイルの共通のベース、ローカル、およびリモート バージョンを利用できるようにします。(これは、 によって 3-way diff ツールで使用するために読み取られる場所ですgit mergetool。) git show を使用してそれらを表示できます。

# common base:
git show :1:afile.txt

# 'ours'
git show :2:afile.txt

# 'theirs'
git show :3:afile.txt

git add(コンフリクト マーカーを含む、どんなコンテンツでも) は自動的にそれらのうち 2 つを削除し、が再度呼び出されmergetool ないようにします。

于 2010-05-06T11:50:27.183 に答える
0

使ってくださいgit update-index --unresolve

git 1.7 以降、インデックスからの解決と元に戻す情報を使用して、3 つのステージすべて (1:base、2:ours、3:theirs) を復元します: https://github.com/git/git/commit/8aa38563b22c84b06ea1fff9638cc1f44fda726f

于 2015-01-18T17:28:08.910 に答える
0

@VonC: 最初はアカウントを作成していなかったので (今は作成しています)、コメントを投稿できませんでした。git mergetool を呼び出しても検出されません。

自動マージされた README
CONFLICT (コンテンツ): README のマージ競合
自動マージに失敗しました。競合を修正してから、結果をコミットします。
リンクス:~/test_clone$ ls
README
lynx:~/test_clone$ git add README
リンクス:~/test_clone$ git commit -a
コミット 46ee062 を作成しました: 動作します!
リンクス:~/test_clone$ ls
README
lynx:~/test_clone$ 猫の README
>>>>>> 881d60f5f738bc5716f5c9a9384e262b535717fd:README
リンクス:~/test_clone$ git mergetool
マージツールの候補: opendiff emerge vimdiff
ファイルをマージする必要はありません
オオヤマネコ:~/test_clone$

git mergetool はファイル名を受け入れることができますが、それも機能しません:

自動マージされた README
CONFLICT (コンテンツ): README のマージ競合
自動マージに失敗しました。競合を修正してから、結果をコミットします。
caracal:~/test_clone2$ git マージツール
マージツールの候補: opendiff emerge vimdiff
ファイルのマージ: README

「README」の通常のマージ競合:
  {ローカル}: 変更
  {リモート}: 変更
Return キーを押して、マージ解決ツール (emerge) を開始します。
カラカル:~/test_clone2$ ls
#*merge*#145962bz# README README~ README.orig
caracal:~/test_clone2$ git マージツール
マージツールの候補: opendiff emerge vimdiff
ファイルをマージする必要はありません
caracal:~/test_clone2$ git mergetool README
マージツールの候補: opendiff emerge vimdiff

README: ファイルをマージする必要はありません
カラカル:~/test_clone2$ ls
#*merge*#145962bz# README README~ README.orig
カラカル:~/test_clone2$

ここで、git mergetool を終了した後にコミットしていないことにも注意してください。

于 2010-05-06T21:30:24.237 に答える