Разрешите конфликты слияния Git в пользу их изменений во время вытягивания



Как разрешить конфликт слияния git в пользу вытянутых изменений?



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

1248   8  

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

    Ничего не найдено.