web-dev-qa-db-ja.com

Gitにファイルを競合としてマークさせる方法はありますか?

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

44

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

git update-index --unresolveがありますが、ハッキーであり、信頼性が高くありません。復元する状態はgit-mergetoolには不十分だと思います。

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

23
Jakub Narębski

インデックスがすでに競合状態にある場合は、--conflict=mergeフラグが付いたファイルをチェックアウトするだけです。

git checkout --conflict=merge file

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

git reset file
git checkout --conflict=merge file

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

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

28
Gingi

最も洗練された解決策は、この問題を最初から防ぐことです。
git config --global mergetool.[tool].cmd [command-line call]
git config --global mergetool.[tool].trustExitCode false

7

私の知る限りでは、 ファイルに競合マーカーが含まれている間は、コミットできません。...これは正確には真実ではありません:
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が再度呼び出されないようにします

2
VonC

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

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

0

@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を終了した後にコミットしなかったことに注意してください。

0