Есть ли способ заставить 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
Насколько я знаю, вы не сможете зафиксировать, пока файл все еще содержит маркеры конфликта. ... что не совсем верно:
ОП упоминает, что вы можете (я копирую здесь его 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$
Как комментирует и иллюстрирует в этом ответе CB Bailey, 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 не обнаруживает его, кажется:
Авто-объединенный README КОНФЛИКТ (содержание): конфликт слияния в README Автоматическое объединение не выполнено; исправить конфликты, а затем зафиксировать результат. рысь:~/test_clone$ ls ПРОЧТИ МЕНЯ lynx:~/test_clone$ git add README lynx:~/test_clone$ git commit -a Создано commit 46ee062: Это работает! рысь:~/test_clone$ ls ПРОЧТИ МЕНЯ lynx:~/test_clone$ cat README >>>>>> 881d60f5f738bc5716f5c9a9384e262b535717fd:README lynx:~/test_clone$ git mergetool Кандидаты в инструмент слияния: opendiff emerge vimdiff Нет необходимости объединять файлы рысь: ~ / test_clone $
git mergetool может принять имя файла, но это тоже не работает:
Авто-объединенный README КОНФЛИКТ (содержание): конфликт слияния в README Автоматическое объединение не выполнено; исправить конфликты, а затем зафиксировать результат. caracal:~/test_clone2$ git mergetool Кандидаты в инструмент слияния: opendiff emerge vimdiff Объединение файлов: README Нормальный конфликт слияния для 'README': {local}: модифицировано {remote}: изменено Нажмите возврат, чтобы начать инструмент разрешения слияния (emerge): каракал:~/test_clone2$ ls #*merge*#145962bz# README README~ README.orig caracal:~/test_clone2$ git mergetool кандидаты на инструмент слияния: 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.
Пожалуйста, используйте git update-index --unresolve
Начиная с git 1.7 он использует информацию разрешения-отмены из индекса, чтобы восстановить все 3 этапа (1: базовый, 2: наш, 3: их): https://github.com/git/git/commit/8aa38563b22c84b06ea1fff9638cc1f44fda726f