Есть ли способ заставить Git пометить файл как конфликтующий? - PullRequest
37 голосов
/ 06 мая 2010

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

Ответы [ 6 ]

20 голосов
/ 07 мая 2010

Вы можете получить содержимое файла с маркерами конфликта, используя git checkout --conflict=merge -- file, но если вы очистили индекс с помощью git add file (или если GUI сделал это для вас), это не сработает.

Существует git update-index --unresolve, но он взломан и работает не очень надежно. Я думаю, что состояние, которое он восстанавливает, будет недостаточно для git-mergetool.

Возможно, вам придется повторить слияние или использовать git update-index --cacheinfo для ручной установки версии этапов ... git-stash может помочь вам сохранить правильно разрешенные конфликты.

18 голосов
/ 18 мая 2016

Если индекс уже находится в состоянии конфликта, просто извлеките файл с флагом --conflict=merge:

git checkout --conflict=merge file

Если индекс чистый, потому что неразрешенный файл был [ошибочно] добавлен, просто сбросьте его перед проверкой:

git reset file
git checkout --conflict=merge file

Это позволит вам возобновить разрешение конфликта в обычном режиме (например, git mergetool).

ПРИМЕЧАНИЕ : преобразование комментария к ответу @ jakub-narębski в его собственный ответ по запросу @fourpastmidnight. :)

6 голосов
/ 18 мая 2010

Самое элегантное решение было бы предотвратить эту проблему с самого начала:
git config --global mergetool.[tool].cmd [command-line call]<br> git config --global mergetool.[tool].trustExitCode false

2 голосов
/ 06 мая 2010

Насколько я знаю, вы не сможете зафиксировать, пока файл все еще содержит маркеры конфликта. ... что не совсем верно:
ОП упоминает, что вы можете (я копирую здесь его 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 экземпляра одного файла 1015 *

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

0 голосов
/ 18 января 2015

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

Начиная с git 1.7, он использует информацию разрешения-отмены из индекса, чтобы восстановить все 3 этапа (1: базовый, 2: наш, 3: их): https://github.com/git/git/commit/8aa38563b22c84b06ea1fff9638cc1f44fda726f

0 голосов
/ 07 мая 2010

@ 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.

...