Разрешите конфликты слияния Git в пользу их изменений во время вытягивания
Как разрешить конфликт слияния git в пользу вытянутых изменений?
в основном мне нужно удалить все конфликтующие изменения из рабочего дерева без необходимости проходить через все конфликты с git mergetool при сохранении всех бесконфликтных изменений. Желательно делать это во время вытягивания, а не после.
8 ответов:
вы можете использовать рекурсивную стратегию" их"опции:
git merge --strategy-option theirsС человек:
ours This option forces conflicting hunks to be auto-resolved cleanly by favoring our version. Changes from the other tree that do not conflict with our side are reflected to the merge result. This should not be confused with the ours merge strategy, which does not even look at what the other tree contains at all. It discards everything the other tree did, declaring our history contains all that happened in it. theirs This is opposite of ours.Примечание: как говорится в справочной странице," наши " сливаются опционы сильно отличается от "нашего" слияния стратегия.
git pull -s recursive -X theirs <remoterepo or other repo>или, просто, для репозитория по умолчанию:
git pull -X theirsесли вы уже находитесь в конфликтном состоянии...
git checkout --theirs path/to/file
Если вы уже находитесь в конфликтном состоянии, и вы хотите просто принять все из них:
git checkout --theirs . git add .Если вы хотите сделать наоборот:
git checkout --ours . git add .Это достаточно резко, поэтому убедитесь, что вы действительно хотите стереть все, как это раньше делал он.
Итак, представьте себе сценарий, в котором я только что был:
вы пытаетесь
merge, илиcherry-pick, и вы остановились с$ git cherry-pick 1023e24 error: could not apply 1023e24... [Commit Message] hint: after resolving the conflicts, mark the corrected paths hint: with 'git add <paths>' or 'git rm <paths>' hint: and commit the result with 'git commit'теперь вы просматриваете конфликтный файл, и вы действительно не хотите сохранять свои изменения. В моем случае файл был конфликт на просто символ моей среде IDE автоматически добавлен. Чтобы отменить изменения и принять их, самый простой способ:
git checkout --theirs path/to/the/conflicted_file.php git add path/to/the/conflicted_file.phpобратное этому (чтобы перезаписать входящую версию с вашей версией) это
git checkout --ours path/to/the/conflicted_file.php git add path/to/the/conflicted_file.phpУдивительно, но я не мог найти этот ответ очень легко в Сети.
для разрешения всех конфликтов с версией в конкретной ветке:
git diff --name-only --diff-filter=U | xargs git checkout ${branchName}Итак, если вы уже находитесь в состоянии слияния, и вы хотите сохранить основную версию конфликтующих файлов:
git diff --name-only --diff-filter=U | xargs git checkout master
The
git pull -X theirsответы могут создать уродливую фиксацию слияния или выдатьошибка: локальные изменения в следующие файлы будут переписаны путем слияния:
если вы хотите просто игнорировать любые локальные изменения файлов из РЕПО, например на клиенте, который всегда должен быть зеркалом источника, запустите это (replace
masterс веткой вы хотите):git fetch && git reset --hard origin/masterкак это работает?
git fetchтутgit pullно без слияния. Тогдаgit reset --hardделает ваше рабочее дерево соответствующим последней фиксации. Все ваши локальные изменения файлов в репо будут отбрасываются, но новые локальные файлы будут оставлены в покое.
пожалуйста, не то, что иногда это будет не работает:
git checkout --ours path/to / file
или
git checkout --их путь/к / файлу
Я сделал это вместо этого, предполагая, что голова наша и MERGE_HEAD-это их
git checkout HEAD -- path/to/fileили:
git checkout MERGE_HEAD -- path/to/fileпосле того, как мы сделаем это, и мы хороши:
git add .Если вы хотите понять Подробнее смотрите замечательный пост торека здесь : git checkout --ours не удаляет файлы из списка несвязанных файлов
от https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging
это будет в основном делать поддельные слияния. Он будет записывать новую фиксацию слияния с обеих ветвей как родители, но он даже не будет смотреть на ветку ты сливаешься с ним. Он будет просто записывать в результате слияния точный код в вашей текущей ветке.
$ git merge -s ours mundoслияние сделано по стратегии "наши".
$ git diff HEAD HEAD~вы можете увидеть, что нет никакой разницы между веткой, на которой мы были и результат слияния.
это часто может быть полезно в основном обмануть Git, думая, что a филиал уже объединен при выполнении слияния позже. Например, сказать вы разветвили ветку выпуска и сделали над ней некоторую работу, которая в какой-то момент Вы захотите слиться обратно в свою главную ветвь. В тем временем некоторые исправления на master должны быть возвращены в ваш отпустите ветку. Вы можете объединить исправление ветви в релизе отделения и слияния -с нашей же ветки в ветку master (даже если исправление уже есть) поэтому, когда вы позже объедините ветку снова, нет никаких конфликтов с исправление.
ситуация, которую я нашел полезной, если я хочу, чтобы мастер отражал изменения новой ветви темы. Я заметил, что-Xtheirs не сливается без конфликтов в некоторых обстоятельствах... например,
$ git merge -Xtheirs topicFoo CONFLICT (modify/delete): js/search.js deleted in HEAD and modified in topicFoo. Version topicFoo of js/search.js left in tree.в этом случае решение, которое я нашел, было
$ git checkout topicFooиз topicFoo, сначала слейте в master с помощью стратегии-s ours, это создаст поддельную фиксацию, которая является просто состоянием topicFoo. $ git merge - s our master
проверьте созданную фиксацию слияния
$ git logтеперь проверьте главную ветку
$ git checkout masterобъедините ветвь темы обратно, но на этот раз используйте рекурсивную стратегию-Xtheirs, теперь это представит вам главную ветвь с состоянием тема для разговора.
$ git merge -X theirs topicFoo
Comments