競合データを含むファイルをコミットすることが可能です。これらのファイルを再度競合としてマークして、git mergetoolを実行すると必要なファイルが生成され、マージツールが実行されるようにする方法はありますか?
git checkout --conflict=merge -- file
を使用して競合マーカーを含むファイルの内容を取得できますが、git add file
を使用してインデックスをクリーンアップした場合(またはGUIがそれを行った場合)、機能しません。
git update-index --unresolve
がありますが、ハッキーであり、信頼性が高くありません。復元する状態はgit-mergetoolには不十分だと思います。
おそらく、マージをやり直すか、git update-index --cacheinfo
を使用してステージのバージョンを手動で設定する必要があります... git-stashは、正しく解決された競合を保持するのに役立ちます。
インデックスがすでに競合状態にある場合は、--conflict=merge
フラグが付いたファイルをチェックアウトするだけです。
git checkout --conflict=merge file
未解決のファイルが[誤って]追加されたためにインデックスがクリーンな場合は、チェックアウトする前にリセットしてください。
git reset file
git checkout --conflict=merge file
これにより、競合の解決を通常どおり再開できます(例:git mergetool
)。
[〜#〜] note [〜#〜]:@ fourpastmidnightからのリクエストにより、@jakub-narębskiの回答へのコメントを独自の回答に昇格させます。 :)
最も洗練された解決策は、この問題を最初から防ぐことです。git config --global mergetool.[tool].cmd [command-line call]
git config --global mergetool.[tool].trustExitCode false
私の知る限りでは、 ファイルに競合マーカーが含まれている間は、コミットできません。...これは正確には真実ではありません:
OPはあなたができると述べています(私はここにコピーします 彼のパストビン )、しかしそれは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回答 、同じファイルのインスタンスが3つあるため、mergetoolが照会されますインデックス内:
競合内のマージされていないファイルの場合、gitは、インデックス内のファイルの共通ベース、ローカル、およびリモートバージョンを利用できるようにします。 (これは、
git mergetool
によって3方向差分ツールで使用するために読み取られる場所です。)gitshowを使用してそれらを表示できます。
# 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以降、インデックスからのresolve-undo情報を使用して、3つのステージすべて(1:base、2:ours、3:theirs)を復元します: https://github.com/git/git/commit/8aa38563b22c84b06ea1fff9638cc1f44fda726f
@VonC:最初はアカウントを作成していなかったので(今は作成しています)、コメントを投稿できませんでした。 git mergetoolを呼び出しても、それは検出されないようです。
自動マージされたREADME CONFLICT(コンテンツ):READMEでのマージの競合 自動マージに失敗しました。競合を修正してから結果をコミットします。 lynx:〜/ test_clone $ ls README lynx:〜/ test_clone $ git add README lynx:〜/ test_clone $ git commit -a created commit 46ee062:動作します! lynx:〜/ test_clone $ ls README lynx:〜/ test_clone $ cat README >>>>>> 881d60f5f738bc5716f5c9a9384e262b535717fd:README lynx:〜/ test_clone $ git mergetool マージツール候補:opendiffemergevimdiff ファイルをマージする必要はありません[._ ] lynx:〜/ test_clone $
git mergetoolはファイル名を受け入れることができますが、それも機能しません。
自動マージされたREADME CONFLICT(コンテンツ):READMEでのマージの競合 自動マージに失敗しました。競合を修正してから、結果をコミットします。 caracal:〜/ test_clone2 $ git mergetool マージツール候補:opendiff Emerge vimdiff ファイルのマージ:README 'README'の通常のマージ競合: {ローカル}:変更済み {リモート}:変更済み マージ解決ツールを開始するために戻る(emerge): caracal:〜/ test_clone2 $ ls #* merge *#145962bz#README README〜README.orig caracal:〜/ test_clone2 $ git mergetool [ .________________ ] README:ファイルをマージする必要はありません caracal:〜/ test_clone2 $ ls #* merge *#145962bz#README README〜README .orig caracal:〜/ test_clone2 $
ここでも、gitmergetoolを終了した後にコミットしなかったことに注意してください。