Есть ли способ заставить 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

Другие вопросы по тегам