Есть ли способ сделать 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
насколько я знаю, вы не сможете совершить, пока файл все еще содержит маркеры конфликтов в нем.... что не совсем верно:
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$
As Чарльз Бэйли комментарии, и иллюстрирует это так что ответ, 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 не обнаруживает его, кажется:
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.
пожалуйста, используйте git update-index --unresolve
поскольку git 1.7 использует resolve-undo info из индекса для восстановления всех 3 этапов (1: base, 2:ours, 3: theirs):https://github.com/git/git/commit/8aa38563b22c84b06ea1fff9638cc1f44fda726f