Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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.