Как мне разрешить конфликт git merge в пользу внесенных изменений?
По сути, мне нужно удалить все конфликтующие изменения из рабочего дерева без необходимости проходить через все конфликты с git mergetool
сохранением всех бесконфликтных изменений. Желательно делать это во время вытягивания, а не после.
git
git-merge
git-merge-conflict
sanmai
источник
источник
Ответы:
Или просто для хранилища по умолчанию:
Если вы уже в конфликтном состоянии ...
источник
-s recursive
здесь избыточно, так как это стратегия слияния по умолчанию. Таким образом, вы можете упростить это доgit pull -X theirs
, что в основном эквивалентноgit pull --strategy-option theirs
.MERGING
состоянии. Я могу тогдаgit merge --abort
и попытаться снова, но каждый раз, когда я заканчиваю слиянием. … Я знаю, что ребаз был перенесен в мой апстрим, так что, может быть, это вызвало это?git checkout --theirs path/to/file
. Использовал его при ребазе и получил неожиданные результаты. Найдено объяснение в doc: обратите внимание, что во время git rebase и git pull --rebase наши и их могут показаться переставленными; --ours дает версию из ветки, на которую были перебазированы изменения, а --theirs дает версию из ветки, в которой хранится ваша работа, которая перебазируется.git checkout --theirs/--ours path
странице руководства говорится, что она работает для неотключенных путей . Таким образом, если в пути не было конфликта, он уже объединен, эта команда ничего не сделает. Это может вызвать проблемы, когда вы хотите, например, «их» версию целой подпапки. Так что в таком случае было бы безопаснее делатьgit checkout MERGE_HEAD path
или использовать хеш коммита.git pull -X theirs
создает коммит слияния, если есть конфликты (например, если другой коммиттер бежалgit push -f
к удаленному). Если вы не хотите коммитов слияния, запустите вместо этогоgit fetch && git reset --hard origin/master
.Вы можете использовать рекурсивную опцию "их" стратегии :
git merge --strategy-option theirs
От мужчины :
Примечание. Как сказано в справочной странице, опция «наша» стратегия слияния сильно отличается от «нашей» стратегии слияния .
источник
git checkout --theirs
для работы с одним конфликтующим файломgit checkout <ref to theirs> -- the/conflicted.file
; а потомgit add
их изменения.Если вы уже в конфликтном состоянии и хотите просто принять все их:
Если вы хотите сделать наоборот:
Это довольно радикально, поэтому убедитесь, что вы действительно хотите уничтожить все, как это, прежде чем делать это.
источник
.
и укажите файл (ы) вместо точки, которую вы хотите оформить. менее "радикально" и именно то, что вы хотите сделать, по-видимому.git add -u
Вместо этого используйте для пропуска файлов, которые не находятся под контролем версий.Хорошо, представьте сценарий, в котором я только что был:
Вы пытаетесь
merge
, или, может бытьcherry-pick
, и вы остановились сТеперь вы просматриваете конфликтующий файл и действительно не хотите сохранять свои изменения. В моем случае выше, файл конфликтовал только на новой строке, которая была автоматически добавлена в моей IDE. Чтобы отменить изменения и принять их, самый простой способ:
Обратное (перезаписать входящую версию вашей версией)
Удивительно, но я не мог найти этот ответ очень легко в сети.
источник
git status
междуcheckout
иadd
, файл по-прежнему отображается как «оба изменены».git reset --hard
и затемgit pull [remote server name] [branch name] -Xtheirs
(отменяет слияние, затем тянет новые вещи поверх моих вещей) - не уверен, что это то, что вы хотите.Эти
git pull -X theirs
ответы могут создать уродливое слияние совершить, или выдатьЕсли вы хотите просто игнорировать любые локальные изменения в файлах из репозитория, например, на клиенте, который всегда должен быть зеркалом источника, запустите это (замените нужную
master
ветку):Как это работает?
git fetch
делает ,git pull
но без слияния . Затемgit reset --hard
ваше рабочее дерево совпадает с последним коммитом. Все ваши локальные изменения файлов в репо будут отброшены , но новые локальные файлы будут оставлены в покое.источник
git fetch && git reset --hard {remote}/{branch}
это то, что решило мою проблему. Мне нужно было полностью отказаться от собственных изменений в пользу «их» состояния ветви, ноgit pull -X theirs
некоторые файлы были перемещены / переименованы. Спасибо!После git merge, если вы получаете конфликты и хотите либо свои, либо свои
источник
Чтобы разрешить все конфликты с версией в конкретной ветке:
Итак, если вы уже находитесь в состоянии слияния и хотите сохранить основную версию конфликтующих файлов:
источник
git cherry-pick --continue
или вgit commit --allow-empty
команде , чтобы совершить эти изменения, и , кажется , нет никакой системы , за которой требуется команда, которая делает автоматизации этого боль. В настоящее время я решаю эту проблему, проверяя наличие.git/COMMIT_EDITMSG
файла, но он кажется хакерским и хрупким, и я еще не уверен, что он всегда работает.git add
), то вы можете решить все остальное с помощью этого.git checkout --ours
/git checkout --theirs
тоже полезно.Пожалуйста, не то, что иногда это не будет работать :
или
Я сделал это вместо этого, предполагая, что HEAD наша, а MERGE_HEAD их
или:
После того как мы это сделаем и у нас все хорошо
Если вы хотите понять больше, посмотрите замечательный пост torek здесь: git checkout --ours не удаляет файлы из списка непогруженных файлов
источник
VS Code (интегрированный Git) IDE Пользователи:
Если вы хотите принять все входящие изменения в файле конфликта, выполните следующие действия.
Точно так же вы можете сделать для других опций, таких как Принять все оба, Принять все текущие и т. Д.,
источник
У меня была длинная
next-version
ветка с кучей удалений файлов, которые были измененыdevelop
, файлы, которые были добавлены в разных местах в обеих ветвях и т. Д.Я хотел взять все содержимое
next-version
веткиdevelop
, все в одном коммитте слияния.Комбинация вышеупомянутых команд, которые работали для меня, была:
Не новый ответ, просто объединение битов из многих ответов, отчасти, чтобы заверить, что вам могут понадобиться все эти ответы.
источник
Если вы уже находитесь в конфликтном состоянии и не хотите проверять путь один за другим. Вы можете попробовать
источник
Ситуация, которую я нашел полезной, если я хочу, чтобы master отражал изменения в новой ветке темы. Я заметил, что -Xtheirs не сливается без конфликтов в некоторых обстоятельствах ... например
В этом случае решение, которое я нашел, было
из topicFoo, первое слияние в master с использованием -s нашей стратегии, это создаст поддельный коммит, который является просто состоянием topicFoo. $ git merge - наш мастер
проверить созданный коммит слияния
сейчас оформляю мастер ветку
объедините ветку темы обратно, но на этот раз используйте рекурсивную стратегию -Xtheirs, теперь вы увидите главную ветку с состоянием topicFoo.
источник