Можно зафиксировать файлы, содержащие данные конфликта. Есть ли способ пометить эти файлы как конфликтующие снова, так что запуск git mergetool сгенерирует необходимые файлы и запустит инструмент слияния?
Есть ли способ сделать Git помечать файл как конфликтный?
Ответ 1
Вы можете получить содержимое файла с маркерами конфликтов, используя git checkout --conflict=merge -- file
, но если вы очистили индекс с помощью git add file
(или если GUI сделал это для вас), это не сработает.
Существует git update-index --unresolve
, но он взломан и не работает очень надежно. Я думаю, что состояние, которое он восстанавливает, будет недостаточно для git -mergetool.
Вам, вероятно, придется повторить слияние или использовать git update-index --cacheinfo
для ручной установки этапов версии... git -stash может помочь вам сохранить правильно разрешенные конфликты.
Ответ 2
Если индекс уже находится в состоянии конфликта, просто проверьте файл с флагом --conflict=merge
:
git checkout --conflict=merge file
Если индекс чист, потому что неразрешенный файл был [ошибочно] добавлен, просто reset он перед его проверкой:
git reset file
git checkout --conflict=merge file
Это позволит вам нормально возобновить разрешение конфликтов (например, git mergetool
).
ПРИМЕЧАНИЕ. Продвижение комментария к @jakub-narębski в ответ на свой ответ по запросу от @fourpastmidnight.:)
Ответ 3
Наиболее элегантным решением было бы предотвратить эту проблему с самого начала: git config --global mergetool.[tool].cmd [command-line call]
git config --global mergetool.[tool].trustExitCode false
Ответ 4
Насколько я знаю, вы не сможете совершить, пока файл все еще содержит в нем маркеры конфликтов.... что не совсем верно:
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$
Как Чарльз Бейли комментирует и иллюстрирует в этом SO ответ, запрашивается mergetool потому что в индексе есть 3 экземпляра одного и того же файла:
Для несвязанного файла в конфликте git предоставляет доступную общую базу, локальную и удаленную версии файла в индексе. (Здесь они считываются для использования в трехстороннем инструменте 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
больше не вызываться.
Ответ 5
@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.
Ответ 6
Используйте git update-index --unresolve
Так как git 1.7, он использует информацию об устранении отмены из индекса для восстановления всех трех этапов (1: base, 2: ours, 3: theirs): https://github.com/git/git/commit/8aa38563b22c84b06ea1fff9638cc1f44fda726f