Мне не нужен инструмент визуального слияния, а также я не хочу просматривать конфликтующий файл и вручную выбирать между HEAD (моим) и импортированным изменением (их). Большую часть времени я либо хочу все их изменения, либо все мои. Обычно это происходит потому, что мои изменения сделали его более быстрым и возвращаются ко мне через тягу, но могут быть слегка изменены в разных местах.
Есть ли инструмент командной строки, который избавится от маркеров конфликта и выберет все так или иначе, основываясь на моем выборе? Или набор команд git, которые я могу использовать для каждой из них.
# accept mine
alias am="some_sequence;of;commands"
alias at="some_other_sequence;of;commands"
Делать это довольно раздражает. Для «принять мое» я попытался:
randy@sabotage ~/linus $ git merge test-branch
Auto-merging Makefile
CONFLICT (content): Merge conflict in Makefile
Automatic merge failed; fix conflicts and then commit the result.
randy@sabotage ~/linus $ git checkout Makefile
error: path 'Makefile' is unmerged
andy@sabotage ~/linus $ git reset --hard HEAD Makefile
fatal: Cannot do hard reset with paths.
Как я должен избавиться от этих маркеров изменений?
Я могу сделать:
git reset HEAD Makefile; rm Makefile; git checkout Makefile
Но это кажется довольно круглым, должен быть лучший путь. И на данный момент, я не уверен, что Git даже думает, что слияние произошло, поэтому я не думаю, что это обязательно сработает.
Если идти в другую сторону, делать «принять их» одинаково грязно. Единственный способ понять это - сделать:
git show test-branch:Makefile > Makefile; git add Makefile;
Это также дает мне испорченное сообщение о коммите, в котором дважды есть Conflicts: Makefile.
Может кто-нибудь указать, как сделать два вышеуказанных действия более простым способом? Спасибо
Ответы:
Решение очень простое.
git checkout <filename>
пытается извлечь файл из индекса , и поэтому происходит сбой при слиянии.Что вам нужно сделать, это (т.е. проверить коммит ):
Чтобы оформить заказ, вы можете воспользоваться одним из следующих вариантов:
или
или
Чтобы оформить заказ на другую версию, вы можете использовать один из:
или
или
Вам также необходимо запустить «добавить», чтобы пометить его как решенный:
источник
--ours
и--theirs
означает точно противоположное тому , что я интуитивно думал, пытаясь эту команду ...git show
- это пропускает нормализацию новой строки.--
используется Git для отделения ревизий (имен веток и т. Д.) От путей (имен файлов, каталогов). Важно, если Git не может решить, является ли имя именем ветви или именем файла. Это следует соглашению POSIX (или GNU) об использовании двойной черты для отделения параметров от аргументов (имен файлов).theirs
/ours
может оказаться местами , если вы разрешение конфликтов в контексте операции перебазирования. Поскольку rebase работает, проверяя целевую ветвь, тогда вишневый сбор фиксирует из «вашей» ветви в целевую, входящее изменение («их») происходит из «вашей» ветви, а текущая ветвь является целевой ветвью («наша»). ).Попробуй это:
Чтобы принять их изменения:
git merge --strategy-option theirs
Чтобы принять ваше:
git merge --strategy-option ours
источник
Основываясь на ответе Якуба, вы можете для удобства настроить следующие псевдонимы git:
При желании они выбирают один или несколько путей к файлам и по умолчанию разрешают все в текущем каталоге, если они не указаны.
Добавьте их в свой
[alias]
раздел~/.gitconfig
или запуститеисточник
[alias]
раздел~.gitconfig
или используйтеgit config --global accept-ours "..."
. Отредактировал мой ответ.~/.gitconfig
.!f() { git checkout --ours -- "${@:-.}" git add -u "${@:-.}; }; f
Основываясь на ответе Кинана, вот те же псевдонимы, модифицированные так, чтобы они могли обрабатывать пробелы и начальные тире в именах файлов:
источник
Идеальная ситуация для разрешения конфликтов - это когда вы заранее знаете, каким образом вы хотите их разрешить, и можете передать параметры стратегии рекурсивного
-Xours
или-Xtheirs
слияния. За пределами этого я вижу три сценарных:Для решения этих трех сценариев вы можете добавить следующие строки в ваш
.gitconfig
файл (или эквивалентный):get(ours|theirs)
Инструмент просто хранит соответствующую версию файла и отбрасывает все изменения от другой версии (так не слияние не происходит).merge(ours|theirs)
Инструмент повторно выполняет три способа слияния с местной, базы и удаленные версии файла, выбирая для разрешения конфликтов в данном направлении. Это имеет некоторые оговорки, в частности: он игнорирует параметры diff, которые были переданы команде слияния (например, алгоритм и обработка пробелов); выполняет слияние чисто из исходных файлов (поэтому любые ручные изменения в файле отбрасываются, что может быть как хорошим, так и плохим); и имеет то преимущество, что его нельзя спутать с маркерами diff, которые должны быть в файле.keep(ours|theirs)
Инструмент просто редактирует из маркеров Diff и закрытые секции, их обнаружения с помощью регулярного выражения. Преимущество этого в том, что он сохраняет параметры diff из команды merge и позволяет вручную разрешать некоторые конфликты, а затем автоматически разрешать остальные. Недостатком является то, что если в файле есть другие маркеры конфликта, это может привести к путанице.Все они используются при запуске
git mergetool -t (get|merge|keep)(ours|theirs) [<filename>]
где, если<filename>
не предоставлено, он обрабатывает все конфликтующие файлы.Вообще говоря, если вы знаете, что нет никаких различий, которые могли бы спутать регулярное выражение,
keep*
варианты команды являются наиболее мощными. Если вы оставитеmergetool.keepBackup
параметр unset или true, то после слияния вы можете сравнить*.orig
файл с результатом слияния, чтобы убедиться, что он имеет смысл. В качестве примера, я запускаю следующее послеmergetool
проверки, чтобы проверить изменения перед фиксацией:Примечание : если
merge.conflictstyle
нет,diff3
то/^|||||||/
шаблон вsed
правиле должен быть/^=======/
вместо этого.источник