Есть ли способ сделать git пометить файл как конфликтный?

можно зафиксировать файлы, содержащие данные конфликта. Есть ли способ пометить эти файлы как конфликтующие снова, чтобы запуск git mergetool генерировал необходимые файлы и запускал инструмент слияния?

6 ответов


вы можете получить содержимое файла с конфликтными маркерами, используя 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).

Примечание: продвижение комментария к ответу @jakub-narębski в свой собственный ответ по запросу от @fourpastmidnight. :)


самым элегантным решением было бы предотвратить эту проблему с самого начала:
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$

As Чарльз Бэйли комментарии, и иллюстрирует это так что ответ, mergetool запрашивается, потому что есть 3 экземпляра тот же файл индекс:

для несогласованного файла в конфликте 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 не будь снова позвонил.


@VonC: сначала я не создавал учетную запись (Теперь), поэтому я не мог опубликовать комментарий. Вызов git 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
>>>>>> 881d60f5f738bc5716f5c9a9384e262b535717fd:README
lynx:~/test_clone$ git mergetool
merge tool candidates:  opendiff emerge vimdiff
No files need merging
lynx:~/test_clone$

git mergetool может принимать имя файла, но это тоже не работает:

Auto-merged README
CONFLICT (content): Merge conflict in README
Automatic merge failed; fix conflicts and then commit the result.
caracal:~/test_clone2$ git mergetool
merge tool candidates:  opendiff emerge vimdiff
Merging the files: README

Normal merge conflict for 'README':
  {local}: modified
  {remote}: modified
Hit return to start merge resolution tool (emerge): 
caracal:~/test_clone2$ ls
#*merge*#145962bz#  README  README~  README.orig
caracal:~/test_clone2$ git mergetool
merge tool candidates:  opendiff emerge vimdiff
No files need merging
caracal:~/test_clone2$ git mergetool README
merge tool candidates:  opendiff emerge vimdiff

README: file does not need merging
caracal:~/test_clone2$ ls
#*merge*#145962bz#  README  README~  README.orig
caracal:~/test_clone2$ 

обратите внимание, что я не совершал после выхода из Git mergetool.


пожалуйста, используйте git update-index --unresolve

поскольку git 1.7 использует resolve-undo info из индекса для восстановления всех 3 этапов (1: base, 2:ours, 3: theirs):https://github.com/git/git/commit/8aa38563b22c84b06ea1fff9638cc1f44fda726f