競合データを含むファイルをコミットすることができます。git mergetool を実行すると必要なファイルが生成され、マージ ツールが実行されるように、これらのファイルを再び競合としてマークする方法はありますか?
6 に答える
--conflict=merge
インデックスがすでに競合状態にある場合は、次のフラグを使用してファイルをチェックアウトします。
git checkout --conflict=merge file
未解決のファイルが[誤って]追加されたためにインデックスがクリーンな場合は、チェックアウトする前にリセットしてください:
git reset file
git checkout --conflict=merge file
これにより、通常の競合解決を再開できます (例: git mergetool
)。
注:@fourpastmidnightからのリクエストにより、@jakub-narębskiの回答へのコメントを独自の回答に昇格させます。:)
を使用して競合マーカーを含むファイルの内容を取得できますがgit checkout --conflict=merge -- file
、を使用してインデックスをクリーンアップした場合git add file
(または、GUIがそれを行った場合)、機能しません。
ありますがgit update-index --unresolve
、ハッキーで、あまり確実に動作しません。復元する状態はgit-mergetoolには不十分だと思います。
おそらく、マージをやり直すか、git update-index --cacheinfo
ステージのバージョンを手動で設定するために使用する必要があります... git-stashは、正しく解決された競合を保持するのに役立ちます。
最もエレガントな解決策は、この問題を最初から防ぐことです。
git config --global mergetool.[tool].cmd [command-line call]
git config --global mergetool.[tool].trustExitCode false
私の知る限りでは、ファイルに競合マーカーが含まれている間はコミットできません。...これは正確には真実ではありません:
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
ないようにします。
使ってくださいgit update-index --unresolve
git 1.7 以降、インデックスからの解決と元に戻す情報を使用して、3 つのステージすべて (1:base、2:ours、3:theirs) を復元します: https://github.com/git/git/commit/8aa38563b22c84b06ea1fff9638cc1f44fda726f
@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 を終了した後にコミットしていないことにも注意してください。